遥控小车报告.docx

上传人:b****7 文档编号:9283066 上传时间:2023-02-04 格式:DOCX 页数:16 大小:3.87MB
下载 相关 举报
遥控小车报告.docx_第1页
第1页 / 共16页
遥控小车报告.docx_第2页
第2页 / 共16页
遥控小车报告.docx_第3页
第3页 / 共16页
遥控小车报告.docx_第4页
第4页 / 共16页
遥控小车报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

遥控小车报告.docx

《遥控小车报告.docx》由会员分享,可在线阅读,更多相关《遥控小车报告.docx(16页珍藏版)》请在冰豆网上搜索。

遥控小车报告.docx

遥控小车报告

遥控小车报告

电子系统设计

基于STM32的无线遥控小车

课程设计

黄光普2011112020433

电子信息科学与技术

物理与电子科学学院

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,工作在2.4GHz全球开放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_InitStructure.SPI_FirstBit=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桥驱动方案,突然发现原来还是程序问题。

因为没有采用悬浮驱动的方式,在换向的时候必须设定死区时间,如果没有设置死区时间,换向时就会导致同侧的功率管同时处于开启状态,由于功率管导通电阻很小,相当于将电源直接短接,流过功率管电流过大,导致芯片烧坏。

东西还是自己亲身做了才会有深刻体会,这次从头到尾做下来也花了不少钱,如果在大二想到花这么多钱去做一件事,想想估计就不会去做了。

现在想想也觉得这点东西不算什么,一是为了好玩,二是为了学点东西,收获也还是蛮丰富的,做东西的时候要考虑周到,多多思考怎么将作品做的更加完美。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1