基于PID控制的伺服电机加速减速控制,通过按键控制加速减速,启动停止,其中通过霍尔传感器测量速度后再通过pwm控制电机转速,并使用LCD1602显示实际转速,芯片使用AT89C51。C语言
时间: 2024-05-14 10:14:47 浏览: 125
代码如下:
```c
#include <reg51.h>
#include <stdio.h>
#include <lcd.h>
#define KP 10 // 比例常数
#define KI 0.2 // 积分常数
#define KD 0.1 // 微分常数
unsigned char speed, target_speed, error, last_error;
unsigned int integral, derivative;
bit start_flag = 0;
bit stop_flag = 1;
void timer0_init() // 定时器0初始化
{
TMOD |= 0x01; // 工作在模式1,16位定时器模式
TH0 = 0xB1; // 定时1ms
TL0 = 0xE0;
ET0 = 1; // 中断允许
TR0 = 1; // 启动定时器
}
void int0_init() // 外部中断0初始化,按键中断
{
IT0 = 1; // 下降沿触发
EX0 = 1; // 中断允许
EA = 1; // 总中断开关
}
void int0() interrupt 0 // 外部中断0服务程序
{
if (start_flag == 0) // 启动
{
start_flag = 1;
stop_flag = 0;
target_speed = 20; // 初始目标速度为20
}
else // 停止
{
start_flag = 0;
stop_flag = 1;
target_speed = 0;
speed = 0;
integral = 0;
}
}
void timer0() interrupt 1 // 定时器0服务程序
{
TH0 = 0xB1; // 定时1ms
TL0 = 0xE0;
if (stop_flag == 1) // 停止状态
{
P1 = 0x00; // 关闭电机
return;
}
if (speed < target_speed) // 加速
{
speed++;
P1 = speed; // 控制pwm信号
}
else if (speed > target_speed) // 减速
{
speed--;
P1 = speed;
}
error = target_speed - speed; // 计算误差
integral += error; // 累加误差
derivative = error - last_error; // 计算微分
P1 = speed + KP*error + KI*integral + KD*derivative; // PID控制
last_error = error; // 更新误差
}
void main()
{
timer0_init();
int0_init();
lcd_init();
while (1)
{
if (start_flag == 1) // 显示实际转速
{
lcd_show_string(0, 0, "Actual Speed:");
lcd_show_num(0, 1, speed, 3);
lcd_show_string(3, 1, "RPM");
}
if (stop_flag == 1) // 显示停止状态
{
lcd_clear();
lcd_show_string(0, 0, "Motor Stopped");
}
}
}
```
阅读全文