星空体育平台官网入口 智能车浅谈——手把手让车跑起来(电磁篇)
文章目录实践组车辆原理电机与舵机控制原理代码实现效果赏析总结智能车系列文章摘要
前言
电磁跟踪车
之前已经对智能小车系列做了比较详细的分析,但唯一的缺点是知识点太碎片化,对新手可能不太友好,所以等我有了之后再写一些让小车跑起来的解决方案时间。当然,仅限于跑步。要素和高级算法需要骑手自己调整。主要目的是为了让新手更容易上路。当然,也欢迎专家提出建议。本文以电磁四轮为例进行讲解。
材料准备
作为刚接触电磁车的同学,想要跑起来需要四大部分,包括车模、电磁及运放模块、主控及主板、电机驱动器。在这里,作者计划将解决方案分为两类推荐。一是手头没有现成的车模,不是今年比赛的练习组。另一个类别是今年的比赛组别。
预备车模型
以基础电磁四轮组为例,推荐使用C车车型。 B车的傻5舵机和机械差速器还是有点秃。当然,今年官方好像已经宣布更换SD5舵机了。由于C车有双电机,可以使用主动差速器,所以建议您选择C车。对于车模的机械结构搭建,可以参考历届优秀团队的技术报告。至于如何查找技术报告,可以在大赛官方网站上找到,卓达博客上也有——第十六届全国大学生智能汽车大赛技术报告及决赛视频下载。我们用筑飞科技的样车来演示一下:
硬件
主控:今年电磁车参加比赛的要求是使用STC单片机参加,所以可以选择龙球或者珠飞STC主板作为主控;
电机驱动:目前比赛中常用的有HIP4082、DRV8701、BTN7971或IR系列加MOS全桥等;
电磁组所需的电感和运放模块:目前最常见的是OP2350、LM358、OPA4377等;
电源模块:整个汽车系统所需的电源类型一般为5V、3.3V、12V。需要一个系统的电源管理解决方案。这需要积累。 BUCK和BOOST电路网上有很多解决方案。笔者以前用过德州。 TPS系列仪器。
硬件设计注意事项请参考作者关于抗干扰技术的博客。
练习组车模型
对于不急于比赛但日常训练的练习组来说,如果手头没有现成的车模和之前的计划,建议去淘宝寻找便宜的车模,因为购买自己一套就得几千块钱星空体育app官方下载,而且都是学生。这也不是一个小数目。您可以参考下图,了解使用舵机进行转向和带有编码器的后轮电机的车型。一套带锂电池大概300左右。(图片来自某宝、VANBOT教育机器人自营店)
由于原理几乎相同,所以用这款车模型进行练习非常划算,而且还可以保留它参加其他比赛。
硬件方案
电机驱动:购买了该车型的同学也可以直接使用配套的电机驱动,或者使用L298N、TB6612等电动驱动。
主控:建议使用带片内ADC的主控。可选择STM32、STC32、STC16、MSP430。您只需选择您熟悉的即可。
电磁传感器:可以从龙球或伦曲科技购买。
电源:使用2个18650和1个LM2596降压模块。
如果觉得麻烦,可以直接购买午餐科技的学习版小车,如下图:
当然,手头最好有以前的芯片和解决方案,这样可以无缝对接竞争对手。 K66、K60等方案已经不再使用,但是网上有很多资料,这些处理器的性能对于实践来说是绰绰有余的。
整车原理
准备好上面的硬件之后,我们来看看整个小车的工作原理。汽车要想在赛道上正常行驶,就必须根据赛道的状态实时调整车身姿态。那么,电磁车如何获取轨迹信息,如何实现转向。
轨迹信息采集及转向原理工字电感
电磁车通过获取轨道信号发生器产生的信号来获取轨道信息。轨道中间会有一条磁感应线,产生交变电磁信号。小车可以通过前视上的感应器获取轨迹信息。感应器为什么能获取轨迹信息?其实很容易理解。电磁感应就是形象的。当导体切割磁力线时,就会产生感应电动势。 I型电感内部 导线切割信号线产生的磁场会在电感引脚处感应出电动势。电感器距离磁场越近,产生的感应电动势越大;距离越远,产生的感应电动势越小。
(有关电感的频率分布以及各节点信号状态的信息,可以查看作者的硬件文章)。
运放模块
工字形电感产生的感应电动势是一个很小的交流信号。单片机无法采集和处理这种小电压交变信号,因此需要在后期添加峰值检测和放大运放电路来选择交变信号的频率。 ,检测然后置于合适的倍数,输出单片机ADC可以采集的直流信号,将感应电机的大小转换成单片机ADC采集的数字作为输入量。
转向原理
了解了单个感应器获取赛道信息的原理后,为了让汽车能够在赛道上行驶,至少会用到左右两个感应器。 ADC采集经过运放处理后的感应电动势值,计算偏差。方法是直接将左、右电感采集值之差(或差值比例并计算)来确定轨道信息。将差值比和计算出的偏差与舵机的pwm占空比按一定比例关联起来,控制转向角,进而控制小车。转向。参考下表
系列1是左右电感直接差值的波形,系列2是通过差值比与总和计算得到的波形。可以看出,系列2的波形比系列1更加平滑,有利于控制系统的跟随。
具体原则:
如下图所示,当小车处于位置2时,左右两个电感之间的距离与信号相同,周围磁场的强度基本相同,产生的感应电动势也差不多,左右电感值的差值比和计算出的偏差也为0,舵机位于中间,保持小车直线行驶。
当汽车处于位置3时星空综合体育app下载,由于曲线的原因,左侧电感靠近信号线,磁场更强。产生的感应电动势比右侧电感器的感应电动势大。左右电感的差异比和计算出的偏差非常大。这个偏差被输出到舵机星空·综合体育官网入口,让小车左转,消除这个偏差。
当汽车遇到右转轨道时,两个电感器的状态正好相反。这时就需要右转来抵消两者的偏差。
详细介绍可以参考这篇文章——《学习制作智能汽车——电磁研究》。
元素判断
从图中可以看出,理论上当汽车经过三个岔路口、环岛和十字路口时,左右电感器的电感值会接近磁感线。通过检测这个特征,就可以进行识别。为了防止误判,可以加中间电感或加斜坡。放置一个电感器以帮助判断。电感器只有在线圈切割磁场时才能产生感应电动势。当线圈与磁场平行时,没有感应电动势。然而,在这些特殊元件中,原本不切断磁场的电感器可能会突然切断磁力线。这就留给大家自己去琢磨了。玩。
这是一个想法,看看图片:
电机及舵机控制原理
舵机和电机均采用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);
}
需要完整代码的同学可以去作者的资源自行下载,也可以到文末的链接查找完成代码。
欣赏效果
总结
电磁车的介绍到此结束。本文主要总结了整车的思路。详细内容需要阅读作者之前的介绍。我们不提供解决方案或出售信息。文章如有不足之处,欢迎指出。祝愿大家都能用自己的车取得满意的成绩。笔者在评论区等待您的赛后分享。
智能汽车系列文章汇总
浅谈智能汽车-硬件
浅谈智能汽车——方向控制
浅谈智能汽车——电机控制
浅谈智能汽车——图片
浅谈智能汽车——控制规则
浅谈智能汽车-流程通道
浅谈智能汽车-抗干扰技术硬件
浅谈智能汽车——抗干扰技术软件
浅谈智能汽车——让汽车一步步跑起来(电磁篇)
第十七届智能汽车越野硬件篇-无刷电机驱动
无刷驱动设计-浅谈MOS驱动电路
鑫源力创EDA训练营-无刷电机驱动
我要评论