《2023年-全国大学生机器人搬运比赛部分程序aw.docx》由会员分享,可在线阅读,更多相关《2023年-全国大学生机器人搬运比赛部分程序aw.docx(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、/-图2机器人出发区示意图4PWM_Set(TPM_NUM_2, TPM1_CH_O, speed-40);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed);IN1=1;IN2=0;IN3=1;IN4=0;DelayMs(2);)此段为旋转大左转程序程序启动void Eleft(uint8 speed) (PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed-20);IN1 = 1;IN2=0;IN3=0;IN4=1;DelayMs(2);此段为旋转右转启动程序void righ
2、t(uint8 speed)(PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed);IN1 = 1;IN2=0;IN3=1;IN4=0;DelayMs(2);)此段为旋转大右转启动程序void Eright(uint8 speed)(PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed);IN 1=0;IN2=1;IN3=1;IN4=0;DelayMs(2);)/此段为后退直走序程序启动void back_fa
3、ward(uint8 speed)PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2, TPM1_CH_1 , speed+4);已经调整好的参数占空比百分之78IN 1=0;IN2=1;IN3=0;IN4=1;DelayMs(2);)/此段为旋转左转程序程序启动void backleft(uint8 speed) (PWM_Set(TPM_NUM_2, TPM1_CH_O, speed-40);PWM_Set(TPM_NUM_2, TPM 1 _CH_ 1 , speed);IN 1=0;IN2=1;IN3=0;IN4=1;Delay
4、Ms(2);)/此段为旋转大左转程序程序启动void backEleft(uint8 speed)(PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed);IN 1=0;IN2=1;IN3=1;IN4=0;DelayMs(2);)此段为旋转右转启动程序void backright(uint8 speed)PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed);IN 1=0;IN2=1;IN3=0;IN4=1;De
5、layMs(2);)此段为旋转大右转启动程序void backEright(uint8 speed)PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2,TPMl_CH_l , speed);IN1 = 1;IN2=0;IN3=0;IN4=1;DelayMs(2);/此段为停止启动程序 void stop(uint8 speed)(PWM_Set(TPM_NUM_2, TPM1_CH_O, speed);PWM_Set(TPM_NUM_2, TPM1_CH_1 , speed);IN 1=0;IN2=0;IN3=0;IN4=0;DeIay
6、Ms(2);)/*函数名:xunji_backward_3*功能:后退五路循迹参数:无*返回:无*说 明:1、执行该循迹程序时在不断地设置定时器PWM模块;/2、使用时要注意一定要每隔一段时间执行此程序一次(两者是缺一不可的),才能达到循迹的功能。*/*void xunji_backward_3()五路循迹switch(sensor_inp_backward()(中间的灯碰到黑线直走case 0x04: back_faward(80);break;case 0x02: backEleft(80);break;case 0x03: backleft(80);break;case 0x08: ba
7、ckEright(80);break;case 0x18: backright(80);break;default: back_faward(80);break; )void xunji_forward_5()switch(sensor_inp_forward()case 0x04: middle_faward(80);break;case 0x02: Eleft(80);break;case 0x01 : Eleft(80);break;case 0x03: left(80);break;case 0x08: Eright(80);break;Eright(80);break;case 0x
8、18: right(80);break;default: middle_faward(80);break;)其他的灯的情况直走五路循迹中间的灯碰到黑线直走右边的灯碰到黑线右转左边的灯碰到黑线左转其他的灯的情况直走/*/函数名:xunji_forward_3*功能:三路循迹参数:无*返回:无*说 明:1、执行该循迹程序时在不断地设置定时器PWM模块;/2、使用时要注意一定要每隔一段时间执行此程序一次(两者是缺一不可的),才能达到循迹的功能。*void xunji_forward_3()三路循迹switch(sensor_inp_forward()(case 0x04: middle_faward
9、(80);break;case 0x02: Eright(80);break;case 0x03: right(80);break;case 0x08: Eleft(80);break;case 0x18: left(80);break;default: middle_faward(80);break;中间的灯碰到黑线直走右边的灯碰到黑线右转左边的灯碰到黑线左转其他的灯的情况直走/*)/*函数名:black_num功能:进行计数参数:se=O输出为传感器全黑计数,num_blackse=l输出右边传感器计数,num_right/ se=2输出对左边传感器计数,numeft返回:见参数说 明:程
10、序每隔一段要进入这一段函数,才能计数,还有计数值会一直保留,进行清零/想清除的时候可以对num_black,numeft,num_right*/*uint8 black_num(uint8 se) (if(se=O) (if(sensor_inp_forward()=Ox 1 f)( flag_black=l;) else if(flag_black=l)num black+;flag_black=O; )return num_black; )if(se=l) (if(COUNT_RIGHT= 1) ( flag_right=l;) elseif(flag_right=l)num_right+
11、4-;flag_right=O;)return num_right;if(se=2)if(COUNT_LEFT=l) (flag_left=l;)else if(flag_left=l) num left+;flag_left=O;)return num_left;/*函数名:turneft*功 能:到十字路口进行左转弯的程序参 数:shu表示转弯时记黑线数,没到黑线的下降沿就计数 *返回:无*说 明:该程序执行一次就可以,也就是说程序执行一遍就相当于转弯完成,后面就跳出程序了*/执行*void tum_left(unsigned char shu l) (middle_faward(80);
12、DelayMs(lOO);Eleft(8O);while(num_right=shu 1)num_right=black_num( 1);if(num_right=shu 1) num_right=O;DelayMs(lOO);)/*函数名:tum_right*功 能:到十字路口进行右转弯的程序参 数:shu表示转弯时记黑线数,没到黑线的下降沿就计数 *返回:无*说 明:该程序执行一次就可以,也就是说程序执行一遍就相当于转弯完成,后面就跳出程序了*/执行*void turn_right(unsigned char shu2)middle_faward(80);DelayMs(lOO);Erig
13、ht(70);while(num_left3)(D=ceju();xunj i_forward_5();)if(D=100) Duty=100;else if (Duty=0) Duty=0;j 二(Period / 100) * Duty;if(TPMNo = 1)/定时器1通道0数值寄存器TPMl_CHVH(CHNo)=(uint8)(j 8);TPM 1 _CH VL(CHNo)=(uint8)j;/机器人搬运比赛程序如下:项目名:基于Freescale AW60的/硬件连接: /程序描述:定时器2作为颜色传感器计数器;定时器1通道0-1作为PWM输出;通道2 作为颜色传感器的定时器溢出
14、中断超声波计数用定时器1/说/时间: 内容:?作者信息? /版本信息? /完成时间? 修订记录: /调用头文件#include nIncludes.hnvoid main(void)(定义变量,不管在主程序还是子函数,都需要把变量的定义放在最前面,否则会报错 int D=0;int m=0;char numl=0;用于计数用char num2=0;/用于 转弯计数用char flag_forward=l; 前进的标志位char flag_backward=l; 后 退的标志位用到的端口,一定要记得初始化端口数据方向寄存器液晶模块/PTGDD |= ObOOOUlll; 液晶模块10的输入输出配
15、置颜色传感器模块/PTCDD |= ObOOlOllOO; /配置颜色传感器模块/PTFDD &= OblllllllO;红外传感器模块及驱动模块PTDDD -ObOOOOOlll; PTDD4作为定时器2的外部时钟输入PTBDD = ObO 1000000;前五个是红外传感器,最后两个是超声波的发送和接收PTEDD |= ObllllllOO; /配置驱动模块/PTEDD &= OblllllllO;配置红外接近传感器前两个口左右计数的口PTADD = OxFF;/PTFDD = 0b001 111 11;/设置定时器1通道状态和控制寄存器TPM l_CHSCSTR(CHNo) = ObOO
16、lOlOOO;/iiiii/IIH+-ELSA/|+ELSB/-边沿对其模式/|+MSA/|+MSB/-PWM模式,CPWMS位需要设置为0/+CHIE-禁止中断TPM_CSTR(1) = ObOOOOlOOO;定时器 1 时钟源和分频数的选择 /I iiiii/| IIH+-PSO/1111+PS1-1倍分频/111+PS2/|+CLKSA/|+CLKSB/-时钟源系统固定时钟 01:总线时钟20M10:固定系统时钟2M/+TOIE禁止溢出中断else(/定时器1通道。数值寄存器TPM2_CHVH(CHNo)=(uint8)(j 8);TPM2_CHVL(CHNo)=(uint8)j;设置定
17、时器2通道状态和控制寄存器TPM2_CHSCSTR(CHNo)=0b00101000;/IIIII/IIH+-ELSA/|+ELSB/-边沿对其模式/|+MSA/|+MSB/PWM模式,CPWMS位需要设置为0/+CHIE-禁止中断TPM_CSTR(2)= ObOOOlOOH;/ iiiii定时器2时钟源和分频数的选择/11|+-PSO/|+-PSl-8 倍分频/11|+PS2/| |+CLKSA/| +CLKSB/-时钟源总线时钟01:总线时钟20M10:固定系统时钟2M/+TOIE-禁止溢出中断/*函数名:PWM_Set(单个PWM波输出函数)*功能:根据所需的PWM波的周期和占空比,并设
18、置相关寄存器,输出PWM波 *参数:*/ (l)TPM_No :定时器号(1 -2)*/(2)CH_No:通道号(定时器1通道号0-5,定时器2通道号0-1)*/(3)angle:舵机旋转角度*返回:无*说明:角度( ):04590135180*/ 正脉宽(ms): 0.51.01.52.02.5*/*同样的道理,控制舵机要改变占空比,必经关闭打开定时器这两个步骤,所以直接把它写 到函数进去,避免遗忘void PWM_Set_duoji(uint8 TPMNo,uint8 CHNo,uint8 angle)(uintl6 duty = 0;=注意:一定要加上,否则PWM的周期和占空比不会改变先
19、禁止用定时器,不选择时钟即可= if(TPMNo 2)(TPMNo = 1;else(TPMNo = 2;TPM_CSTR(TPMNo) = 0x00;if(angle=120)(angle=120;duty二angle*25;注意,这个推得的式子,要保证舵机处于高电平的时间,这和定时器状态和控制寄存器duty = (uintl6)(duty/9.0); 紧密联系,此关系式子推得的前提是必须 TPM_CSTR(TPMNo)= ObOOOlOOll;duty += 125;一旦时钟源和分频变了,则不能用这个式子举例,转90度,假设设通道寄存器值为a, 则l/(fosc/p)振荡一次用的时间,振荡
20、if(TPMNo = 1)a*(l/(fosc/p)必须等于 1.5ms,即 0.0015s,即高电平的时间(定时器1if(CHNo 5)CHNo = 5;/根据占空比,设置相应通道数值寄存器TPMl_CHVH(CHNo)=(uint8)(duty 8);TPMl_CHVL(CHNo) = (uint8)duty;设置定时器1通道状态和控制寄存器(主要为PWM对齐方式选择,时钟源选择, 分频因子选择)TPM 1 _CHSCSTR(CHNo) = ObOOlOlOOO;/iiiii/IIH+-ELSA/|+ELSB/-边沿对其模式/|+MSA/|+MSB/-PWM模式,CPWMS位需要设置为0/
21、+CHIE-禁止中断TPM_CSTR(1) = ObOOO 10011;/| Hill定时器2时钟源和分频数的选择/| IIH+-PSO/IIII+PS1 -8 倍分频/11|+PS2/| |+CLKSA/| +CLKSB/-时钟源系统固定时钟01:总线时钟20M10:固定系统时钟2M/+TOIE-禁止溢出中断else(/定时器2if(CHNo 1)CHNo=1;根据占空比,设置相应通道数值寄存器TPM2_CHVH(CHNo) = (uint8)(duty 8);TPM2_CHVL(CHNo) = (uint8)duty;设置定时器2通道状态和控制寄存器(主要为PWM对齐方式选择,时钟源选择,
22、 分频因子选择)TPM2_CHSCSTR(CHNo) = ObOO 101000;/Hill/IIH+-ELSA/|+ELSB/-边沿对其模式/|+MSA/|+MSB/-PWM模式,CPWMS位需要设置为0/+CHIE禁止中断TPM_CSTR(2)二 ObOOOlOOll;/I Hill定时器2时钟源和分频数的选择/| IIH+-PSO/1111+PS1 -8 倍分频/11|+PS2/|+CLKSA/| +CLKSB/时钟源系统固定时钟01:总线时钟20M10:固定系统时钟2M/+TOIE禁止溢出中断函数名:ECT_Init*功能:输入捕捉模块*参数:*/ (l)TPM_No :定时器号(1
23、-2)*/(2)CH_No:通道号(定时器1通道号05,定时器2通道号01)*/返回:无*/说明:无*/*void ECT_Init(uint8 TPM_No,uint8 CH_No)if(TPM_No 2)TPM_No = 2;if(TPM_No 5)CH_No = 5;TPM 1 _CHSCSTR(CH_No) = ObO 1000100;/llllllll/IIIIIII+-0:/IIIIII+-0:/|+-ELSnA: 跳变沿/输出电平选择位01上升沿捕/|+ELSnB:/|+-MSnA:通道模式选择位 0001lx/|+MSnB:输入捕捉 输出比较 PWM模式/|+CHnIE:通道中
24、断允许位1允许中断0禁止中断/+CHnF:通道捕捉标志位1发生捕捉)if(TPM_No 二二 2)if(CH_No 1)CH_No= 1;TPM2_CHSCSTR(CH_No) = ObO 1000100;/llllllll/IIIIIII+-0:/IIIIII+-0:/IIIII+ELSnA: 跳变沿/输出电平选择位01上升沿捕捉/|+ELSnB:/IH+-MSnA:通道模式选择位 0001lx/|+-MSnB:输入捕捉输出比较 PWM模式/|+CHnIE:通道中断允许位0禁止中断1允许中断/+CHnF:通道捕捉标志位1发生捕捉)设置定时器状态和控制寄存器TPM_CSTR(TPM_No)=
25、ObOOOOlOOO;/IIIIII/IIIII+-PSO/1111+PSI 0倍分频/111+PS2/11+CLKSA/| +CLKSB/时钟源选择系统固定时钟/+TOIE-禁止溢出中断) /*/ 文件名:timer.c/说明:定时器驱动文件/*定时器头文件#include ntimer.h/*函数名:TPMinit*功 能:对定时器初始化,禁止定时器1溢出中断,设置为1s发生1次定时器溢出中断*参 数:TPMNo为定时器号(12)*返回:无*说明:无*/*void TPMinit(uint8 TPMNo) (/参数溢出处理if(TPMNo2)TPMNo=2;else if(TPMNo= 6
26、0)秒加1/秒溢出(p+2) = 0;(p+l)+= 1;清秒分加1分溢出*(p+l) = 0;*p += 1;if (*p = 24)*p = 0;清时/时加1时溢出清时)/函数名:timerSetl0MS()功 参 返/*能:设置定时10ms中断数:定时器号TPMNo回:无说/void timerSet 10MS(uint8 TPMNo)/参数溢出处理if(TPMNo2)TPMNo=2;else if(TPMNo255)rb=255;判断RGB值是否合法/ / 1 * w1-kJ* */ /*1*/ I1 *”4*. * , *.w *./D LH.tcs230_s2=0;tcs230_s
27、3=l;/选择蓝色滤光器/timerSetl0MS(l);/10毫秒开始计时 开中断TPM_CNTH(2)=0;TPM_CNTL(2)=0; 开始计数DelayMs(lO);/ while(flag=O);等待定时器溢出bb=(unsigned long)(TPM_CNTH(2)*256+TPM_CNTL(2)*255/byz;Disabletimerlnt(l);关定时器 1 中断if(bb255)bb=255;判断RGB值是否合法/ /AI -/ / ,卜卜.、卜卜 一; IvX _ II卜卜卜卜卜卜卜卜一 卜,卜卜卜卜/刁、VJ IJbLtcs230_s2= 1;tcs23O_s3= 1
28、;/选择绿色滤光器/timerSetl0MS(l);/10毫秒开始计时 开中断TPM_CNTH(2)=0;TPM_CNTL=0;/开始计数DelayMs(lO);while(f!ag=O);/等待定时器溢出gb=(unsigned long)(TPM_CNTH(2)*256+TPM_CNTL(2)*255/gyz;Disabletimerlnt(l);/关定时器 1 中断tcs230_en= 1;if(gb255)gb=255;判断RGB值是否合法)/ / *1* *1* *1* 7,7,7,*1* *1* 7,*1* *1* *1* *1* *1* *1* 7,7,7,*1* *1* *1*
29、 *1* 7,7,7,7,*1* 7,7,*1* *1* *1* *1* 7,7,7,*1* *1* 7,7,7,7,/ /q、q. 、q、4、*2*q. 、q、“、*1* q、4、白平衡子程序void baipingheng()*求取红色因子 *tcs230_s2=0;tcs230_s3=0;选择红色滤光器tcs230 en=O;/timerSetl0MS(l);/10毫秒开始计时开中断Enablelnten*upt();TPM_CNTH(2)=0;TPM_CNTL(2)=0; 开始计数DelayMs(lO);while(flag=O);等待定时器溢出ryz=(unsigned kmg)(T
30、PM_CNTH(2)*256+TPM_CNTL(2);其实这里的比例因子应该为255/(THl*256+TLl)/Disabletimerlnt(l);/关定时器 1 中断/*| 因 子* * tcs230 s2=0;tcs23cLs3= 1;/选择蓝色滤光器/timerSetl0MS(l);/10毫秒开始计时 开中断TPM_CNTH(2)=0;TPM_CNTL(2)=0 ;开始计数DelayMs(lO);/ while(flag=O);等待定时器溢出byz二(unsigned long)(TPM_CNTH(2)*256+TPM_CNTL(2);其实这里的比例 因子应该 为 255/(THl*256+TLl) Disabletimerlnt;关定时器1中断tcs230_s2=l;tcs230_s3=l;选择绿色滤光器/timerSetl0MS(l);/10毫秒开始计时 开中断TPM_CNTH(2)=0;TPM_CNTL(2)=0;开始计数DelayMs(lO);while(flag=O);等待定时器溢出gyz=(unsigned long)(TPM_CNTH(2)*256+TPM_CNTL(2);其实这里的比例因子应该 为 255/(THl*256+TLl)Disabletimerlnt(l);/关定时器 1 中断 tcs230_en=l;)/ /