完整的论文代码见文章末尾 以下为部分内容

摘要

近年来,平衡车在市场上逐渐兴起,很受群众喜欢,其结构简单、节能环保、体积小巧等优势使得它成为很多青年人短距离出行的首选交通工具。不仅如此,平衡车也很受很多科研人员的青睐,为平衡车挖掘出了很多安全且方便的功能。

本设计以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!点击

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐