编码器输出的A向脉冲接到单片机的外部中断INT0,B向脉冲接到I/O端口P1.0。当系统工作时,首先要把INT0设置成下降沿触发,并开相应中断。当有有效脉冲触发中断时,进行中断处理程序,判别B脉冲是高电平还是低电平,若是高电平则编码器正转,加1计数;
若是低电平则编码器反转,减1计数。
基于51单片机的直流电机PID闭环调速系统原理详解与程序
(2013-08-04 01:18:15)
转载标签: 51单片机 直流电机 pid pcf8591
▼
分类:单片机
基于51单片机的直流电机PID闭环调速系统
1.电机转速反馈:
原理:利用光电编码器作为转速的反馈元件,设电机转一周光电编码器
发送N个PWM波形,利用测周法测量电机转速。
具体实现:将定时器0设置在计数模式,用来统计一定的时间T内接受到
的脉冲个数M个,而定时器0置在计时模式,用来计时T时间。则如果T时间接受到M个PWM波形,而电机转一圈发出N个PWM波形,则根据测周法原理,电机的实际的转速为:real_speed=M/(N*T),单位转/秒。若将定时器1置在计数模式,则PWM波形应该由P3^3脚输入。
代码实现:
//定时器0初始化,用来定时10ms
void Init_Timer0(void) {
TMOD |= 0x01; //使用模式1,16位定时器 ,且工作在计时模式 TH0=(65536-10000)/256; //定时10ms TL0=(65536-10000)%6; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 }
// 计数器1初始化,用来统计定时器1计时250ms内PWM波形个数 void Init_Timer1(void) {
TMOD |= 0x50; //使用计数模式1,16位计数器模式 TH1=0x00; //给定初值,由0往上计数 TL1=0x00;
EA=1; //总中断打开 ET1=1; //定时器中断打开 TR1=1; //定时器开关打开 }
//定时器0的中断服务子函数,主要完成脉冲个数的读取,实际转速的计算和PID控制以及控制结 //果输出等工作
void Timer0_isr(void) interrupt 1 {
unsigned char count;
TH0=(65536-10000)/256; //重新赋值 10ms TL0=(65536-10000)%6;
count++;
if (count==25) //如果达到250ms,则计算一次转速并进行一次控制运算 {
count=0;//清零以便于定时下一个250ms TR1=0;//关闭定时器1,统计脉冲个数
real_speed=(256*TH1+TL1)*4/N;//250ms内脉冲个数并由此计算转速 TH1=0x00; //计数器1清零,重新开始计数 TL1=0x00; TR1=1;
OUT=contr_PID();//进入PID控制 ,PID控制子函数代码在后面给出
write_add(0x40,OUT);//进行DA转换,将数字量转换为模拟量,后面会介绍到 } }
2.PID控制:
PID的基本原理在这里不作具体讲解,这里主要给出PID算法的实现,通过调节结构体中比例常数(Proportion)、积分常数(Integral)、微分常数( Derivative)使得转速控制达到想要的精度。
试凑法:注意这里参数调节采用实验凑试法,试凑法也有其规律,下面
做出讲解:
实验凑试法是通过闭环运行或模拟,观察系统的输出结果,然后根据各参数对系统的影响,反复凑试参数,直至出现满意的响应,从而确定PID控制参数。
实验凑试法的整定步骤为\先比例,再积分,最后微分\。 (1)整定比例控制
将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线。