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

文章目录

  • 前言
  • 材料准备
    • 备赛组
      • 车模
      • 硬件
    • 练习组
      • 车模
      • 硬件方案
  • 整车原理
    • 赛道信息获取及转向原理
      • 工字电感
      • 运放模块
      • 转向原理
      • 元素判断
    • 电机及舵机控制原理
  • 代码实现
  • 效果欣赏
  • 总结
  • 17届完赛代码
  • 智能车系列文章汇总

前言

电磁寻迹小车

之前智能车系列已经做了一个比较详细的解析,但是美中不足是知识点被拆的太零散,可能对于新手来说不太友好,所以借着有空就再写一点能让车跑起来的方案。当然,也就仅仅限于可以跑起来,元素以及高级算法就需要车友们自己去整了,主要还是方便新手上道,当然也欢迎大佬们提出建议。本文以电磁四轮为例进行讲解。

材料准备

作为刚接触电磁车的同学,咱们要想跑起来需要四大件,车模、电磁及运放模块、主控及母板、电机驱动;这里笔者打算分成两种组别来推荐方案,一类是手头没有现成车模而且不是今年参赛的练习组,另外一类是今年的参赛组。

备赛组

车模

这里以基础电磁四轮组为例,建议使用C车模,B车的傻蛋5舵机以及机械差速还是有些许的头秃,当然官方今年好像已经宣布了换掉SD5舵机,由于C车是双电机可以使用主动差速,所以建议大家上手选择C车。车模的机械结构搭建可以去参考往届优秀队伍的技术报告,至于怎么找到技术报告,比赛官网有,卓大博客也有——第十六届全国大学智能车竞赛技术报告与总决赛视频下载。借用逐飞科技的示例车来展示一下:
在这里插入图片描述

硬件

主控:电磁车今年参赛要求是使用STC的单片机来参赛,所以就可以选购龙邱或者逐飞STC母板来作为主控;
电机驱动:目前比赛常用的有HIP4082、DRV8701、BTN7971或者IR系列加MOS全桥等;
电磁组所需的电感和运放模块:目前较多的是OP2350、LM358、OPA4377等;
电源模块:整个小车系统所需的电源种类一般是5V、3.3V、12V,需要有一个系统的电源管理方案,这个需要积累,BUCK、BOOST的电路,网上方案也很多,笔者之前使用的是德州仪器的TPS系列。
硬件设计的注意事项可以参考笔者抗干扰技术的那篇博客。

练习组

车模

对于不是急于参赛而是平时训练的练习组,手头如果没有现成的车模和往届的方案的,建议去淘宝找平价车模代替,因为自己一套买下来得个大几千块,都是学生党,这也不是个小数目。可以参考下图这种使用舵机转向而且后轮电机带编码器的车模,加上锂电池这些一套下来300左右。(图片来源于某宝,VANBOT教育机器人自营店)
在这里插入图片描述
由于原理都差不多一样的,练习使用这种车模性价比极高,而且还可以留下来参加其他的比赛。

硬件方案

电机驱动:购买了这种车模的同学也可以直接用配套的电机驱动,或者使用L298N、TB6612这些电驱都可以。
主控:建议使用带片内ADC的主控,STM32,STC32、STC16、MSP430都可以反正选一个自己熟悉的就行了。
电磁传感器:可以购龙邱、或者轮趣科技的。
电源:选用两节18650加一个LM2596的降压模块即可。
如果觉得麻烦,可以直接选购轮趣科技的学习版小车,如下图:
在这里插入图片描述
当然,手头有往届的芯片和方案更好,这样可以无缝衔接到比赛,比如K66、K60这些方案只是现在不用了,但是网上资料多啊,而且这些处理器性能拿来练手绰绰有余。

整车原理

在准备好上面的硬件后,再来捋一下整个小车的运行原理。小车要正常行驶在赛道上,必定是需要实时根据赛道的状态来调整车身姿态的,那么,电磁车是怎么样获取到赛道信息,又是怎样实现转向的呢。

赛道信息获取及转向原理

工字电感

电磁车是通过获取赛道信号发生器产生的信号来来获取赛道信息的,在赛道正中间会有一条磁感线,用来产生交变电磁信号。小车通过前瞻上的电感即可获得到赛道信息,为啥可以电感可以获取赛道信息呢,其实很好理解,电磁感应都映像吧,导体切割磁感线会产生感应电动势,工字电感内部的导线切割信号线产生的磁场,在电感引脚就会有感应电动势。电感距离磁场越近,产生的感应电动势越大,距离越远,产生的感应电动势越小。
请添加图片描述
(有关电感配频以及信号在各个节点的状态可以去笔者的硬件篇查看)。

运放模块

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

转向原理

了解了单个电感获取赛道信息的原理后,为了让小车能够在赛道上行驶,至少会使用左、右两个电感,通过ADC采集经过运放处理的感应电动势值来计算偏差,方法是直接左右电感采集值之差(或者差比和计算)来判断赛道信息,将差比和计算出来的偏差以一定的比例关联到舵机的pwm占空比来控制舵机打角,进而控制小车进行转向。参考下表
其中系列1是左右电感直接作差的波形,系列2是经过差比和计算出来的波形,可见系列2的波形比系列1更加平滑,这有利于控制系统的跟随。
在这里插入图片描述
具体原理:
如下图,小车位于2号位置时,左右两个电感距离信号的距离一样,周围磁场强度也基本一致,产生的感应电动势也是大差不差,左右电感值差比和计算出来的偏差也是0,舵机位于正中间,保持小车直行。
小车位于3号位置时,由于弯道,左边电感距离信号线近,磁场更强,产生的感应电动势要大于右电感的感应电动势,左右电感差比和计算偏差就很大了,将这个偏差输出到舵机,让小车左转来消除这个偏差。
当小车遇见右转赛道时,两个电感的状态刚好相反,此时需要右转来抵消二者偏差。
详细描述参考此文——《学做智能车–电磁探究篇》。
在这里插入图片描述

元素判断

从此图可以看出理论上小车在经过三叉、环岛和十字时,左右两个电感的电感值都会接近磁感线,检测这个特征就可以识别到了,为了防止误判还可以增加一个中间电感或者斜放置电感来辅助判断。电感只有线圈切割磁场时才能产生感应电动势,线圈和磁场平行时是没有感应电动势的,但是在这些特殊元素是,原本没有切割磁场的电感可能突然就切割了磁感线,这里留给大家自己去发挥。
此处提供一个思路,直接看图:
在这里插入图片描述

电机及舵机控制原理

舵机和电机都是通过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 * 100pwm_init(PWMA_CH2P_P62, 10000, 0);     //初始化PWM5  使用引脚P2.5  输出PWM频率10000HZ   占空比为百分之 pwm_duty / PWM_DUTY_MAX * 100pwm_init(PWMA_CH3P_P64, 10000, 0);     //初始化PWM5  使用引脚P2.5  输出PWM频率10000HZ   占空比为百分之 pwm_duty / PWM_DUTY_MAX * 100pwm_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/2adc_init(ADC_P01, ADC_SYSclk_DIV_2);	//初始化ADC,P1.1通道 ,ADC时钟频率:SYSclk/2adc_init(ADC_P05, ADC_SYSclk_DIV_2);	//初始化ADC,P1.2通道 ,ADC时钟频率:SYSclk/2adc_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);}

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

效果欣赏

在这里插入图片描述

总结

有关电磁车的介绍就到此为止,这篇主要是串了一下整个车的思路,细节还需要去看笔者之前的介绍。不提供方案,也不卖资料。文章如有不足欢迎指出,祝大家的小车可以拿到满意的成绩,笔者在评论区等待你们赛后的分享。

17届完赛代码

最近有不少问问题的同学,笔者这边可能回复不是很及时,有需要17届完赛方案和代码的同学可以去海鲜市场,笔者学弟在出售17届方案,价格比较实惠。
【全国大学生第十七届智能车电磁租组2m+代码(全元素+模糊控制】
【第十七届全国大学生智能车竞赛摄像头四轮软硬件资料】
【17届户外极速越野软硬件资料】

智能车系列文章汇总

智能车浅谈——硬件篇
智能车浅谈——方向控制篇
智能车浅谈——电机控制篇
智能车浅谈——图像篇
智能车浅谈——控制规律篇
智能车浅谈——过程通道篇
智能车浅谈——抗干扰技术硬件篇
智能车浅谈——抗干扰技术软件篇
智能车浅谈——手把手让车跑起来(电磁篇)
第十七届智能车越野硬件篇——无刷电机驱动
无刷驱动设计——浅谈MOS驱动电路
芯源&立创EDA训练营——无刷电机驱动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于蒙特卡洛模拟的大规模电动车充电模型构建——附代码

目录 摘要&#xff1a; 1电动车日行驶里程概率分布&#xff1a; 2.电动车充电起始时间概率分布&#xff1a; 3.大规模电动车充电行为蒙特卡洛建模&#xff1a; 3.1&#xff0e;日行驶里程 3.2&#xff0e;开始充电时间 3.3&#xff0e;耗电量 3.4&#xff0e;充电时间 …

【智能车学习】电磁车算法优化总结

目录 前言电感排布方案舵机算法修正分段式PD算法使用函数曲线整定PD参数 电机控制目标速度的确定差速控制算法 特殊元素处理环岛处理防坡道误判 其他辅助结构屏幕显示按键控制与拨码开关 写在最后 前言 随着省赛的落幕&#xff0c;近一年的智能车的生涯也就此画上了句号&#…

基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

电动汽车充电接口通信协议

EV&#xff08;electricity vehicle&#xff09; - 充电接口 - 协议 德标DIN、欧标EN、国际ISO、国标GB对照表&#xff0c;做出口必备资料 在这里插 入图片描述 通讯协议 DIN70121、ISO 15118、GB/T 27930三者都是针对电动汽车充电设施的充电接口通信这种特定应用场景设计的通…

基于Android新能源电动汽车充电服务导航

1系统的基本业务需求 1.1 用户注册与登录模块 1.1.1注册 通过填写用户昵称&#xff0c;手机号码&#xff0c;密码&#xff0c;性别来注册 1.1.2登陆 用户登陆可以通过用户昵称和密码进行登录也可以通过手机短信验证登陆 1.2 用户个人信息模块 1.2.1身份认证&#xff08;实名验证…

基于蒙特卡洛法的规模化电动汽车充电负荷预测(PythonMatlab实现)

目录 0 概述 1 蒙特卡洛模拟方法介绍 2 规模化电动汽车充电负荷预测计算方法 3 完整代码 0 概述 对于本文的研究,依据不同用途电动汽车影响因素的分布函数和设定参数&#xff0c;采用蒙特卡洛法,对各用途电动汽车的日行驶里程、起始充电时间概率分布参数进行随机抽样&#…

罗翔|ChatGPT没法回答的问题

湖南大学法学院 2023-05-21 08:45 发表于湖南 01 人工智能 会不会替代法律行业&#xff1f; “ChatGPT可应用于司法量刑么&#xff1f;”“人工智能会取代法律人吗&#xff1f;” 近日&#xff0c;罗翔在在华南师范大学附属中学以“培育法治信念”为主题作专题报告&#xff…

crmchat客服系统部署

1.安装宝塔面板 安装所需要的软件nginx、mysql和redis 2. 下载源代码&#xff0c;解压 将crmchat压缩 3. 新建站点 上传crmchat压缩包然后解压 4. 安装扩展 安装PHP插件&#xff1a;fileinfo、redis、swoole4 删除PHP对应版本中的 proc_open禁用函数。 5. …

刚刚!ChatGPT-5发布时间定了,这一次将重新彻底引爆

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT4.0发布还没多久&#xff0c;根据ChatGPT NFT Club爆料&#xff0c;ChatGPT将会2023年12月发布。ChatGPT-5将会是跨时代…

Postman 重复发送多个请求

之前 Postman 用的不多&#xff0c;今天需要用&#xff0c;找了下&#xff0c;发现有连续发送多个请求的功能 &#xff1a; 运行即可。但是每个请求的结果好像无法获取。

零代码编程:用ChatGPT自动批量下载电子书并重命名

喜欢在网上寻找电子书资源的肯定了解Z-Library。这是目前互联网最大的电子书网站&#xff0c;不过被封了。有一个网站叫“安娜的档案”&#xff0c;集合了 Z-Library、Library Genesis、Sci-Hub等电子书搜索引擎的资源&#xff0c;网站是https://zh.annas-archive.org/ &#x…

零代码编程:用ChatGPT批量提取网页上的文本信息内容

现在有很多个网页&#xff1a; 要批量提取网页内的文本&#xff1a; 可以在ChatGPT中这样写提示词&#xff1a; 你是一个Python专家&#xff0c;写一段Python程序&#xff0c;完全提取网页文本内容的任务&#xff0c;下面是一步步的步骤&#xff1a; 打开表格文件&#xff0c…

用不同作家风格编写知乎文,练习写作技巧,我竟然发现了这个秘密!

文 / 韩彬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天尝试着用不同作家的风格编写知乎文。 太严肃的文章没人看&#xff0c;所以我要找一些语言幽默的作家&#xff0c;通过模仿他们的风格写文章。 我列举了一些风格幽默较为知名作家&#xff0c;这些作家的作品…

国内大模型研究

自从chatgpt发布以来&#xff0c;国内大模型发展非常迅速。我对这项目技术也保持了非常多的持续关注&#xff0c;我一直认识&#xff0c;chatGPT以及其他GPT会给社会带来更大的变革。经过专业训练的大模型可以替代部分客服&#xff0c;部分程序员&#xff0c;部分美工&#xff…

如何获取用户当前位置并生成国际拨号前缀+验证不同国家的手机号格式

文章目录 前言一、引入并启用API二、js和html页面代码1.js代码2.html代码 三、将原生js写在vue项目中 前言 该demo使用了HTML5的Geolocation API和Google Maps API来获取用户的位置信息&#xff0c;应用libphonenumber库将位置信息转换为国际拨号前缀并在页面默认展示&#xf…

国际手机号码检查纠正 API 接口

国际手机号码检查纠正 API 接口 有效性检查及智能纠正&#xff0c;遵循 E.164 标准&#xff0c;智能统一格式。 1. 产品功能 智能检测国际手机号码有效性&#xff1b;可根据提供的国家编码参数&#xff0c;判断提供的手机号码是否为该国家有效手机号码&#xff1b;智能纠正提…

国际电话区号--各国或地区电话国际区号对照表

具体参考&#xff1a;国际电话区号--各国或地区电话国际区号对照表

ChatGPT与人类大脑相比:揭示AI的优缺点

与人类大脑相比&#xff0c; ChatGPT这种AI机器人拥有一些优点和缺点&#xff0c;下面小编会简单说下 优点&#xff1a; 1. 学习和处理速度&#xff1a; ChatGPT能够快速处理和学习大量信息&#xff0c;比人类大脑更快。 2. 综合知识&#xff1a; ChatGPT可以整合大量来自各个…

ChatGPT 和 Elasticsearch:分面、过滤和更多上下文

作者&#xff1a;Luca Wintergerst 在最近的一篇博客文章中&#xff0c;我们讨论了 ChatGPT 和 Elasticsearch 如何协同工作以帮助更有效地管理专有数据。 通过利用 Elasticsearch 的搜索功能和 ChatGPT 的上下文理解&#xff0c;我们演示了如何改进结果。 在这篇文章中&#…

Elasticsearch:如何使用 Elasticsearch 以自然语言提示 ChatGPT

作者&#xff1a;Enrico Zimuel 这些天每个人都在谈论 ChatGPT。 这种大型语言模型 (LLM) 的一项很酷的功能是能够生成代码。 我们用它来生成 Elasticsearch DSL 查询。 目标是在 Elasticsearch 中搜索 “给我股票指数中 2017 年的前 10 个文档&#xff08;Give me the first 1…