之前智能车系列已经做了一个比较详细的解析,但是美中不足是知识点被拆的太零散,可能对于新手来说不太友好,所以借着有空就再写一点能让车跑起来的方案。
当然,也就仅仅限于可以跑起来,元素以及高级算法就需要车友们自己去整了,主要还是方便新手上道,当然也欢迎大佬们提出建议。本文以电磁四轮为例进行讲解。
材料准备
作为刚接触电磁车的同学,咱们要想跑起来需要四大件,车模、电磁及运放模块、主控及母板、电机驱动;
这里笔者打算分成两种组别来推荐方案,一类是手头没有现成车模而且不是今年参赛的练习组,另外一类是今年的参赛组。
备赛组
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教育机器人自营店)
由于原理都差不多一样的,练习使用这种车模性价比极高,而且还可以留下来参加其他的比赛。
2.硬件方案
电机驱动:购买了这种车模的同学也可以直接用配套的电机驱动,或者使用l298n、tb6612这些电驱都可以。
主控:建议使用带片内adc的主控,stm32,stc32、stc16、msp430都可以反正选一个自己熟悉的就行了。
电磁传感器:可以购龙邱、或者轮趣科技的。
电源:选用两节18650加一个lm2596的降压模块即可。
如果觉得麻烦,可以直接选购轮趣科技的学习版小车,如下图:
当然,手头有往届的芯片和方案更好,这样可以无缝衔接到比赛,比如k66、k60这些方案只是现在不用了,但是网上资料多啊,而且这些处理器性能拿来练手绰绰有余。
整车原理
在准备好上面的硬件后,再来捋一下整个小车的运行原理。
小车要正常行驶在赛道上,必定是需要实时根据赛道的状态来调整车身姿态的,那么,电磁车是怎么样获取到赛道信息,又是怎样实现转向的呢。
赛道信息获取及转向原理
1.工字电感
电磁车是通过获取赛道信号发生器产生的信号来来获取赛道信息的,在赛道正中间会有一条磁感线,用来产生交变电磁信号。
小车通过前瞻上的电感即可获得到赛道信息,为啥可以电感可以获取赛道信息呢,其实很好理解,电磁感应都映像吧,导体切割磁感线会产生感应电动势,工字电感内部的导线切割信号线产生的磁场,在电感引脚就会有感应电动势。
电感距离磁场越近,产生的感应电动势越大,距离越远,产生的感应电动势越小。
(有关电感配频以及信号在各个节点的状态可以去笔者的硬件篇查看)。
2.运放模块
经过工字电感产生的感应电动势是交流小信号,单片机是无法采集和处理这种小电压的交变信号
所以需要在后面增加一个峰值检测以及放大的运放电路,将交变信号进行选频、检波然后放到适当倍数,输出单片机adc可以采集的直流信号,将感应电动的大小转换成为单片机adc采集的数字作为输入量。
3.转向原理
了解了单个电感获取赛道信息的原理后,为了让小车能够在赛道上行驶,至少会使用左、右两个电感,通过adc采集经过运放处理的感应电动势值来计算偏差。
方法是直接左右电感采集值之差(或者差比和计算)来判断赛道信息,将差比和计算出来的偏差以一定的比例关联到舵机的pwm占空比来控制舵机打角,进而控制小车进行转向。参考下表
其中系列1是左右电感直接作差的波形,系列2是经过差比和计算出来的波形,可见系列2的波形比系列1更加平滑,这有利于控制系统的跟随。
具体原理:
如下图,小车位于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
4.元素判断
从此图可以看出理论上小车在经过三叉、环岛和十字时,左右两个电感的电感值都会接近磁感线,检测这个特征就可以识别到了,为了防止误判还可以增加一个中间电感或者斜放置电感来辅助判断。
电感只有线圈切割磁场时才能产生感应电动势,线圈和磁场平行时是没有感应电动势的,但是在这些特殊元素是,原本没有切割磁场的电感可能突然就切割了磁感线,这里留给大家自己去发挥。
此处提供一个思路,直接看图:
电机及舵机控制原理
舵机和电机都是通过pwm来控制的,只不过舵机控制的pwm的频率是固定的(50-60hz),通过改变占空比来实现打角角度。
而电机的频率没有指定范围,但速度也是通过调节占空比来控制的,通过调节电机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);}
需要完整代码的同学去笔者的资源自行下载,也可以去文末链接找完赛代码。
效果欣赏
总结
有关电磁车的介绍就到此为止,这篇主要是串了一下整个车的思路,细节还需要去看笔者之前的介绍。
文章如有不足欢迎指出,祝大家的小车可以拿到满意的成绩,笔者在评论区等待你们赛后的分享。
MiniLED电视行业中谁才是“领头羊”
摩尔定律在14nm节点上迎来大挑战
X-FAB携手合作伙伴推出高性价比的OTP存储器解决方案
DCDC电源模块1W系列升级 支持低功耗和短路保护
2020年物联网和嵌入式技术硬件供应商满意度金奖火热出炉,研华为金奖供应商得主
智能车浅谈—手把手让车跑起来(电磁篇)
DPO4054泰克示波器维修放大器问题案例
基于物理机理和大数据分析的混合数字孪生技术
电机保护器面板显示方式和穿线方向
空间分辨率的概念和意义
工业物联网能耗监测系统应用
韩国电信公司推出了一款名叫N bot的服务机器人
为什么要进行数据清洗呢?
高压电缆故障及隐患监测系统:保障电力安全的重要工具
世界最权威的人脸检测公开评测集WIDER FACE公布最新评测结果
高通加Win10,能撼动Intel的地位么?
电池单格短路现象造成原因及修复方法
最常用的两种无线充电方式原理
迪进国际推出适用于工业4.0普及的蜂窝式路由器
PPE里面电池和充电设计