十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(一)模块初始化

现在是小小研究生一枚,最近感觉写写博客还挺有意思的,本着大家互相讨论、共同进步的想法,打算分享分享从本科以来做过的一些大大小小的工程或比赛经验,同时也作为笔记,方便自己以后复习复习。

本科时候很幸运参加了2018年第十三届全国大学生“恩智浦”杯智能汽车竞赛的信标对抗组。第一篇博文就分享分享两年前当时我们队的参赛方案吧。由于我在队里主要工作是负责软件编程的部分,硬件部分涉猎相对少一些,所以这篇分享以程序、控制思路分享为主,请各位大佬轻喷。。。。。。

先放上这一系列的链接:

  1. 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(一)模块初始化
  2. 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(二)图像处理
  3. 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(三)寻灯策略Part.①
  4. 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(四)寻灯策略Part.②
  5. 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(五)分段控速
  6. 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(六)避障

正文开始:
我们车模使用的是B车型,它为后驱单电机,前转向SD-5舵机。这个车型的优点很粗暴,就是后驱电机动力很强大,满速的时候能让车飞起来然后把轮胎瞬间甩掉;它的缺点也很明显,由于它是单电机,后轮为被动的机械差速,因此其转向能力相比双电机的C车型差的不是一点半点。十三届之前,老款C车型的电机动力不行,轮子半径也小,速度因此较慢,B车自然是更好的选择,信标对抗组的好成绩很多都是B车拿下的。到我们十三届,组委会推出了新款C车型,轮子半径加大了,动力增强了,配合上C车一直以来的优秀转向性能,简直是“天选之子”。然而…年少天真的我们队三个人当时并没意识到C车改款的提升有多大,依旧选择了昔日王者B车型。最后事实也给新款C车证明了它的强大,十三届信标对抗组的排行榜几乎被新C车占领了,B车模则没有了昔日的辉煌。

我们使用的主控为恩智浦的K60芯片。

主要的传感器有:硬件二值化的OV7725摄像头;E18-D80NK光电管用来检测一定距离内的障碍物;E6A2-CW3C500编码器用来测后驱轮子转速。

这一次就先分享一下首先是各个模块的初始化(使能):

  • 其中左、中、右三个红外光电管只需要普通GPIO口的输入模式来使能,一定距离内探测到障碍物则会返回低电平,反之为高电平,E18-D80NK光电管上提供了调节旋钮,可以使用一字螺丝刀调节探测距离。
gpio_init(PTE6,GPI,0) ;                    //红外  中
gpio_init(PTE7,GPI,0) ;                    //红外  左
gpio_init(PTE8,GPI,0) ;                    //红外  右
  • 初始化测速编码器则需要FTM正交解码功能。
ftm_quad_init(FTM1);                        //FTM1 正交解码初始化
  • 舵机和电机都依赖主控输出的PWM信号来工作。
    ①B车型的SD-5舵机为数字舵机,查资料可以知道其较好的PWM工作频率为300Hz左右,因此我们将输出给舵机的PWM信号频率设为300Hz;在PWM频率不变的情况下,舵机的打角角度只与PWM占空比有关,初始化时一般都将前轮打正,因此需要找到前轮打正时对应的PWM占空比,我这里找到占空比为57%(由于舵机安装方式或占空比调节分辨率等情况不同,大家的车模找到的值不一定和我的一样)。后面想让小车自动控制转向其实就是PWM频率不用改变的情况下动态地调整PWM的占空比,从而实现不同角度、不同半径的转向。
    ②车模电机通过驱动电路连接主控芯片,驱动电路能把主控输出的PWM信号转换为平均电压。当PWM占空比为0%(即一直输出低电平)时,驱动电路输出给电机的电压也为0V;当PWM占空比为100%(即一直输出高电平),则驱动电路将输出驱动电路的最高电压,此时电机稳定后的转速为最高转速(注意:设计的驱动电路板输出不要超出电机的工作电压范围哦!)。一般控制驱动电路的PWM频率可以高一些,我这里设置20000Hz,初始化时让电机为停止状态,因此正反两条PWM占空比都设为0%。后面想让小车自动控制速度其实就是PWM频率不用改变的情况下动态地调整PWM的占空比,从而实现调节车速。
FTM_PWM_init(FTM2,CH1,300,570);             //舵机PWM初始化

FTM_PWM_init(FTM0,CH0,20000,0); //反        //电机PWM初始化
FTM_PWM_init(FTM0,CH1,20000,0); //正
  • OV7725摄像头的初始化。
OV7725_INC();                               //设置行场中断
IICWriteGpio_inintOV();                     //设置SCCB引脚
while(ov7725_probe()==0);                   //初始化寄存器
ov7725_set_image_size(IMAGE_SIZE);          //设置图像大小
  • 至此整个小车的必备模块都初始化完成了。不过为了方便调车、验证算法,一般小车上还需要使用按键、拨码开关、屏幕和串口传输等模块。可以自行选择和添加。
gpio_init(PTB20,GPI_UP,0) ;                 //按键1
gpio_init(PTB21,GPI_UP,0) ;                 //按键2

gpio_init(PTC8,GPI_UP,0) ;                  //拨码开关1
gpio_init(PTC9,GPI_UP,0) ;                  //拨码开关2
gpio_init(PTC10,GPI_UP,0) ;                 //拨码开关3
gpio_init(PTC11,GPI_UP,0) ;                 //拨码开关4

OLED_Init();                                //OELD显示初始化

uart_init(UART4 , 115200);                  //串口初始化 串口:UART4 波特率:115200
  • 为了应对现场比赛时环境光的影响,我们还增加了额外的四个方向红外探头,用来探测信标灯的大概方位。与光电管类似,它也是只需要普通GPIO口的输入模式来使能即可。
gpio_init(PTE9,GPI,0) ;                     //红外探头  左前
gpio_init(PTE10,GPI,0) ;                    //红外探头  右前
gpio_init(PTE11,GPI,0) ;                    //红外探头  右后
gpio_init(PTE12,GPI,0) ;                    //红外探头  左后
  • 各模块的初始化到这里就完成了。最后附上完整的模块初始化程序。
/************************主函数***************************/
void main(void)
{
  DisableInterrupts;   //禁止总中断

  uart_init(UART4 , 115200);//串口初始化 串口:UART4 波特率:115200

  gpio_init(PTE6,GPI,0) ;                     //红外  中
  gpio_init(PTE7,GPI,0) ;                     //红外  左
  gpio_init(PTE8,GPI,0) ;                     //红外  右
  
  gpio_init(PTE9,GPI,0) ;                     //红外探头  左前
  gpio_init(PTE10,GPI,0) ;                    //红外探头  右前
  gpio_init(PTE11,GPI,0) ;                    //红外探头  右后
  gpio_init(PTE12,GPI,0) ;                    //红外探头  左后
  
  gpio_init(PTB20,GPI_UP,0) ;                 //按键1
  gpio_init(PTB21,GPI_UP,0) ;                 //按键2

  gpio_init(PTC8,GPI_UP,0) ;                  //拨码开关1
  gpio_init(PTC9,GPI_UP,0) ;                  //拨码开关2
  gpio_init(PTC10,GPI_UP,0) ;                 //拨码开关3
  gpio_init(PTC11,GPI_UP,0) ;                 //拨码开关4

  ftm_quad_init(FTM1);                        //FTM1 正交解码初始化

  FTM_PWM_init(FTM2,CH1,300,570);             //舵机PWM初始化

  FTM_PWM_init(FTM0,CH0,20000,0); //反        //电机PWM初始化
  FTM_PWM_init(FTM0,CH1,20000,0); //正

  OLED_Init();    							  //OELD显示初始化

  OV7725_INC();                               //设置行场中断
  IICWriteGpio_inintOV();                     //设置SCCB引脚
  while(ov7725_probe()==0);                   //初始化寄存器
  ov7725_set_image_size(IMAGE_SIZE);          //设置图像大小
   
  OLED_Fill(0x00);//黑屏
  
  EnableInterrupts;   //开启总中断  
  
  while(1)
  {
  }
}

这次就先到这里,往后我还会不定期的继续更新信标对抗组这个系列相关内容,包括我们使用的寻灯策略、避灯策略、分段控制等等。

  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZM丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值