![cover](https://img-blog.csdnimg.cn/b282eaf5ab114089a3339d8bed487a5a.jpeg)
智能车竞赛新手入门电磁(0基础)(通俗易懂)
对于没有传承代码的普通学校,刚开始接触智能车的时候可能不知所措,会浪费很多时间,我也是在智能车摸爬滚打了两年才从第一年的省三到第二年的国一,在两年的调车生涯里,也曾彷徨,也曾迷茫,还好有一群陪我一起调车的志同道合的朋友们,让我的智能车生涯变得更加精彩难忘,希望未来的车友们不要轻易放弃,坚持下去,对于我们这种没有保研资格的普通学校,支持我们一直坚持下来的大概就是热爱吧,希望车友们能把这份热爱传承下去,让智能车比赛越做越好,接下来我会尽量用通俗易懂的方式帮助大家入门智能车,如有错误的地方还请批评指正。首先附上一张车模照片:这是一个电磁车的车模,智能车室内跑赛道的组别主要循迹方式有两种,一种是摄像头,一种是电磁,电磁是偏简单一点的,所以今天先给大家讲讲电磁循迹, 图中圈出来的几个板块皆是逐飞科技淘宝店购买的学习模块,学习模块不能直接用于参赛,图中的电磁模块,运放模块,驱动模块,主控板皆需要大家自己用AD画板打板焊接,接下来我将一一向大家介绍一下各个模块的作用:
电磁模块通过杜邦线连接到主控板上的电磁运放模块,运放再连接到核心板上的AD口,电磁模块上的电感采集赛道中线上铺设的电磁线通过AD转化成数字信号大概原始值是几千多,当我们把采集到的值显示到屏幕上以后,可以调节运放模块上面的可调电阻来改变采集到的电感值,一般几千的电感值较大我们都会把电感值归一化到0—100以内来作为循迹使用,归一化的方法就是把车子摆放在赛道上中间,旋转可调电阻找到每个电感值的最大和最小值给他进行归一化,下面附上电感采集与归一化的代码,可供参考。
AD_Val[0]=adc_mean_filter_convert(ADC2_CH4_A4, 5);
AD_Val[1]=adc_mean_filter_convert(ADC2_CH5_A5, 5);
AD_Val[2]=adc_mean_filter_convert(ADC3_CH11_C1, 5);
AD_Val[3]=adc_mean_filter_convert(ADC3_CH12_C2, 5);
for(i=0;i<4;i++)
{
SensorToOne[i]=(float)(*(AD_Val+i)-(*(min+i)))/(float)(max[i]-min[i]);
if(SensorToOne[i]<0.01) SensorToOne[i]=0.01;
if(SensorToOne[i]>1.0) SensorToOne[i]=1.0;
AD[i]=(uint16)(100*SensorToOne[i]);
}
说了这么多那么智能车究竟是怎样进行电磁循迹的呢,当你把车子摆放在赛道中央时,电磁模块上的七个电感(一般最左最右电感用来正常循迹,中间电感用来判断元素:环岛,岔路等)相当于赛道中线上的电磁线对称,这个时候最左和最右电感采集到的值是相等的,他们的差(中线差值:最左减去最右)等于零,这个时候车子相当于在直道上(一般正常循迹最左最右电感已经足够),当车子位于左弯道的时候(最左电感大于最右电感),这个时候中线差值为正数,当车子位于右弯道的时候(最右电感大于最左电感),这个时候中线差值为负数,以下是计算中线差值的两种方法,当然不止这两种方法,还有一些给各个电感加权的方法大家也可以去了解了解,中线差值算出来了,把中线差值给到方向环pid(方向环pid一般采用pd控制,p越大打脚越大,d越大响应越快车子更稳但不能超调)中去,就能让你的小车一直循着赛道中线跑且可以实现左转右转。
int dircontrol(int chazhi)//方向环pid
{
int out_dw;
static int last_chazhi;
out_dw=(int)(chazhi*dir_p+(chazhi-last_chazhi)*dir_d);
last_chazhi=chazhi;
return out_dw;
}
turn_offset =((AD[3]-AD[0])/(AD[3]+AD[0]))*100;//差比和算中线差值
turn_offset =(AD[3]-AD[0]);//左减右算中线差值
核心板插在主控板上面通过主控板引出各个引脚来控制各个外设模块,刚刚我们已经说了电磁模块以及屏幕(这个应该不用多说了吧),下面说一下图中圈出来的两个绿色的编码器,编码器通过齿轮与电机齿轮衔接,另一端接线插在主控板上,随着电机的转动带动齿轮转动,齿轮带动编码器转动实时检测电机的转速反馈电机的实时转速,这也是速度环(速度闭环)的重要组成部分,编码器测的实时转速((左编码器+右编码器)/2)与你设定的目标速度进行比较(类似与中线差值的获得)得到的值作为速度环的输入,通过速度环pid(速度环一般采用pi控制)的调节让你的实时速度达到你设定的目标速度。
int speedcontrol(int ECPULSE,int aim_speed)//速度环pid
{
int out,Error;
Error=aim_speed-ECPULSE;
speed_jifen+=Error;
if(speed_jifen>300)speed_jifen=300;
if(speed_jifen<-300)speed_jifen=-300;
out=(int)(Error*speed_p+speed_jifen*speed_i);
return out;
}
Target_Speed=160;//目标速度
speed_out=speedcontrol((encoder1_speed -encoder2_speed)/2,Target_Speed );
我图中介绍的小车是一个三轮车,转弯靠的是差速转弯,故最终让两个电机的输出为:左电机=速度环+方向环,右电机=速度环-方向环,这样电机就可以带动小车既有了一定的速度又可以实现差速转弯完成简单闭环赛道循迹。当然如果是四轮有舵机的车模,则把速度环给后轮电机,方向环给前轮舵机即可。
duty0=speed_out+out_d;//左电机输出
duty1=speed_out-out_d;//右电机输出
图中的驱动板是用来一端连接电机,一端连接主控板上pwm口用来控制电机速度,虽然直接给直流电机直接接电源也能转,但却不能调速,故还是要连接一个驱动板来驱动电机,以上介绍都仅为最基础的智能车必备外设模块,帮助大家快速入门,接下来用一张图总结一下文章内容:当然还有陀螺仪,摄像头,tof,超声波,等外设,算法和pid调参以及各个元素的处理,后续再进行介绍,希望大家多多支持。最后希望大家都能快速入门智能车并取得优异的成绩,初心高于成败。
OLED_Init(); // OLED初始化
delayms(200);
ICM20689_Init(); //陀螺仪初始化
GPIO_KEY_Init(); // 按键初始化
MotorInit(12500); //电机PWM初始化
ADC_Init(); // ADC初始化
Timer34EncInit(); // 编码器接口初始化
Timer0_init(); //定时器初始化
GPIO_LED_Init(); //LED灯初始化
最后说一下main.c里面放各个模块的初始化代码,一般上述控制小车的代码可以放在1ms定时器中运行。想要源码的可以私聊我。
更多推荐
所有评论(0)