车模相关程序.doc

上传人:pu****.1 文档编号:562075234 上传时间:2023-03-10 格式:DOC 页数:11 大小:60KB
返回 下载 相关 举报
车模相关程序.doc_第1页
第1页 / 共11页
车模相关程序.doc_第2页
第2页 / 共11页
车模相关程序.doc_第3页
第3页 / 共11页
车模相关程序.doc_第4页
第4页 / 共11页
车模相关程序.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《车模相关程序.doc》由会员分享,可在线阅读,更多相关《车模相关程序.doc(11页珍藏版)》请在金锄头文库上搜索。

1、#include /* common defines and macros */#include /* derivative information /引用头文件,通过该头文件将单片机的各寄存器转换为相对应的C语言的变量名 */#pragma LINK_INFO DERIVATIVE mc9s12dg128b #define mid_direction 147 /设置舵机中间位置的占空比#define right_direction 0 /设置直线路程时的相对中间位置的变化量#define micro_direction 12 /设置转小弯时舵机相对中间位置的变化量#define deep_d

2、irection 19 /设置转大弯时舵机相对中间位置的变化量#define emergence_direction 22 /设置紧急情况时舵机转向#define direct_speed 14 /设置直线时输出到电机的占空比从而控制电机转速#define micro_speed 13 /设置小弯时电机转速#define deep_speed 11 /设置大弯时电机转速#define emergence_speed 10 /设置紧急情况时电机转速#define inter 5#define inter1 500 /通过设置该参数数值来调节每次采集轮速传感的脉冲时间#define speed_k

3、eep 0.4 /为轮速的比例因子,因使用效果不好最后取消使用#define speed_kd 0.1#define kp 0.5/#define kd 1.3 /下列的全局变量的设定,是为了在小车冲出赛道后仍能记住返回而设int turn_symbol; /转向标志,在信号分析程序中设置1时为向右转为-1时向左转float memory_direction; /记忆上次转向unsigned char signal;int error; /定义转向本次与中间位置的偏差int last_error; /定义上次转向与中间位置的偏差int mem_error; /记忆上次转向偏差int speed

4、;int speed1;float kd;float speed_error;float speed_last_error;int speed_back; /轮速反回脉冲数int stop_symbol; /停车标志int flag; void PLL_init(void) / 系统时钟的初始化,因当时摸索欠考虑,时钟初始化比较乱,需要改进CLKSEL_PLLSEL=0; /选定外部时钟,为1时选择锁相环时钟 时钟选择寄存器初始化 CLKSEL=0 ; /选择外部晶振为时钟源PLLCTL_PLLON=0; /锁相环电路禁止;PLLCTL_PRE=1; /实时中断允许PLLCTL_PCE=1;

5、/允许看门狗PLLCTL_AUTO=1; /选择高频宽带控制PLLCTL_SCME=1; /探测到外部时钟失效时产生自给时钟信号SYNR=8; /时钟合成寄存器初始化REFDV=0X07; /时钟分频寄存器初始化 与上句为做实验时确定的参数与理论参数有差距,可重新设置/CLKSEL_PLLSEL=1 ; /选定锁相环时钟 此句被注解掉PLLCTL_CME=1; /时钟监控允许 锁相环控制寄存器初始化PLLCTL_PLLON=1; while(!CRGFLG_LOCK);/循环直到该位为1即时钟频率已稳定,CLKSEL_PLLSEL=1; /选定锁相环时钟void PORTAB_init(voi

6、d) /信号输入输出口的设置,较简单DDRA=0X00; /设置A口输入 DDR寄存器置0为输入,置1为输出DDRB=0XFF;/设置B口为输出,作为信号指示PORTB=0X00;/初始化时设置为全亮,0亮1灭void PWM_init(void) /脉宽调制模块的初始化。参考中文PPT PWME=0; /关闭PWMPWMCNT01=0; /01通道被禁止PWMCTL_CON01=1; /01共同组成16位通道作为舵机的控制信号输入口 为1级联为0分开PWMCTL_CON45=0; /分别组成8位通道 分别为驱动电机的正反转的输入口PWMCTL_PSWAI=1; /不准许等待模式下分频时钟禁止

7、运行PWMCTL_PFRZ=1; /不准许冷结模式下PWM波形输出PWMPOL=0X03; /对应通道脉冲起始位为高电平 极性为1PWMCLK=0X33; /01、45分频PWMPRCLK=0X03; /A_CLOCK=BUS_CLOCK/8=3MHZPWMSCLA=15; / 比例因子寄存器设置PWM寄存器的工作频率 SA_CLOCK=A_CLOCK/2*15=100KHZPWMCAE=0X00; /输出波形左对齐,否则中心对齐PWMDTY01=80; /初始化时可任意设置PWMPER01=2000; /设置PWM01通道频率100KHZ/2000=50HZPWMPER4=20; /设置PW

8、M4频率为5KHZPWMPER5=20;PWMDTY5=10;PWMDTY4=15; / 占空比为15:20初始化时可任意设置PWME=0X13; /使能PWMvoid MDC_init(void)/模数计数器初始化 参考英文PPT008 轮速传感时有用MCCTL_MCEN=0;/模数计数器禁止运行MCCTL=0XE2;/MCZI=1中断允许MOCMC=1自动赋与最后给定值ROMCL=1读计数器数 返回存储器值 否3位 MCEN=0,MCPR1=1MCPR0= 8倍分频MCCTL_MCEN=1;/模数计数器使能MCCNT=1118;/从3000开始向下计数(1/24M)*8*1118MCCTL

9、_FLMC=1; /此句为参考他人程序,强制讲寄存器的值写到模数计数器 void PACB_init() /输入捕捉 用于轮速传感 英文PPT008 TCTL4 = 0X02; /下降沿捕捉脉冲 PBCTL = 0x40; /级联两个8位累加器(PAC0和PAC1) ICPAR = 0X03; /使能累加器 PACN10 = 0X0000; /01口清零void TCNT_init() /主时钟自由计数器初始化设置,用于起步延时 TSCR1=0X80; TSCR2=0X07; /自由计数器128倍分频int signal_count(unsigned char signal) /采集信号的个数

10、unsigned char compare;/设置比较变量int i;int signal_num;compare=0X80;signal_num=0;for(i=0;ii)(7-i)signal_num+;return signal_num; /返回计算值void set_direction(float direction) /设置舵机转角if(direction168)direction=168; /限制舵机转角范围error=direction-mid_direction; / 以下为本次比赛的粗糙的PD算法,微分因子的数值确定是实验估计值,缺少理论的计算,是本次比赛小车不能完美表现的的

11、一个原因,由于积分算法没研究透,所以没采用 if(turn_symbol=1) /当转向标志为1时,此时向左转if(last_error-error)=(right_direction-micro_direction) /当上次偏差见减去本次偏差为副是表示小车有向外转的趋势,应加大微分因子,使小车大角度左转,迅速回到黑线中央 kd=0.5;else if(last_error-error)=micro_direction-right_direction) /当上次偏差减去本次偏差为正,表示小车已经渐渐从偏离位置回到中间位置,此时应减小微分因子,以避免过多转向一起的超调量,使小车尽快稳定下来,以

12、下的算法类似kd=0.2 ;else if(last_error-error)=(deep_direction-micro_direction)kd=0.3;else if(last_error-error)=(micro_direction-deep_direction) kd=0.7;else if(last_error-error)=(deep_direction-emergence_direction)kd=0;else if(last_error-error)=(emergence_direction-deep_direction)kd=0.4;if(turn_symbol=-1)i

13、f(last_error-error)=(right_direction-micro_direction) kd=0.2;else if(last_error-error)=micro_direction-right_direction)kd=0.5;else if(last_error-error)=(deep_direction-micro_direction)kd=0.7;else if(last_error-error)=(micro_direction-deep_direction) kd=0.3;else if(last_error-error)=(deep_direction-emergence_direction)kd=0.4;else if(last_error-error)=(emergence_direction-deep_direction)kd=0; direction=direction-turn_symbol*kd*(last_error-error); PWMDTY01=direction;mem_error=last_error; /记忆上次偏差last_error=error; /将即将

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

当前位置:首页 > 生活休闲 > 科普知识

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