stm32平衡小车制作遇到的问题和解决方案分享

这篇具有很好参考价值的文章主要介绍了stm32平衡小车制作遇到的问题和解决方案分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题总览

        1、电机带负载所引起的死区补偿问题

        2、利用MPU6050传感器进行某一轴的角度测量问题

        3、stm32串口通讯得到的数据用DMA转运问题

一、电机带负载所引起的死区补偿问题

        我选用的电机为直流减速电机,型号为GA25-370,是12V的电机。

        电机运行分为带负载和不带负载的两种情况:不带负载的电机转速呈现饱和特性,带负载的电机转速呈现有死区的饱和特性。制作平衡车的时候不会让电机满速运行,所以我们可以近似地看做为线性特性和死区特性。平衡车一定是带负载的,那我们如何补偿呢?这里分享我的方法。

        直流电机调速方案比较简单,就是用PWM波进行调速。一个最简单粗暴的方法就是直接在PID控制的结果中,加上一个数,这个数就是死区的△值。这样的话测量死区△值也很简单,只需将小车平放在地上,失能PID运算,并逐渐提高PWM值,小车轮胎即将运动的时刻所输出的PWM占空比值即为我们所要的死区△的值,记录并写进程序即可。但上述办法有一个弊端,电机的死区主要来源是轮胎的摩擦力(其他的力比如空气阻力可忽略不计),轮胎的摩擦力并不是一成不变的,也就是说△的值是一个时变的量,这种方法补偿的实际效果是小车有一个低频抖动且无法通过改变PID值进行消除。

        第二种方法比较复杂,需要修改直立环的程序逻辑,我们在用第一种方法得到死区△的值后,减去适量的数a进行补偿(此时补偿值为△-a),或者不补偿也可(此时补偿值为0)。之后在直立环的函数里,当角度偏差小的时候(比如±3°),kp选用较大的数,同时结合补偿(△-a或者0)保证小幅偏差可以让小车启动;当角度偏差大的时候,kp选用较小的数,同时结合补偿(△)能保证小车回正即可。这种方法补偿的实际效果可以减轻上一个方法的低频抖动问题,但是小车的抗干扰能力不会太强。

二、利用MPU6050传感器进行某一轴的角度测量问题

        我们计算偏角普遍是用两种方法:一种是获得重力加速度在x轴和z轴(根据传感器安装不同,选取的两个轴也会有所不同)上分量,通过反正切函数获得,我们设为angle1;另一种方法是获得y轴角速度,对角速度积分获得角度,我们设为angle2。但这两种方法各有利弊:第一种方法适合在静止的时候使用,第二种方法适合在运动的时候使用。

        针对上述两种方法的利弊,我们有两种滤波算法可以使用。

        // 第一种算法为一阶滤波算法,在平衡小车上应用就是:k1*angle1 + (1-k1) *angle2,k1为滤波系数,k1∈[0,1]。对于k1的值,我们通常选用0.03,也就是说我们更偏向于angle2所计算的角度,而不是angle1。为什么呢,是因为小车在平衡的过程中,是不断运动着的,angle2精确度比angle1要高,所以我们更置信于angle2所计算的结果。当然,如果你在编程调试并未使用电机时(也就是说只是看程序运行结果还未上实物),这个滤波算法肯定是不准的,因为它只适合运动的时候进行计算。

        // 第二种算法为卡尔曼滤波算法,这个算法较为复杂,我这里不展开解释其算法过程,只简单介绍原理。卡尔曼滤波算法其实本质上就是猜,是一种有根据地猜,如果你的小车在几乎静止的状态下,卡尔曼滤波更置信于angle1,你的小车在运动的情况下,卡尔曼滤波更置信于angle2,也就是说,卡尔曼滤波在小车的应用上算是更先进的一阶滤波算法,因为它可以根据实际情况调整k1的值。

        根据我的实际应用,这两种算法在平衡小车的上结果几乎一样,分不出哪一个更优劣。不过卡尔曼滤波在只进行数据调试的时候更好用一些。

三、stm32串口通讯得到的数据用DMA转运问题

stm32的DMA外设可以一定程度上减少CPU的运算量,避免中断过多而引起的bug,这里我分享我的USART3的DMA配置(库函数)。文章来源地址https://www.toymoban.com/news/detail-801395.html

#include "stm32f10x.h"                  // Device header

char Usart_DRData;                   //串口数据接收变量

void MyUSART_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);
	
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);                    //选用USART3的RX、TX接口
	
	USART_InitTypeDef USART_InitStruture;
	USART_InitStruture.USART_BaudRate = 9600;
	USART_InitStruture.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruture.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     
                                                     //或运算可以同时配置RX与TX
	USART_InitStruture.USART_Parity = USART_Parity_No;
	USART_InitStruture.USART_StopBits = USART_StopBits_1;
	USART_InitStruture.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART3,&USART_InitStruture);
	

	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	
	DMA_InitTypeDef DMA_InitStruture;
	DMA_InitStruture.DMA_PeripheralBaseAddr = (uint32_t)&USART3 -> DR;//外设接收寄存器地址
	DMA_InitStruture.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
	DMA_InitStruture.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStruture.DMA_MemoryBaseAddr = (uint32_t)(&Usart_DRData);  //传输目标寄存器地址
	DMA_InitStruture.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
	DMA_InitStruture.DMA_MemoryInc = DMA_MemoryInc_Disable;
	DMA_InitStruture.DMA_DIR = DMA_DIR_PeripheralSRC;
	DMA_InitStruture.DMA_BufferSize = 1;        
  //转运的数的个数,我这里就转一个数,所以这里的值可以任意写,如果你转运带包头包尾的数,
  //这个就不能任意写,而且传输目标寄存器地址就得是数组变量,然后DMA_MemoryInc为Enable
  //也就是地址自增,数组的地址都是紧挨着的
	DMA_InitStruture.DMA_Mode = DMA_Mode_Circular;        //循环模式
	DMA_InitStruture.DMA_M2M = DMA_M2M_Disable;
	DMA_InitStruture.DMA_Priority = DMA_Priority_Medium;  
                                                   //优先级,这里就一个DMA通道,可以任意选
	DMA_Init(DMA1_Channel3,&DMA_InitStruture);    //USART3的RX的DMA通道为DMA1的3通道
	                                            //可以通过查找数据手册的DMA1请求映像表得到
	DMA_Cmd(DMA1_Channel3,ENABLE);
	USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE); //使能USART3的RX的DMA转运
	USART_Cmd(USART3,ENABLE);
}
/* 之后Usart_DRData的值即为串口通讯的值 */

到了这里,关于stm32平衡小车制作遇到的问题和解决方案分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32两轮平衡小车原理详解(开源)

    关于STM32两轮平衡车的设计,我想在读者阅读本文之前应该已经有所了解,所以本文的重点是代码的分享和分析。至于具体的原理,我觉得读者不必阅读长篇大论的文章,只需按照本文分享的代码自己亲手制作一辆平衡车,其原理并不言而喻了。 源完整代码工程在文章末尾百

    2024年02月05日
    浏览(20)
  • STM32平衡小车 TB6612电机驱动学习

    单片机引脚的电流一般只有几十个毫安,无法驱动电机,因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。         TB6612FNG可以同时控制两个电机,工作电流1.2A,最大电流3.2A。  VM电机电源正极,是驱动电压输入端(10V), VCC为逻

    2024年02月06日
    浏览(21)
  • 基于STM32的平衡小车设计过程分享(1)

    一、简介 接触STM32开发一段时间了,想用STM32做一个有意思的项目,经历了无数的调参调参再调参,终于让它站稳了,接一下就一步步的跟大家介绍一下,项目的整体实现过程— 二、项目介绍     STM32平衡小车是一种基于STM32芯片的智能小车,它可以通过自动控制来保持平衡

    2024年02月05日
    浏览(36)
  • 毕业分享 stm32智能平衡小车设计与实现

    文章目录 0 前言 1 项目背景 2 设计思路 3 硬件设计 4 软件设计 4.2 直立控制程序设计 4.3 速度控制程序设计 4.4 方向控制程序设计 4.5 关键代码 5 最后 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这

    2024年02月02日
    浏览(25)
  • 从零复刻平衡小车(基于STM32F1)

    本项目是对b站up主的开源项目进行了复刻,平衡车也特别适合作为入门单片机了解控制原理的一个小项目,这里主要记录复刻的过程与心得。         所需工具:焊烙铁、热风枪         首先焊单片机最小系统,包括原理图中的最小系统、电源以及串口通信部分。        

    2023年04月15日
    浏览(21)
  • [CubeMX项目]基于STM32的平衡小车(硬件设计)

    一直以来我都想在本科毕业前完成一个电机相关的实验,之前看了网上比较火热的自平衡莱洛三角形项目后,决心先做一个类似的小项目。因此,我通过学习大量前辈的项目案例,完成了该项目。 本项目的特点是:在需要通信的部分,全部采用STM32自带的硬件接口,使用自己

    2024年02月03日
    浏览(22)
  • STM32平衡小车01——基于FreeRTOS实现串口接收数据(HC05)

    1.实现功能 手机数据——HC05——USART2——STM32解析收到的数据——USART1——电脑串口软件显示4个SHORT ①数据格式 手机数据为12字节,包头为0xA5、包尾为0x5A、倒数第二位为校验位(为纯数据低八位的和) ②手机端APP ③电脑串口软件显示4个SHORT 2.实验环境 开发板为STM32F103CCU6 连

    2024年02月03日
    浏览(26)
  • 移植FreeRTOS的STM32F103双轮平衡小车(开源,代码文末)

    耗时大概三四天吧,主要时间还是花在硬件方面上, 目录 引言 1、系统概述 1.1、设计任务 1.2、设计要求 1.3、硬件清单 2、方案设计与论证 2.1、芯片选择方案芯片 2.2 、系统概述 2.3、设计要求 2.4、系统总体设计 2.5、重要功能模块程序实现原理分析 2.5.1、MPU6050模块的介绍 小

    2024年01月20日
    浏览(22)
  • stm32平衡小车--(1)JGB-520减速电机+tb6612(附测试代码)

                                        这是我用的电机,红色框框中的就是 编码器 。 编码器是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。按照读出方

    2024年02月04日
    浏览(203)
  • 毕设开源 基于stm32的智能平衡小车 - 单片机 物联网嵌入式

    文章目录 0 前言 1 项目背景 2 设计思路 3 硬件设计 4 软件设计 4.2 直立控制程序设计 4.3 速度控制程序设计 4.4 方向控制程序设计 4.5 关键代码 5 最后 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这

    2024年02月22日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包