飞思科尔光电组程序.doc_第1页
飞思科尔光电组程序.doc_第2页
飞思科尔光电组程序.doc_第3页
飞思科尔光电组程序.doc_第4页
飞思科尔光电组程序.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

我是光电组的,下面是程序,小车可以跑起来,但速度有待提升#include /* common defines and macros */#include /* derivative information */#pragma LINK_INFO DERIVATIVE mc9s12xs128 /static unsigned char direction_turn12=888,1098,1208,1328,1481,1612,1730,1856,1988,2100,2222,2368;/Chapter 12/Periodic Interrupt Timer (S12PIT24B4CV1) Page349/The PIT module has no external pins./PIT 模式没有外部引脚/=unsigned char light=0; /激光管检测标志unsigned short turn_value=0; /转向的PWM数值unsigned short direction_turn7=333,430,560,647,705,780,888; /转向给定值初始化short speed_set7=250,300,350,400,350,300,250; /速度给定值short speed_flag=0; /速度档位标志位 short speed3=0,0,0; /速度检测函数short pulse_count=0; /编码器脉冲计数值short speed_expect=0; /理想速度short kp=2; /比例环节short ki=0; /积分环节short kd=1; /微分环节short ek1=0; /误差1short ek2=0; /误差2short ek3=0; /误差3short speed_add=0; /速度增量/=void PLL_Init() /时钟初始化 REFDV=0x81; /* PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)*/ SYNR=2; /* 锁相环时钟=2*16*(2+1)/(1+1)=48MHZ */ while(!(CRGFLG&0x08); /* 总线时钟=48/2=24MHZ */ CLKSEL=0x80; void PWM_Init() /PWM初始化 PWME=0x00; /关闭PWM使能 PWMPRCLK=0x66; /A,B时钟均为总线的64分频,375KHZ /PWMSCLA=0x01; /clockSA=clockA/(2*PWMSCLA) = 1500KHZ /PWMSCLB=0X01; /clockSB=clockB/(2*PWMSCLB) =1500KHZ PWMCLK=0x00; PWMPOL=0xFF; /PWM输出起始电平为高电平 PWMCAE=0x00; /输出左对齐 PWMCTL=0xf0; /通道01,23,45,67级联 PWMPER01=5999; /舵机频率为62.5Hz PWMDTY01=647; /占空比a=(PWMDTY01+1)/(PWMPER01+1) PWMPER23=1000; /PWM通道3周期为375HZ PWMDTY23=0; /占空比a=(PWMDTY01+1)/(PWMPER01+1)占空比50% 150 PWMPER45=1000; /PWM通道5周期为0.10ms 10KZH 300=0.00010/(1/3000000) PWMDTY45=300; /占空比a=(PWMDTY01+1)/(PWMPER01+1) PWMPER67=375; /频率为1000Hz PWMDTY67=200; / PWME=0xff; /使能pwm void Pit0_Init() /PIT初始化 PITCFLMT_PITE=0; /关PIT使能 PITCE_PCE0=1; /通道0使能 PITMUX_PMUX0=0; /通道0接微时钟0 PITMTLD0=99; /微时钟0值设置为7f PITLD0=3839; /time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS. /时间计算 100*3840/24000000=0.016s PITINTE_PINTE0=1; /通道0中断时能 PITCFLMT_PITE=1; /PIT使能 void ECT_Init() TIOS=0x00; /* OC0路为输出比较,OC1路为输入捕捉 */ TSCR2=0x06; /* 定时器溢出中断禁止,计数器自由运行禁止复位,64分频 */ TSCR1=0x80; /* 定时器使能 */ TIE=0x01; /* 输出比较相应中断使能 */ TCTL4=0x01; void dly_1ms() int i,j; for(i=0;i200;i+) for(j=0;j1000;j+); void sam_position() /车位检测函数 int i=0,j=0; unsigned char m=0,n=0; n=PORTA; for(i;i6) light=n; void check_start() /检测起始线 if(light&4)|(light&16) start_flag+; void check_start() void turning() /舵机转向函数 switch(light) case 1:if(turn_value=direction_turn1) /出界判断算法 turn_value=direction_turn0; speed_expect=speed_set0; else if(turn_value=direction_turn0) turn_value=direction_turn0; speed_expect=speed_set0; break; case 2:if(turn_value=direction_turn0) turn_value=direction_turn1; speed_expect=speed_set1; else if(turn_value=direction_turn1) turn_value=direction_turn1; speed_expect=speed_set1; else if(turn_value=direction_turn2) turn_value=direction_turn1; speed_expect=speed_set1; break; case 4:if(turn_value=direction_turn1) turn_value=direction_turn2; speed_expect=speed_set2; else if(turn_value=direction_turn2) turn_value=direction_turn2; speed_expect=speed_set2; else if(turn_value=direction_turn3) turn_value=direction_turn2; speed_expect=speed_set2; break; case 8:if(turn_value=direction_turn2) turn_value=direction_turn3; speed_expect=speed_set3; else if(turn_value=direction_turn3) turn_value=direction_turn3; speed_expect=speed_set3; else if(turn_value=direction_turn4) turn_value=direction_turn3; speed_expect=speed_set3; break; case 16:if(turn_value=direction_turn3) turn_value=direction_turn4; speed_expect=speed_set4; else if(turn_value=direction_turn4) turn_value=direction_turn4; speed_expect=speed_set4; else if(turn_value=direction_turn5) turn_value=direction_turn4; speed_expect=speed_set4; break; case 32:if(turn_value=direction_turn4) turn_value=direction_turn5; speed_expect=speed_set5; else if(turn_value=direction_turn5) turn_value=direction_turn5; speed_expect=speed_set5; else if(turn_value=direction_turn6) turn_value=direction_turn5; speed_expect=speed_set5; break; case 64:if(turn_value=direction_turn5) /出界判断算法 turn_value=direction_turn6; speed_expect=speed_set6; else if(turn_value=direction_turn6) turn_value=direction_turn6; speed_expect=speed_set6; break; default:break; PWMDTY01=turn_value; void check_speed() /速度检测函数 ek3=ek2; /计算速度差值 ek2=ek1; ek1=speed_expect-pulse_count; speed2=speed1; /当前速度放在0,之前放在1,2 speed1=speed0; speed0=pulse_count; pulse_count=0; void speed_down() /制动函数 PWMDTY23=300; /电机反向供电 PWMDTY45=0; void speed_pid() /PID算法 speed_add=kp*(ek1-ek2)+ki*ek1+kd*(ek1-2*ek2+ek3); /PID增量式 void driver() /驱动电机控制函数 /if(turn_value705)|(turn_value200) /当前速度若远超给定速度 / /speed_down(); / /else / PWMDTY23=0; speed_pid(); PWMDTY45=PWMDTY45+speed_add; / if(PWMDTY45600) PWMDTY45=600; void main() DisableInterrupts; /* 关中断 */ PLL_Init(); PWM_Init(); Pit0_Init(); ECT_Init(); turn_value=direction_turn3; DDRA=0x00; DDRB=0xFF; PORTB=0X00; EnableInterrupts; for(;) /sam_position(); /turning(); #pragma C

温馨提示

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

评论

0/150

提交评论