毕业设计项目——基于STM32平衡车的设计与实现(代码/论文)
完整的论文代码见文章末尾 以下为部分内容
摘要
近年来,平衡车在市场上逐渐兴起,很受群众喜欢,其结构简单、节能环保、体积小巧等优势使得它成为很多青年人短距离出行的首选交通工具。不仅如此,平衡车也很受很多科研人员的青睐,为平衡车挖掘出了很多安全且方便的功能。
本设计以STM32F103RCT6为主控芯片,采用MPU6050获取自身姿态,加速度、角速度等姿态数据。采用脉冲宽度调制技术控制电机转速,通过霍尔编码器获取电机转速,结合平衡车姿态数据达成闭环控制。采用SU03T语音识别模块与用户交互,实现语音控制小车完成指定动作。同时采用HC-05蓝牙模块,结合手机软件实现了用户手动控制小车完成指定动作。采用HC-SR04模块测量前方距离,实现了平衡车避障功能。
系统设计
总体框图

图2-1为本设计的系统总体框图,它诠释了在软件部分,各个模块和单片机之间的关系。图中,三轴加速器模块(MPU6050)、超声波模块、电机编码器模块、按键模块、语音识别模块为输入模块,他们给单片机提供了各种数据信息。LCD显示模块、无线通信模块、电机驱动模块、语音播报模块为输出模块,需要向外输出或显示的数据可以向他们输出。
主控芯片选型
在本设计中,需要使用2个串口、5个定时器、21个IO管脚,因此选用ST公司生产的STM32F103RCT6芯片,STM32F103RCT6共有8个定时器、5个串口。内部Flash有256Kbytes,RAM有48Kbytes,并且市场上价格较低满足设计需求。在网上随处可以找到STM32F103RCT6相关资料和外设配置代码,减小了开发难度,提高了开发效率。

STM32F103RCT6实物图,STM32F103RCT6有64个引脚,其中IO口有51个,Cortex-M3内核,工作频率高达72MHz,在ST官方网站上有数据手册,并且在网络上可以下载到参考手册。
STM32F103RCT6需要晶振提供时钟,由官方提供的数据手册上可知,芯片系统时钟最大可达72MHz,想要让芯片达到最大工作效率,就需要提供72MHz的系统时钟。
STM32F103RCT6芯片的时钟源有4个,分别是HSE(外部高速时钟)、LSE(外部低速时钟)、HSI(内部高速时钟)、LSI(内部低速时钟)。因为HSI、LSI不够精准,所以选择外部时钟,HSE、LSE需要外接晶振,LSE(外部低速时钟)需要外接32.768KHz,频率不足达到使用需求,因此选择HSE(外部高速时钟)作为时钟源,由于本设计需要系统时钟达到72MHz,因此选择8MHz晶振,PLLMUL进行9倍频之后就可以达到72MHz。
ST官方为了防止程序意外进入无限循环或者出现硬件错误,为STM32F103RCT6设置了NRST复位管脚,复位管脚内部上拉,默认检测高电平,当检测到低电平后芯片就会复位,重新运行程序。
焊接板

当旋转或者晃动小车时,姿态角会发生变化,当小车趋于平衡状态时,俯仰角和翻滚角趋于0°。所示测试数据是角速度,当缓慢转动平衡车时,各角速度值会很小,当快速转动平衡车时,各角速度值会急速增大。经过测试,MPU6050姿态数据获取正常,且响应非常及时。
部分核心代码
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "motor.h"
#include "encoder.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "pid.h"
#include "bluetooth.h"
#include "bsp_lcd.h"
#include "display.h"
#include "tracking.h"
#include "hcrs04.h"
#include "su03t.h"
extern short gyrox,gyroy,gyroz; //陀螺仪原始数据
extern float pitch,roll,yaw; //欧拉角
u8 control_flag = 0; //控制方式标志位 1:蓝牙控制 0:语音控制
u8 hcrs04_flag = 0; //测距标志位
u8 Tracking_flag = 0;
u8 XJ_flag = 0;
float distance = 0.00; //测量距离
extern int Encoder_Left,Encoder_Right; //左右编码器的脉冲计数
int ret;
uint8_t srt_buf[100] = {0};
int main(void)
{
float ret = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
LED_Init(); //led初始化
MPU_Init(); //mpu6050初始化
while(mpu_dmp_init()) //led快闪为mpu6050有问题
{
LED0=!LED0;
delay_ms(200);
}
MiniBalance_PWM_Init(7199,0); //电机初始化
Encoder_Init(); //编码器初始化
Hcsr04Init(); //超声波模块初始化
TIM3_Config(999,71); //PID数据采集及计算定时器(1ms)
SU03T_Config(115200); //语音模块初始化
LCD_Init(); //LCD显示屏初始化
LCD_Fill(0,0,130,130,BLACK); //屏幕底色-》黑色
LCD_ShowChinese(0,0,"郑州升达",WHITE,BLACK,24,0);
Bluetooth_Init(9600);
while(1)
{
if(bluetooth_time >= 50)
{
bluetooth_time = 0;
Bluetooth_DataAnalyze();
}
if(hc_time >= 50)
{
hc_time = 0;
ret = Hcsr04GetLength();
if(ret != 0)
{
distance = ret;
}
if(distance < 20.0)
{
Flag_Left = 1;
delay_ms(200);
Flag_Left = 0;
}
}
}
}
获取方式
点击这里,获取code和paper!点击
更多推荐



所有评论(0)