遥控小车报告.docx
- 文档编号:29052009
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:16
- 大小:3.87MB
遥控小车报告.docx
《遥控小车报告.docx》由会员分享,可在线阅读,更多相关《遥控小车报告.docx(16页珍藏版)》请在冰豆网上搜索。
遥控小车报告
电子系统设计
基于STM32的无线遥控小车
课程设计
电子信息科学与技术
物理与电子科学学院
2014年05月2日
电工电子中心2009年5月绘制
基于STM32的无线遥控小车
一.任务解析
1、电机驱动方案以及主控芯片选择
2、无线通信模块的驱动和调试
3、软件控制算法
4、STM32主控制板PCB打样及调试
二.方案实施
1方案论证:
1〕电机驱动方案选择:
电机的常用驱动方式有两种:
直流电压驱动,PWM加H桥驱动。
直流
驱动实现简单,但是一般只能实现单向旋转,并且效率低。
PWM加H
桥的驱动方式可以在一组电源的情况下方便实现正反转,H桥工作在
开关状态下,效率高,故采用PWM加H桥的驱动方案。
2〕主控芯片选择:
一路电机需要两路PWM信号来控制正反转以及转速,小车有四个独立的直流电机,所以需要8路PWM。
不管是传统51单片机还是改良型的12单片机都已经不能胜任此任务,这里采用意法半导体公司的STM32F103RBT6芯片作为主控。
STM32F103RBT6有128K的FLASH,20K的SRAM,最高72MHZ工作频率,2个12位ADC(16个通道),支持DMA传输,多达7个定时器,9个通信接口。
强大的性能以及低廉的价格完全可以满足本设计的需求。
2无线模块的驱动和调试
无线通信采用的是挪威NORDIC公司的NRF24L01+芯片。
nRF24L01+是一款高速低功耗集收发于一体的半双工芯片,最大传输速度可以到达2Mbps,工作在全球开放ISM频段,最大0dBm发射功率,免许可证使用。
nRF24L01+集成了所有与RF协议相关的高速信号处理部分,其通信接口采用标准的SPI总线接口。
用51单片机驱动NRF24L01+的做法是软件模拟SPI时序,但是软件模拟的时序存在部分问题:
1〕,软件模拟时序速度慢,2〕稳定度不够高,STM32F103RBT6芯片自带硬件双路SPI,最高速度可以到达18MBits/s,此处的NRF24L01+和OLED都是通过硬件SPI驱动的。
硬件SPI配置的关键代码如下:
SPI_InitTypeDefSPI_InitStructure;//声明SPI结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用AFIO时钟,使用硬件SPI必须先使能复用AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//使能SPI1时钟,使用外设时,必须先使能外设时钟
SPI_Cmd(SPI1,DISABLE);//改变MODE前先禁止SPI
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置为两线全双工模式
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置为主模式
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置为8位数据帧模式
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;//CPOL=0时钟悬空低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//数据捕获于第1个上升沿
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//NSS软件控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;//SPI时钟2分频,72M/2=36MHZ
=SPI_FirstBit_MSB;//MSB/高位在前发送
SPI_InitStructure.SPI_CRCPolynomial=7;
//用来设置CRC校验多项式,提高通信可靠性,大于1即可
SPI_Init(SPI1,&SPI_InitStructure);//根据指定的参数初始化SPI1
SPI_Cmd(SPI1,ENABLE);//使能SPI1
2,软件控制算法
1〕,8路PWM的产生
这里采用PWM加H桥驱动有刷直流电机,一路电机需要两路PWM,来控制正反转以及转速,小车有四个独立的直流电机,所以需要8路PWM。
STM32的每一个TIME有四个通道,每个通道可以独立的配置为PWM输出或者输入CAP模式,这里采用TIM2和TIM4的8个通道来产生需要的8路PWM。
经过实际的测试发现,在相同的占空比下,PWM频率为100HZ左右时电机的转速以及扭力均大于1KHZ,10KHZ。
TIM2和TIM4属于挂接在低速时钟总线APB1的外设,在预分频不等于1时,TIM2和TIM4的时钟源为72MHZ〔系统时钟为72MHZ的情况下〕。
无线模块接收的数据为0~4095,在这里对应0%~100%的占空比,所以在频率为100HZ时,预分频系数选择176分频,重装载值为4095,72MHZ/176/4096=100HZ。
硬件PWM配置关键代码如下:
GPIO_Config(PA,Pin(0)|Pin
(1)|Pin
(2)|Pin(3),AF_PP,Speed_50M);//GPIOA通道0,1,2,3设定为复用推挽输出模式
GPIO_Config(PB,Pin(6)|Pin(7)|Pin(8)|Pin(9),AF_PP,Speed_50M);//GPIOB通道6,7,8,9设定为复用推挽输出模式
TIM_BaseConfig(TIME2,4095,175,TIM_72M,Mode_Up);//72M/(175+1)/(4095+1)=100Hz,设定TIM2四路PWM频率为100HZ
TIM_BaseConfig(TIME4,4095,175,TIM_72M,Mode_Up);//72M/(175+1)/(4095+1)=100Hz,设定TIM4四路PWM频率为100HZ
for(CHx=1;CHx<5;CHx++)
{TIM_PWM_Config(TIME2,CHx,PWM1,High);//配置TIM2四通道PWM为比较输出高模式
TIM_PWM_Config(TIME4,CHx,PWM1,High);//配置TIM4四通道PWM为比较输出高模式
}
2)小车前进/后退以及转弯控制
图1:
L9110典型应用图
如上图1所示,当正转信号端有PWM信号,反转信号端为低电平时,电机正转,此时小车前进。
当正转信号端为低电平,反转信号端有PWM信号时,电机反转,即小车后退,通过控制输入PWM的占空比即可以实现小车速度的调节。
由于市面上卖的四轮驱动小车的四个轮子都是固定的,不能像汽车那样,导向轮可以左右转动,这里采取使左右轮的速度不一致的方式来实现转弯,当左轮速度大,右轮速度小,小车向右转,反之左转。
如果以固定的差值改变左右PWM占空比,这样油门不同的时候就会出问题,例如为了解决这个问题,这里采用比例法,用这个比例系数去乘上油门的值,这样就可以很容易的解决问题。
转弯的关键代码如下:
u16Throttle;//油门
u16Direction;//方向
floatDirL,DirR;//左右轮油门比例
if(Direction>2048)//如果方向值大与2048
{
DirL=1.0;//设置左轮油门比例系数为1
DirR=(4096-Direction)/2048.0;//右轮油门比例系数随着方向值增大而减小
}
Else//如果方向值小与2048
{
DirL=Direction/2048.0;//左轮油门比例系数随着方向值减小而减小
DirR=1.0;//设置右轮油门比例系数为1
}
TIM_SetCompare1(TIM4,0);//设定TIM4通道CHx占空比为0,即为低电平,此时为正转,小车前进
TIM_SetCompare2(TIM4,0);
TIM_SetCompare3(TIM4,0);
TIM_SetCompare4(TIM4,0);
if(Nflag!
=Oflag)//当Nflag!
=oldflag〔车换向时〕时,设置死区延时,防止同一侧两个开关管同时导通烧坏芯片
{
delay_ms(50);
}
TIM_SetCompare1(TIM2,(u32)Thr*DirR);//设定通道CH1占空比,占空比的值由油门值以及油门比例系数共同决定
TIM_SetCompare2(TIM2,(u32)Thr*DirR);//同上
TIM_SetCompare3(TIM2,(u32)Thr*DirL);
TIM_SetCompare4(TIM2,(u32)Thr*DirL);
3〕在实际的测试过程中发现当遥控的油门减小前就突然断电了,小车会保持之前的状态继续运动,这样就会失去控制,很容易出问题。
后来在此基础上想到了看门狗,如果在规定时间里没有向看门狗寄存器里写入特定的数据,就会产生系统复位,当复位后,初始状态下车是停止的,这样一旦接收不到遥控的发来的数据就停止喂狗,系统处于一直复位状态,知道接收到遥控发送的数据,这样就保证了系统的稳定工作。
具体实现代码如下:
IWDG_Config(IWDG_2K5,2500);//配置独立看门狗时钟为2.5K,计数值为2500,1/2500*2500=1s,在1s内喂狗不会产生系统复位
if(STATE==1&&flag!
=0xff)//判断接收标志位,当遥控突然断电后,用串口发现依然能够接收到0XFF的标志位,原因暂时不详
{
IWDG_Feed();//接受到数据后喂狗,1S内没接收到数据产生系统复位
Throttle=RxBuf[0]*256+RxBuf[1];//获得油门值
Direction=RxBuf[2]*256+RxBuf[3];//获得方向值
flag=RxBuf[4];//获得正/反转标志位值
printf("%d%d%d\r\n",Throttle,Direction,flag);//串口打印接收到的数据,便于系统调试
STATE=0;//清空接收标志位
}
为了清晰的观察,系统是否处在复位状态下,这里加了指示灯加以指示,当系统复位时,会观察到灯以1S左右的周期闪烁,当系统正常工作时,灯处于长亮状态。
具体代码如下:
LED=1;//初始复位,状态指示灯不亮
delay_ms(500);//当硬件一直复位时,形成状态灯以1s周期闪烁的效果
while
(1)
{
LED=0;//当系统正常工作时,状态指示灯长亮
3,STM32主控制板PCB打样及调试
1)在进行PCB打样之前,先得进行原理的验证,这块板子的原
理图参考了周兆丰老师以及正点原子的MiniSTM32开发板,在他们的基础上有所增减。
当然,这不是一块纯粹的小车控制板,是一个完整的STM32开发板。
里面的模块很多,这里就只介绍其中一部分。
原理图部分如下:
图2:
串口/USB选择
当1和3,2和4相连是,是串口的功能,当3和5,4和6相连时,是USB功能,这里相对正点原子的少了两个排针,3,4可以作为公用的,减少了排针数目。
图3:
一键下载电路
当然,这个电路不是我原创的啦,是正点原子的,觉得很经典,
在这里说明一下。
下载的时候选择DTR的低电平复位,RTS的高电平进BootLoard。
一键下载电路的具体实现过程:
首先,mcuisp控制DTR输出低电平,则DTR_N输出高,然后RTS置高,则RTS_N输出低,这样Q2导通了,BOOT0被拉高,即实现设置BOOT0为1,同时Q1也会导通,STM32的复位脚被拉低,实现复位。
然后,延时100ms后,mcuisp控制DTR为高电平,则DTR_N输出低电平,RTS维持高电平,则RTS_N继续为低电平,此时STM32的复位引脚,由于Q1不再导通,变为高电平,STM32结束复位,但是BOOT0还是维持为1,从而进入ISP模式,接着mcuisp就可以开始连接STM32,下载代码了,从而实现一键下载。
图4:
通用OELD模块接口
我的这个OLED排母有9个引脚,可能你会觉得奇怪,本来SPI驱动模式的OLED(128*64)市面上常用的一般都只有6个引脚,多的也才7个引脚,为什么要多此一举多弄两个电源引脚呢?
仔细观察之后,你也许会明白,这样做是为了兼容性,当你顺着看的时候可以完全兼容6脚或者7脚的OLED,那么IIC驱动模式的呢,对了,当你从下往上看的时候,会发现正好就是4脚IIC驱动模式的OLED,而且蛮巧的,正好硬件IIC的引脚和硬件SPI的引脚是挨着的,这样在方便布线的同时保证兼容市面上所有接口类型的OLED(单指128*64点),并且在程序上都可以采用硬件功能驱动,可以更快速的显示动态画面。
图5:
TFT彩屏以及正点原子OLED接口
彩屏接口是照着正点原子的原理图画的,因为对彩屏不是太熟悉,加之中等容量的STM32没有FSMC,只能用模拟时序的方式去驱动
彩屏,并且在正点原子的TFT程序功能已经如此丰富的情况下,贸然去大幅度更改会造成不必要的麻烦。
这里也可以兼容正点原子的OLED,他是采用模拟时序的方式驱动的,虽然他的驱动方式灵活〔8080,SPI,IIC可选〕,但是在速度上就比不上硬件驱动了
上几张整体效果图:
三.结果展示
四.经验总结
这次做遥控小车,是源于大二时的想法,当时还没接触到STM32,用来用去都是51,一想到8路PWM就立马感觉无可奈何了。
其实当时也只是一时觉得好玩,想趁着考研之前做点玩的,顺便也挑战一下自己,深入学习一下STM32。
做之前也没想那么多,找到有意愿想做的,一番简单商量之后就开始开工了。
在做的过程中,不断发现问题,一个一个解决问题。
STM32开发板我是自己打了两版的,第一版没有一键下载电路,下载程序不能一键下载,需要通过短路帽选择启动区。
当时画PCB因为不明白那是一键下载电路,就给省掉了。
后来想着既然做,就做的像个样子,于是经过修改调整之后才有了现在这一版。
在小车最后调试阶段,在全速时突然换向,结果导致电机驱动板烧坏,刚开始以为是全速换向瞬时电流太大导致的。
后来换了一块新驱动板,在低速下换向,发现还是烧了。
经过测试,全速换向时,瞬时电流也远没有到达800MA,愣是没想明白问题在哪。
我仔细研究了一下H桥驱动方案,突然发现原来还是程序问题。
因为没有采用悬浮驱动的方式,在换向的时候必须设定死区时间,如果没有设置死区时间,换向时就会导致同侧的功率管同时处于开启状态,由于功率管导通电阻很小,相当于将电源直接短接,流过功率管电流过大,导致芯片烧坏。
东西还是自己亲身做了才会有深刻体会,这次从头到尾做下来也花了不少钱,如果在大二想到花这么多钱去做一件事,想想估计就不会去做了。
现在想想也觉得这点东西不算什么,一是为了好玩,二是为了学点东西,收获也还是蛮丰富的,做东西的时候要考虑周到,多多思考怎么将作品做的更加完美。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遥控 小车 报告