单片机加pid算法去控制步进电机的具体措施或方法.docx_第1页
单片机加pid算法去控制步进电机的具体措施或方法.docx_第2页
单片机加pid算法去控制步进电机的具体措施或方法.docx_第3页
单片机加pid算法去控制步进电机的具体措施或方法.docx_第4页
单片机加pid算法去控制步进电机的具体措施或方法.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机加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(GPIO):给定左轮方向.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的值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; /微分系数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(); interrupt_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=TL0 else lyn=-(vl2*256+vl1); /dlf=1表示是向后退,速度应该为负值 len=ol-lyn; /误差=给定速度-反馈速度(取样周期内的方波数) if(abs(len)255) lun=255; /正速度 if(lun-255) lun=-255; /负速度 if(lun=0) vls=0; PCA0CPH0=lun; /*右轮PID调节*/ if(drf=0) ryn=(vr2*256+vr1); /drf是右轮反馈方向,0表示向前 vl=TL0 else ryn=-(vr2*256+vr1); /dlf=1表示是向后退,速度应该为负值 ren=or-ryn; /误差=给定速度-反馈速度(取样周期内的方波数) if(abs(ren)255) run=255; /正速度 if(run-255) run=-255; /负速度 if(run=0) vrs=0; PCA0CPH1=run; /因为这里的PCA0CPH0越大,对应的电机速度越小,所以要255来减一下 void pio_init(void) XBR0=0x00; /0000 0001 XBR1=0x72; /0111 0010 时能弱上拉 T0T1连接到脚口P06、P07 CEX0、CEX1连接到脚口P00、P01 P0MDIN=0xff; /模拟(0);数字(1) 1111 0011 P0MDOUT=0xc3;/开漏(0);推挽(1) 1111 1111 P0SKIP=0x3c; /0011 1100 P1MDIN=0xff; /1111 1111 P1MDOUT=0xfc;/ P1SKIP=0x00; /1111 1111 void sys_init(void) /12MHz OSCICL=0x43; OSCICN=0xc2; CLKSEL=0x00;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; /用于采集左轮的速度 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、1 vl1=TL0; /取左轮速度值 vl2=TH0; vr1=TL1; /取右轮速度值 vr2=TH1; TH1=0x00; TL1=0x00; TH0=0x00; TL0=0x00; PID(); /PID处理 TMR3CN &=0x80; /清中断标志位 TCON |=0x50; /重新开计数器0、1 EA=1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论