单片机加pid算法去控制步进电机的具体措施或方法

上传人:豆浆 文档编号:3906018 上传时间:2017-08-13 格式:DOCX 页数:8 大小:23.21KB
返回 下载 相关 举报
单片机加pid算法去控制步进电机的具体措施或方法_第1页
第1页 / 共8页
单片机加pid算法去控制步进电机的具体措施或方法_第2页
第2页 / 共8页
单片机加pid算法去控制步进电机的具体措施或方法_第3页
第3页 / 共8页
单片机加pid算法去控制步进电机的具体措施或方法_第4页
第4页 / 共8页
单片机加pid算法去控制步进电机的具体措施或方法_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《单片机加pid算法去控制步进电机的具体措施或方法》由会员分享,可在线阅读,更多相关《单片机加pid算法去控制步进电机的具体措施或方法(8页珍藏版)》请在金锄头文库上搜索。

1、单片机加 pid 算法去控制步进电机的具体措施或方法 2009-7-25 12:13 最佳答案 /P1.1(T0):Count They Distance/P0.4:Tx/P0.5:Rx#include /SFR declarations#include /Standard I/O definition file#include /Math library file#include #include unsigned int j,i;char a=0;unsigned int t=0;/sbit led=P02;/P0.0(PWM0):给定左轮速度.sbit vls=P04; /P0.4(GP

2、IO):给定左轮方向.sbit vlf=P06; /P0.6(T0) :反馈左轮速度.sbit dlf=P10; /P1.0(GPIO):反馈左轮方向./P0.2(PWM0):给定右轮速度.sbit vrs=P05; /P0.5(GPIO):给定右轮方向.sbit vrf=P07; /P0.7(T0) :反馈右轮速度.sbit drf=P11; /P1.1(GPIO):反馈右轮方向.int ol; /左轮给定值int len;int len_1,len_2;int lyn_1,lyn_2;int vl1,vl2; /反馈左轮速度值(取样周期内的方波数 )int lfz; /运算后赋给 PWM

3、的值int lyn,lynn;int lun=0,lun_1=0; /偏差校正值 即校正 PWM 输出int lunp,luni,lund; /PID 校正值int or; /右轮给定值int ren;int ren_1,ren_2;int ryn_1,ryn_2;int vr1,vr2; /反馈右轮速度值 (取样周期内的方波数)int rfz; /运算后赋给 PWM 的值int ryn,rynn;int run=0,run_1=0; /偏差校正值 即校正 PWM 输出int runp,runi,rund; /PID 校正值float kp=2.0; /比例系数 1.8float kd=0.2

4、; /微分系数 0.4float lki; /积分系数void pio_init(void);void sys_init(void);void t01_init(void);void TIME3_INT(void);void PID(void);void interrupt_init(void);void delay(unsigned int x);void pwm1_1(void);void main(void)PCA0MD &= 0x40; /关闭pio_init(); /P11 为测距输入端sys_init();t01_init();pwm1_1();TIME3_INT();interr

5、upt_init();vls=1;vrs=0;while(1)ol=50;or=50;delay(1000);ol=100;or=100;delay(1000);ol=-50;or=50;delay(1000);void PID(void) /*左轮 PID 调节*/if(dlf=1)lyn=(vl2*256+vl1); /dlf 是左轮反馈方向,0 表示向前 vl=TL0elselyn=-(vl2*256+vl1); /dlf=1 表示是向后退,速度应该为负值 len=ol-lyn; /误差=给定速度-反馈速度(取样周期内的方波数)if(abs(len)255)lun=255; /正速度 i

6、f(lun=0)vls=0;PCA0CPH0=lun;/*右轮 PID 调节*/if(drf=0)ryn=(vr2*256+vr1); /drf 是右轮反馈方向,0 表示向前 vl=TL0elseryn=-(vr2*256+vr1); /dlf=1 表示是向后退,速度应该为负值 ren=or-ryn; /误差= 给定速度 -反馈速度(取样周期内的方波数)if(abs(ren)255)run=255; /正速度 if(run=0)vrs=0;PCA0CPH1=run;/因为这里的 PCA0CPH0 越大,对应的电机速度越小,所以要 255 来减一下 void pio_init(void)XBR0

7、=0x00; /0000 0001 XBR1=0x72; /0111 0010 时能弱上拉 T0T1 连接到脚口 P06、P07 CEX0、CEX1 连接到脚口 P00、P01P0MDIN=0xff; /模拟(0);数字(1) 1111 0011P0MDOUT=0xc3;/开漏 (0);推挽(1) 1111 1111P0SKIP=0x3c; /0011 1100P1MDIN=0xff; /1111 1111P1MDOUT=0xfc;/P1SKIP=0x00; /1111 1111void sys_init(void) /12MHzOSCICL=0x43;OSCICN=0xc2;CLKSEL=0

8、x00;void pwm1_1(void) /PWM 的初始化PCA0MD=0x08; /PCA 时钟为 12 分频PCA0CPL0=200; /左轮PCA0CPM0=0x42; /设置左轮为 8 位 PWM 输出PCA0CPH0=200;PCA0CPL1=200; /平衡校正PCA0CPM1=0x42; /设置为 8 位 PWM 输出PCA0CPH1=200;PCA0CN=0x40; /允许 PCA 工作 void t01_init(void)TCON=0x50; /计数器 1、2 允许TMOD=0x55; /定时器 1、2 采用 16 位计数功能 CKCON=0x00;TH1=0x00;

9、/用于采集左轮的速度TL1=0x00;TH0=0x00; /用于采集右轮的速度TL0=0x00;void TIME3_INT(void)TMR3CN = 0x00; /定时器 3 为 16 位自动重载CKCON &= 0x40;TMR3RLL = 0xff;TMR3RLH = 0xd7;TMR3L = 0xff;TMR3H = 0xd7;TMR3CN |= 0x04;void T3_ISR() interrupt 14 /定时器 3 中断服务程序 /led=led;EA=0;TCON &=0x50; /关闭计数器 0、1vl1=TL0; /取左轮速度值vl2=TH0;vr1=TL1; /取右轮速度值vr2=TH1;TH1=0x00;TL1=0x00;TH0=0x00;TL0=0x00;PID(); /PID 处理TMR3CN &=0x80; /清中断标志位 TCON |=0x50; /重新开计数器 0、1EA=1;void interrupt_init(void) IE=0x80;IP=0x00; EIE1|=0x80;EIP1|=0x80;void delay(unsigned int m) /延时程序 for(i=0;i2000;i+)for(j=0;jm;j+)_nop_(); _nop_();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号