0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

智能车浅谈—手把手让车跑起来(电磁篇)

新机器视觉 来源:CSDN 2023-04-11 09:43 次阅读

之前智能车系列已经做了一个比较详细的解析,但是美中不足是知识点被拆的太零散,可能对于新手来说不太友好,所以借着有空就再写一点能让车跑起来的方案。

当然,也就仅仅限于可以跑起来,元素以及高级算法就需要车友们自己去整了,主要还是方便新手上道,当然也欢迎大佬们提出建议。本文以电磁四轮为例进行讲解。

材料准备

作为刚接触电磁车的同学,咱们要想跑起来需要四大件,车模、电磁及运放模块、主控及母板、电机驱动;

这里笔者打算分成两种组别来推荐方案,一类是手头没有现成车模而且不是今年参赛的练习组,另外一类是今年的参赛组。

备赛组

1.车模

这里以基础电磁四轮组为例,建议使用C车模,B车的傻蛋5舵机以及机械差速还是有些许的头秃,当然官方今年好像已经宣布了换掉SD5舵机,由于C车是双电机可以使用主动差速,所以建议大家上手选择C车。

车模的机械结构搭建可以去参考往届优秀队伍的技术报告,至于怎么找到技术报告,比赛官网有,卓大博客也有—第十六届全国大学智能车竞赛技术报告与总决赛视频下载。借用逐飞科技的示例车来展示一下:

2.硬件

主控:电磁车今年参赛要求是使用STC的单片机来参赛,所以就可以选购龙邱或者逐飞STC母板来作为主控;

电机驱动:目前比赛常用的有HIP4082、DRV8701、BTN7971或者IR系列加MOS全桥等;

电磁组所需的电感和运放模块:目前较多的是OP2350、LM358、OPA4377等;

电源模块:整个小车系统所需的电源种类一般是5V、3.3V、12V,需要有一个系统的电源管理方案,这个需要积累,BUCK、BOOST的电路,网上方案也很多,笔者之前使用的是德州仪器的TPS系列。

硬件设计的注意事项可以参考笔者抗干扰技术的那篇博客。

练习组

1.车模

对于不是急于参赛而是平时训练的练习组,手头如果没有现成的车模和往届的方案的,建议去淘宝找平价车模代替,因为自己一套买下来得个大几千块,都是学生党,这也不是个小数目。

可以参考下图这种使用舵机转向而且后轮电机带编码器的车模,加上锂电池这些一套下来300左右。(图片来源于某宝,VANBOT教育机器人自营店)

86d759d0-d805-11ed-bfe3-dac502259ad0.png

由于原理都差不多一样的,练习使用这种车模性价比极高,而且还可以留下来参加其他的比赛。

2.硬件方案

电机驱动:购买了这种车模的同学也可以直接用配套的电机驱动,或者使用L298N、TB6612这些电驱都可以。

主控:建议使用带片内ADC的主控,STM32,STC32、STC16、MSP430都可以反正选一个自己熟悉的就行了。

电磁传感器:可以购龙邱、或者轮趣科技的。

电源:选用两节18650加一个LM2596的降压模块即可。

如果觉得麻烦,可以直接选购轮趣科技的学习版小车,如下图:

86fd9c26-d805-11ed-bfe3-dac502259ad0.png

当然,手头有往届的芯片和方案更好,这样可以无缝衔接到比赛,比如K66、K60这些方案只是现在不用了,但是网上资料多啊,而且这些处理器性能拿来练手绰绰有余。

整车原理

在准备好上面的硬件后,再来捋一下整个小车的运行原理。

小车要正常行驶在赛道上,必定是需要实时根据赛道的状态来调整车身姿态的,那么,电磁车是怎么样获取到赛道信息,又是怎样实现转向的呢。

赛道信息获取及转向原理

1.工字电感

电磁车是通过获取赛道信号发生器产生的信号来来获取赛道信息的,在赛道正中间会有一条磁感线,用来产生交变电磁信号。

小车通过前瞻上的电感即可获得到赛道信息,为啥可以电感可以获取赛道信息呢,其实很好理解,电磁感应都映像吧,导体切割磁感线会产生感应电动势,工字电感内部的导线切割信号线产生的磁场,在电感引脚就会有感应电动势。

电感距离磁场越近,产生的感应电动势越大,距离越远,产生的感应电动势越小。

8744b462-d805-11ed-bfe3-dac502259ad0.png

(有关电感配频以及信号在各个节点的状态可以去笔者的硬件篇查看)。

2.运放模块

经过工字电感产生的感应电动势是交流小信号,单片机是无法采集和处理这种小电压的交变信号

所以需要在后面增加一个峰值检测以及放大的运放电路,将交变信号进行选频、检波然后放到适当倍数,输出单片机ADC可以采集的直流信号,将感应电动的大小转换成为单片机ADC采集的数字作为输入量。

3.转向原理

了解了单个电感获取赛道信息的原理后,为了让小车能够在赛道上行驶,至少会使用左、右两个电感,通过ADC采集经过运放处理的感应电动势值来计算偏差。

方法是直接左右电感采集值之差(或者差比和计算)来判断赛道信息,将差比和计算出来的偏差以一定的比例关联到舵机的pwm占空比来控制舵机打角,进而控制小车进行转向。参考下表

其中系列1是左右电感直接作差的波形,系列2是经过差比和计算出来的波形,可见系列2的波形比系列1更加平滑,这有利于控制系统的跟随。

875b7274-d805-11ed-bfe3-dac502259ad0.png

具体原理:

如下图,小车位于2号位置时,左右两个电感距离信号的距离一样,周围磁场强度也基本一致,产生的感应电动势也是大差不差,左右电感值差比和计算出来的偏差也是0,舵机位于正中间,保持小车直行。

小车位于3号位置时,由于弯道,左边电感距离信号线近,磁场更强,产生的感应电动势要大于右电感的感应电动势,左右电感差比和计算偏差就很大了,将这个偏差输出到舵机,让小车左转来消除这个偏差。

当小车遇见右转赛道时,两个电感的状态刚好相反,此时需要右转来抵消二者偏差。

详细描述参考此文:

https://blog.csdn.net/weixin_43788952/article/details/105151921?utm_source=app&app_version=5.2.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

87730524-d805-11ed-bfe3-dac502259ad0.png

4.元素判断

从此图可以看出理论上小车在经过三叉、环岛和十字时,左右两个电感的电感值都会接近磁感线,检测这个特征就可以识别到了,为了防止误判还可以增加一个中间电感或者斜放置电感来辅助判断。

电感只有线圈切割磁场时才能产生感应电动势,线圈和磁场平行时是没有感应电动势的,但是在这些特殊元素是,原本没有切割磁场的电感可能突然就切割了磁感线,这里留给大家自己去发挥。

此处提供一个思路,直接看图:

87d01d68-d805-11ed-bfe3-dac502259ad0.png

电机及舵机控制原理

舵机和电机都是通过PWM来控制的,只不过舵机控制的PWM的频率是固定的(50-60HZ),通过改变占空比来实现打角角度。

88032e56-d805-11ed-bfe3-dac502259ad0.png

而电机的频率没有指定范围,但速度也是通过调节占空比来控制的,通过调节电机pwm输出占空比完成对电机速度的调整,电磁组需注意电机对电磁信号会有干扰。

建议电机控制的pwm频率设置为13-19khz,以尽可能的消除干扰。

具体的PWM控制原理以及H桥的讲解之前已经写过了,需要的同学去前面方向篇和电机控制篇查看。

代码实现

在了解了上述原理后,我们就可以开始写程序控制我们的小车,实现一个可以跑的状态了。

首先,综合上面的原理,需要初始化PWM来控制舵机和电机,其中舵机的PWM使用的是50-60hz的pwm进行控制(笔者用的50HZ进行控制),而电机的频率是13-19Khz。

然后是获取赛道信息的ADC,需要至少开启两路来实现信息采集。

还有为了保证系统的计算和输出周期固定,需要开启一个定时器中断来保证输出的周期稳定。

其他:根据自己的需求初始化IO控制屏幕,按键,蜂鸣器LED灯。

有了这个思路,任何一款处理器都可以实现功能了。笔者这里以STC为例。

框架:

以下代码仅供参考, 仅仅是代码框架 不能直接复制编译!!!

void main()
{
//按照对应芯片进行上述内容的初始
 DisableGlobalIRQ(); //关闭总中断
 board_init(); 
// lcd_init();   //1.8寸TFT初始化 
 /****电机初始化***/
 pwm_init(PWMA_CH1P_P60, 10000, 0);   //初始化PWM5 使用引脚P2.5 输出PWM频率10000HZ  占空比为百分之 pwm_duty / PWM_DUTY_MAX * 100
 pwm_init(PWMA_CH2P_P62, 10000, 0);   //初始化PWM5 使用引脚P2.5 输出PWM频率10000HZ  占空比为百分之 pwm_duty / PWM_DUTY_MAX * 100
 pwm_init(PWMA_CH3P_P64, 10000, 0);   //初始化PWM5 使用引脚P2.5 输出PWM频率10000HZ  占空比为百分之 pwm_duty / PWM_DUTY_MAX * 100
 pwm_init(PWMA_CH4P_P66, 10000, 0);   //初始化PWM5 使用引脚P2.5 输出PWM频率10000HZ  占空比为百分之 pwm_duty / PWM_DUTY_MAX * 100
 /***电磁初始化***/
 adc_init(ADC_P00, ADC_SYSclk_DIV_2); //初始化ADC,P1.0通道 ,ADC时钟频率:SYSclk/2
 adc_init(ADC_P01, ADC_SYSclk_DIV_2); //初始化ADC,P1.1通道 ,ADC时钟频率:SYSclk/2
 adc_init(ADC_P05, ADC_SYSclk_DIV_2); //初始化ADC,P1.2通道 ,ADC时钟频率:SYSclk/2
  adc_init(ADC_P06, ADC_SYSclk_DIV_2); //初始化ADC,P1.2通道 ,ADC时钟频率:SYSclk/2
 
 //****舵机初始化*****21.12.19/
 Steering_Init(50,Steering_Duty);  //舵机初始化,PWM频率为50HZ
 /*****编码器出初始化***/
  ctimer_count_init(CTIM0_P34); //初始化2个编码器
 ctimer_count_init(CTIM3_P04); //初始化2个编码器
 
 gpio_pull_set(P7_7,PULLUP);
 BeeOff;
  pit_timer_ms(TIM_4, 5);    //使用TIMER作为周期中断,时间5ms一次
 EnableGlobalIRQ(); //开启总中断
 
 while(1) //电机1
 {
 //可以放显示、按键操作这一类没有严格时序要求的。
  //pwm_init(PWMB_CH1_P74,freq,1350); //PWMA初始化
  //屏幕显示:
//   lcd_showstr(0,0,"L:"); 
//  lcd_showuint16(5*8,0,L);
//  lcd_showstr(0,1,"M:"); 
//  lcd_showuint16(5*8,1,M);
//  lcd_showstr(0,2,"R:"); 
//  lcd_showuint16(5*8,2,R);
//  lcd_showstr(0,3,"dutyL:"); 
//  lcd_showuint16(5*8,3,dutyL);
//  lcd_showstr(0,4,"dutyR:"); 
//  lcd_showuint16(5*8,4,dutyR);
//  lcd_showstr(0,5,"error:"); 
//  lcd_showuint16(5*8,5,error);
  
//  
//  delay_ms(10);
 }
}
//定时器中断
void TM4_Isr() interrupt 20
{
 TIM4_CLEAR_FLAG; //清除中断标志
 //电感采集获取赛道信息,三电感   \ 000   000   000  //
  L=adc_once(ADC_P00, ADC_10BIT);
  M=adc_once(ADC_P01, ADC_10BIT);
  R=adc_once(ADC_P05, ADC_10BIT);
  My_Direction.NowError=50*(R-L)/(L+M+R);//差比和计算偏差
  //方向环
  Direction_Out();
   //***电机控制***//
  if(DIR1 == 1)//读取编码器方向
  {
   speed1 = 2*ctimer_count_read(CTIM0_P34);//
  }
  else
  {
   speed1 = 2*ctimer_count_read(CTIM0_P34) * -1;
  }
  ctimer_count_clean(CTIM0_P34);
  if(DIR2 == 1) //输出高电平,正转
  {
   speed2 = 2*ctimer_count_read(CTIM3_P04)* -1;
  }
  else    //输出低电平,反转
  {
   speed2 = 2*ctimer_count_read(CTIM3_P04) ;
  }
  ctimer_count_clean(CTIM3_P04);//清除积累
  Current_speed=(speed1+speed2)/2;
  Current_speed=Current_speed*20.4/(2355.2*0.02);//速度=脉冲数*周长/2368*周期;
 //电机PI控制
  error=(int)(speed-Current_speed);
  duty=duty+(error-error_pre)*Motor_P+error*Motor_I;
  error_pre=error;
  if(duty>=100) duty=100;
  else if(duty<=-100) duty=-100;
 
 //电机动作 单极控制
 pwm_duty(PWMA_CH2P_P62, 0);
 pwm_duty(PWMA_CH1P_P60, dutyL*12);
 pwm_duty(PWMA_CH4P_P66, 0);
 pwm_duty(PWMA_CH3P_P64, dutyR*12);


}

需要完整代码的同学去笔者的资源自行下载,也可以去文末链接找完赛代码。

效果欣赏

881f55c2-d805-11ed-bfe3-dac502259ad0.gif

总结

有关电磁车的介绍就到此为止,这篇主要是串了一下整个车的思路,细节还需要去看笔者之前的介绍。

文章如有不足欢迎指出,祝大家的小车可以拿到满意的成绩,笔者在评论区等待你们赛后的分享。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 智能车
    +关注

    关注

    21

    文章

    395

    浏览量

    76695

原文标题:智能车浅谈—手把手让车跑起来(电磁篇)

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    手把手教你学arm-stm32高级

    `谁有理想智芯科技的手把手教你学arm-stm32高级的视频和程序?请告诉我一下谢了`
    发表于 07-14 13:45

    手把手教你从零开始用labview编写智能车上位机程序.rar

    本帖最后由 eehome 于 2013-1-5 09:57 编辑 手把手教你从零开始用labview编写智能车上位机程序.rar
    发表于 08-26 20:53

    智能车设计基础

    智能车设计基础 第10章.rar http://filemarkets.com/file/bai2471/9d9e6c95/智能车设计基础 第3章.rar: http://www.t00y.com
    发表于 10-21 21:11

    树莓派智能车AlphaBot系列教程

    ;catid=57树莓派智能车AlphaBot教程1:人生若只如初见 ...树莓派智能车AlphaBot教程2:直流电机控制 ... 树莓派智能车AlphaBot教程3:避障树莓派智能车
    发表于 05-15 15:39

    手把手教你学FPGA 编程规范

    手把手教你学FPGA 编程规范
    发表于 02-02 11:32

    怎么实现基于电磁场检测的寻线智能车设计?

    本文采用通电导线产生的电磁场对智能车进行引导。使用磁场信号引导沿一定轨迹行走的优点主要体现在磁场信号具有很好的环境适应性,不受光线、温度、湿度等环境因素的影响。
    发表于 05-14 07:15

    如何你的ESP32跑起来

    ESP32是了国内乐鑫科技推出的Wifi&蓝牙物联网MCU,而最近项目正好在用ESP32,所以我们今天就来分享下,如何你的ESP32跑起来,并应用于更多实际项目。1ESP32简...
    发表于 07-16 06:57

    第十五届智能车入门浅谈 精选资料分享

    @TOC第十五届智能车入门浅谈写博客原因这次第十五届全国智能车大赛已经结束了,对于我而言,确实是我大学中一个不可多得的经历,我希望我的这段经历可以保存下来通过博客的形式,同时可以对于其他人有帮助
    发表于 07-28 06:02

    基于单片机的智能车设计

    作为一名练习时长两年半的练习生,来浅谈下第十五届智能车竞赛规则。第十五届智能车受疫情影响,终于在千呼万唤中姗姗来迟。细读规则,便会发现今年的智能车和往年有所不同。今年的组别设置有竞速组
    发表于 09-02 06:29

    智能车制作相关资料分享

    朋友组队前言 此献给GDOU的学子们,或许不是那么政治正确一、智能车是什么智能车总体概要智能车是大学生团体比赛,通常由三个人组成队伍。涉及多个领域的知识,包括计算机编程,涉及电路板,
    发表于 01-17 07:48

    如何u-boot跑起来

    如何u-boot跑起来
    发表于 01-26 08:26

    智能车电磁循迹相关资料下载

    飞思卡尔智能车电磁循迹(组别通用),六路运放,适用于电磁组所有组别,电路运行稳定,且移植性较强。
    发表于 03-02 06:41

    智能车竞赛浅谈——图像

    浅谈——控制规律智能车浅谈——过程通道智能车浅谈
    发表于 09-24 15:05

    手把手教你学DSP28335_张卿杰

    手把手教你学DSP28335张卿杰百度云分享手把手教你学DSP28335张卿杰百度云分享
    发表于 01-11 11:45 173次下载

    手把手教你学LabVIEW视觉设计

    手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视觉设计手把手
    发表于 03-06 01:41 2773次阅读