平衡小车学习总结

2023-11-17

1、平衡小车硬件选择

带编码器的直流减速电机(两个)、18650电池组、平衡车支架、MPU-6050陀螺仪、stm32f103c8t6、OLED,iic通信协议(0.96寸)、TB6612、

2、硬件准备阶段

根据电路原理,平衡小车电路板,单片机供电电路,模块供电电路,同时可以多加几个串口用于拓展。完成平衡小车基本架构的组装。同时向商家获取每个模块的数据手册便于使用。

3、单片机基础

在做平衡小车之前应该学会stm32的PWM输出,IO口模式的配置,IIC协议,熟练使用OLED显示屏、定时器中断,定时器编码器模式。单片机基础可以通过正点原子的视频完成。

4、MPU-6050模块OLED姿态角显示

首先完成两路IIC协议的编程整合,由于初学对寄存器的使用并不熟练,从网上找到的替代寄存器修改IO口模式的IIC代码

void MPU_SDA_OUT(void)
{
    GPIO_InitTypeDef GPIO_InitStructer;
    GPIO_InitStructer.GPIO_Pin= GPIO_Pin_9;
    GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructer);
}

void MPU_SDA_IN(void)
{
    GPIO_InitTypeDef GPIO_InitStructer;
    GPIO_InitStructer.GPIO_Pin= GPIO_Pin_9;
    GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructer);
}

修改对应IO口后使用正点原子的MPU-6050课程代码进行初始化,一开始使用杜邦线进行MPU-6050的连接几乎无法初始化成功,尝试了很久最后才发现不能用杜邦线进行IIC通信,所以就直接将MPU-6050,插在排孔中最后成功通信,在用OLED对显示位置的调整最终完成MPU-6050的显示和数据获取

while(mpu_dmp_init())
 	{
		b=mpu_dmp_init();
    OLED_ShowString(0,6,"ASCII:",16); 
    OLED_ShowNum(64,6,b,3,16);
		delay_ms(200);
	} 
  MPU6050_EXTI_Init();	
	OLED_Clear(0); 
	while(1)
	{
	if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
	{
      temp=MPU_Get_Temperature();	//µÃµ½Î¶ÈÖµ
			MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//µÃµ½¼ÓËٶȴ«¸ÐÆ÷Êý¾Ý
			MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//µÃµ½ÍÓÂÝÒÇÊý¾Ý
	}
	    p=pitch;
	    r=roll;
	    y=yaw;
	if(pitch>=0)
	{
	OLED_ShowString(0,1,"pit",16);
  OLED_ShowString(38,1,"+",16);		
	  OLED_ShowNum(44,1,p,2,16);
	  OLED_ShowString(68,1,".",16);  
	  delay_ms(10);
	  l=pitch;
	  l-=p;
	  l*=1000;
	  OLED_ShowNum(74,1,(int)l,3,16);
	}
	if(pitch<0)
	{
	p=-pitch;
  OLED_ShowString(0,1,"pit",16);
	OLED_ShowString(38,1,"-",16);  
	OLED_ShowNum(44,1,p,2,16);
	  OLED_ShowString(68,1,".",16);  
	  delay_ms(10);
	  l=-pitch;
	  l-=p;
	  l*=1000;
	  OLED_ShowNum(74,1,(int)l,3,16);
	}
	if(roll>=0)
	{
		OLED_ShowString(0,3,"roll",16);
		OLED_ShowString(38,3,"+",16); 
	  OLED_ShowNum(44,3,r,2,16);
	  OLED_ShowString(68,3,".",16);  
	  delay_ms(10);
	  l=roll;
	  l-=r;
	  l*=1000;
	  OLED_ShowNum(74,3,(int)l,3,16);
	}
	if(roll<0)
	{
		r=-roll;
	 OLED_ShowString(0,3,"roll",16);
		OLED_ShowString(38,3,"-",16); 
	OLED_ShowNum(44,3,r,2,16);
	  OLED_ShowString(68,3,".",16);  
	  delay_ms(10);
	  l=-roll;
	  l-=r;
	  l*=1000;
	  OLED_ShowNum(74,3,(int)l,3,16);
	
	
	}
	if(yaw>=0)
	{
		OLED_ShowString(0,6,"yaw",16);
		OLED_ShowString(38,6,"+",16); 
	  OLED_ShowNum(44,6,y,2,16);
	  OLED_ShowString(68,6,".",16);  
	  delay_ms(10);
	  l=yaw;
	  l-=y;
	  l*=1000;
	  OLED_ShowNum(74,6,(int)l,3,16);
	}
	if(yaw<0)
	{
		y=-yaw;
		OLED_ShowString(0,6,"yaw",16);
		OLED_ShowString(38,6,"-",16);  
	  OLED_ShowNum(44,6,y,2,16);
	  OLED_ShowString(68,6,".",16);  
	  delay_ms(10);
	  l=-yaw;
	  l-=y;
	  l*=1000;
	  OLED_ShowNum(74,6,(int)l,3,16);
	
	}
}

5、每个模块的整合

在进行整合时注意PWM,定时器编码器的时钟不能冲突,编码器获取到脉冲值就足够。因为我使用的是模拟IIC通信在初始化IIC协议发现PA15无法实现通信,原来在默认情况下PA13,PA14用作SW调试,PA15,PB4,PB3用作JLINK调试,所以无法将PA15直接用作普通IO口。要加入语句

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

6、平衡原理的学习

通过网上查资料可以了解到平衡小车的平衡原理,根据平衡原理写出对应的代码,通过MPU-6050,每5ms产生一次中断进行对小车位置的检测和电机PWM波以及转动方向的控制。在外部中断中实现

void EXTI9_5_IRQHandler(void) 
{

	if(PBin(5)==0)
	{
		EXTI->PR=1<<5;  
	  mpu_dmp_get_data(&pitch,&roll,&yaw);										 //===µÃµ½Å·À­½Ç£¨×Ë̬½Ç£©µÄÊý¾Ý
		MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);								 //===µÃµ½ÍÓÂÝÒÇÊý¾Ý
		Encoder_Left=read_encoder_cnt(2); 
		Encoder_Right=read_encoder_cnt(4);
		UltrasonicWave_Voltage_Counter++;
	
    Balance_Pwm =balance_UP(roll,Mechanical_angle,gyroy); 	
		Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm;                 //===¼ÆËã×óÂÖµç»ú×îÖÕPWM
		Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm; 
		Set_Pwm(Moto1,Moto2);  
	}
}

直立环

int balance_UP(float Angle,float Mechanical_balance,float Gyro)
{  
   float Bias;    
	 int balance;
	 Bias=Angle-Mechanical_balance;    							
	 balance=balance_UP_KP*Bias+balance_UP_KD*Gyro;  
	 return balance;
}

将初次的程序烧录到单片机进行参数的调整,一直到平衡小车用外力推都不会倒下,就完成了平衡小车的直立。

文章使用正点原子代码仅为学习作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平衡小车学习总结 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • ZooKeeper的一些总结

    文章目录 前言 一 Zookeeper是什么 二 Zookeeper用来做什么 三 Zookeeper的优势是什么 四 为什么用zookeeper 五 zookeeper解决了什么问题 总结 前言 Zookeeper作为一个分布式协调服务
  • Dictionary的用法

    Dictionary常用用法 以 key 的类型为 int value的类型为string 为例 1 创建及初始化 Dictionary
  • UNIX网络编程卷一 学习笔记 第二十九章 数据链路访问

    目前大多操作系统都为程序提供访问数据链路层的功能 此功能可提供以下能力 1 能监视由数据链路层接收的分组 使得tcpdump之类的程序能运行 而无需专门的硬件设备来监视分组 如果结合使用网络接口进入混杂模式 promiscuous mode
  • Ubuntu18.04安装Android Studio无法从System Settings下载各种SDK包的报错问题

    前提 1 已经安装好了jdk 打开linux终端测试jdk安装是否成功 java version 可以看到如下信息显示出来 2 安装Android SDK 以上都可以参考文章Ubuntu下安装Android Studio 直到参考文章的这一
  • 使用MySQL创建数据库的语句

    一 mysql怎么创建数据库 MySQL是一个开放源代码的关系型数据库管理系统 创建数据库的首要任务就是了解MySQL如何创建数据库 创建一个MySQL数据库只需要使用CREATE DATABASE语句即可 使用这个语句 您可以指定新数据库
  • antdmessage使用_Antd message 这种组件为什么不需要在Render中使用,只需要在方法中调用...

    一般的引用antd中的组件我们需要 import Button from antd class App extends React Component render return 如上代码所示 需要把import的组件放在我们的render
  • 如何使用大型语言模型与任何 PDF 和图像文件聊天 — 使用代码 构建可以回答有关任何文件的问题的人工智能助手的完整指南

    介绍 PDF 和图像文件中蕴藏着如此多有价值的信息 幸运的是 我们拥有强大的大脑 能够处理这些文件以查找特定信息 这实际上很棒 但是 我们中有多少人内心深处不希望有一个工具可以回答有关给定文档的任何问题 项目的一般工作流程 清楚地了解正在构
  • 小福利,使用python里面的basemap模块和folium模块制作可视化地图

    小福利 使用python里面的basemap模块和folium模块制作可视化地图 首先导入模块 import json folium requests import mimetypes import http client import p
  • spring项目中监控方法执行时间

    当项目规模越来越大时 难免会遇到性能问题 尤其是多系统之间接口调用 所以添加时间监控很有必要 但是由于代码已经上线 所以要保证对代码的侵略性最小 所以Spring AOP可以解决这个问题 首先定义监控方法 package com proje
  • Java实现定义员工类的实例

    文章目录 定义员工类的实例 题目 准备知识 标准JavaBean static关键字的使用 源代码 定义员工类的实例 题目 需求 请完成一个标准实体类的设计 并提供如下要求实现 某公司的员工信息系统中 需要定义一个公司的员工类Employe
  • 微服务初始

    今天准备开始学习微服务 使用微服务肯定是因为他有好处 首先了解到的三种架构 传统单体 集群架构 微服务架构 单体架构 有单点问题 如果宕机所有的服务都不可用 所有业务的功能模块都聚集在一起 如果代码量多 功能之前如果有很多共同的代码 不同业
  • 自写控件:滑动呈现控件(实现了两个以上控件间的切换)我写的

    namespace SyncCenter My public class SlidPanel System Windows Forms UserControl private Dictionary
  • RESTful设计方法

    REST REST 即Representational State Transfer的缩写 维基百科称其为 具象状态传输 国内大部分人理解为 表现层状态转化 RESTful是一种开发理念 维基百科说 REST是设计风格而不是标准 REST描
  • Navicat备份数据库和还原数据库详解

    Navicat备份数据库和还原数据库详解 首先我们知道Navicat备份的数据库文件为XX psc文件 当然也可以备份成XX sql文件 下面我们以常用的XX psc文件为例 来详细操作数据库的备份 其他数据库可视化工具以后再详述 废话不多
  • Nginx配置WS、WSS域名

    文章目录 一 Nginx配置WS 二 Nginx配置WSS 一 Nginx配置WS WS的全称是WebSocket Nginx配置WebSocket也比较简单 只需要在nginx conf文件中进行相应的配置 这种方式很简单 但是很有效 能
  • ssim算法计算图片_图片的相似度--图像结构相似度SSIM

    计算两张图片的相似度 图片结构相似度 SSIM SSIM的全称为structural similarity index 结构相似性 分别从亮度 对比度 结构三方面度量图像相似性 均值作为亮度的估计 标准差作为对比度的估计 协方差作为结构相似
  • 在 Dev-C++ 或 Code::Blocks 下面配置 EasyX !

    前言 EasyX 虽然挺好用 但是目前官方只发布了针对 VC 的使用方法 本文介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 里面 并提供相关的库 平时我工作忙 有问题直接在后面留言 我会尽力修改 注 版本太老的 m
  • 华为校招机试题-查找重复代码-2023年

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给定两行代码 字符串长度 1 lt length lt 100 由英文字母 数字和空格组成 找出两行代
  • mvc:annotation-driven 与 mvc:default-servlet-handler的作用

    本人见解 两个标签需要配合使用 可以很好地处理SpringMVC请求静态资源或者控制器时的选择 静态资源包括图片 jsp css 但是不设置的话访问jsp可以显示 不知原因 下方转发自 https www cnblogs com cyhby
  • 平衡小车学习总结

    1 平衡小车硬件选择 带编码器的直流减速电机 两个 18650电池组 平衡车支架 MPU 6050陀螺仪 stm32f103c8t6 OLED iic通信协议 0 96寸 TB6612 2 硬件准备阶段 根据电路原理 平衡小车电路板 单片机