前言

平衡小车制作前前后后也半个多月了,在这段时间里真的很难熬,几经想要放弃,但是还好,最后完成了,演示视频链接,代码链接放在了文章最后,希望大家多多支持


文章目录

  • 前言
  • 一、踩坑之路
    • 1.固件库转hal库的无从下手
    • 2.mpu6050
    • 3.电机驱动选择
    • 4.电源管理
    • 5.PCB设计
  • 二、模块选取
  • 三、各个调试部分的主要代码
    • 1.MPU6050
    • 2.编码器电机
    • 3.蓝牙通信
  • 四、PID调参
    • 1.直立环
      • 比例系数KP的确定
      • 微分系数KD的确定
    • 2.速度环
      • 比例系数KP的确定
      • 积分系数KI的确定
    • 3.转向环
      • 比例系数KP的确定
      • 微分系数KD的确定
  • 五、引脚连接
    • 1.初版PCB
  • 总结

一、踩坑之路

1.固件库转hal库的无从下手

刚接触hal库看似很简单,其实有很多问题,因为配置问题,我曾把stm32f103c8t6芯片给锁住了,还以为芯片坏了,最后找到一些博客文章才解决完

2.mpu6050

初次使用这个模块,很陌生,在网上找到了很多文章,才开始敲代码,起初mpu6050无法初始化,程序卡死,后来程序只可以在主循环使用,不可以使用INT引脚外部中断精准定时,至今没有解决,最后使用定时器就10ms精准定时

3.电机驱动选择

开始使用TB6612电机驱动,但是不知道电路的哪里问题,导致芯片烧毁,现在都已经产生阴影了,后又选择a4950,PCB板子也是根据这个设计,但是因为使用a4950模块每个轮子PWM死区都不一样,不易调PID,最后确定L298N为电机驱动模块

4.电源管理

设计PCB时使用的a4950考虑到5V输入,就适用了12-5v降压模块,后又考虑stm32供电为3.3v电压,无奈在PCB又加了一个5-3.3V降压模块

5.PCB设计

没有考虑到OLED的位置,a4950的引脚方向是相反方向,mpu6050的位置没有固定容易松动,影响角度,好的一点是,我把没有用到的引脚引了出来,给我后来改变方案带来了极大的便利。

二、模块选取

1.带编码器的减速电机及周边相关
2.主控芯片STMF103C8T6
3.IIC接口OLED
4.MPU6050–姿态传感器
5.HC05蓝牙模块
6.12转5V,5转3.3V降压模块
7.ADC电源模块
8.12V电源

三、各个调试部分的主要代码

1.MPU6050

初始化

  MX_GPIO_Init();MX_USART2_UART_Init();MX_TIM3_Init(); printf("init=%d\r\n",mpu_dmp_init());while(mpu_dmp_init());        //dmp初始化printf("OK!\r\n");HAL_TIM_Base_Start_IT(&htim3);//每10ms触发一次中断

定时器中断测试

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)//进入中断{mpu_dmp_get_data(&OutMpu.pitch, &OutMpu.roll, &OutMpu.yaw);MPU_Get_Accelerometer(&OutMpu.aacx,&OutMpu.aacy, &OutMpu.aacz);     //加速度传感器数据MPU_Get_Gyroscope(&OutMpu.gyrox, &OutMpu.gyroy, &OutMpu.gyroz);       //得到陀螺仪数据OutMpu.temp=MPU_Get_Temperature();                        //得到温度信息}
}

2.编码器电机

初始化

void TIM_Init(void)
{//定时器1 PWW//2 编码器//3 中段//4 编码器BHAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);//PWM 10kZ 7199HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);   HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);//编码器 HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_Base_Start_IT(&htim3);//每10ms触发一次中断  HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_1);HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_2); }//死区4230;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance ==TIM3){Rcnt = Read_Speed(2);//右轮Lcnt = -Read_Speed(4);if(dir == 1)PWM++;else PWM--;Set_Pwm(PWM,PWM);//zuo you}
}

3.蓝牙通信

中断接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART2){abc=HAL_UART_Receive_IT(&huart2,UART_Receive_buffer, 1);if(UART_Receive_buffer[0]=='A'){printf("\r\nYou send data : %d\n",UART_Receive_buffer[0]);}else printf("\r\ntest");HAL_UART_Transmit(&huart2,UART_Receive_buffer,1,0xffff);}
}

四、PID调参

1.直立环

比例系数KP的确定

  1. 使微分系数KD参数置零
  2. 随便选则一个数,判断电机旋转极性,确定小车向前倾,车轮向前转
  3. 计算电机PWM驱动死区,例如我的小车死区是4000,PWM最大值为7200,假设俯仰角为10度,则(7200-4000)/10=320,那么我的KP范围为0-320
  4. 取中间值KP,调整参数,直到小车可以平衡一段时间,此时Kp就确定了

微分系数KD的确定

  1. 同样的方法,使比例系数KP参数置零
  2. 判断极性
  3. 计算KD范围
  4. 调参,使小车可以平衡一段时间

最后KP,KD同时控制PWM,参数*0.6,就是最后的KP,KD

2.速度环

比例系数KP的确定

  1. 极性的确定,关闭直立环的影响,随意设定一个KP值,KI等于KP/200,转动一个轮子,另一个轮子 也向同一方向转动,极性正确
  2. 计算KP范围KP=(7200-4000)/(160*40%)=50,及KP范围(0-50)
  3. 取中间值,打开直立环的作用,根据小车状态改变参数

积分系数KI的确定

1.KI等于KP/200

3.转向环

比例系数KP的确定

1.根据死区计算的PWM上升空间最大值为3200,那么两个轮子及各为1600的转向PWM空间
2.根据目标角度,偏转角度,Turn=-Turn_TargetPID.Turn_KP-gyroPID.Turn_KD;即可算的范围

微分系数KD的确定

1.Kd = Kp/100;

五、引脚连接

1.初版PCB

电机驱动模块最终修改为了L298N。

总结

平衡小车的制作,前期是真的很难熬的,一旦你坚持完成了,你会发现原来好像也没什么,非常感谢CSDN开源博主的资源,实验室学长的支持,B站资源,代码整理后会开源放在这里,希望对大家有所帮助,也希望大家可以帮助更多的人。
百度网盘代码
链接:https://pan.baidu.com/s/11l6evi1tm7rRGBleDvpYqw
提取码:nwei
csdn资源内容和网盘一模一样的

STM32自平衡小车相关推荐

  1. 【开源STM32自平衡小车】 教你如何自己DIY一辆双轮自平衡小车

    [请认准:OpenSir开源达人] 开源STM32自平衡小车 平衡小车开源资料网盘链接: 平衡小车百度网盘资料链接,点击进入 [哔站视频一键三连后,评论区留言邮箱获取提取码(3天内发至邮箱)] 哔站播 ...

  2. STM32 蓝牙平衡小车(一)硬件原理图

    第一篇文章首先介绍平衡小车的硬件组成,对硬件原理图进行详解. 一.硬件结构. 1. 主控板:主控芯片(STM32F103C8T6)+电机驱动芯片(TB6612FNG). 2. 小车框架:平衡车底盘.带 ...

  3. STM32做平衡小车,代码,PCB都现成的,妈妈再也不用担心我的毕业设计了

    ▌一.硬件介绍 主控芯片用的是100脚的STM32F103VET6,陀螺仪用的是MPU6050,电机驱动用的是TB6612,蓝牙是汇承的HC05邮票孔封装的,WIFI用的是济南有人科技的USR-WIF ...

  4. 基于stm32的两轮自平衡小车4(软件调试篇)

    本篇是软件调试篇,接上一篇硬件篇:基于stm32的两轮自平衡小车3(硬件篇),本篇内容是对硬件部分的软件实现,具体模块详见目录.这里先上效果:转B站 目录 定时器PWM驱动程序 定时器编码器模式驱动程 ...

  5. 【平衡小车分享日记】(一)硬件部分

    大家好!我是大头,平衡小车是我学习了STC51直接上手STM32的第一个项目,作为小白的我借助了CubeMX和FreeRTOS实现了一周内快速上手.目前小车只实现了直立环和速度环的控制,成功后也迫不及 ...

  6. 零基础一周完成平衡小车项目

    最近看到很多小伙伴在后台留言:平衡小车.所以这一期就出一些资源,希望小伙伴少走弯路.对于电子系的本科生来说,基于STM32的平衡小车可以算得上是最好的一个练手项目.大家可能认为做一个平衡小车很难,其实 ...

  7. 基于stm32的两轮自平衡小车3(硬件篇)

    此篇为硬件篇,接上一篇"基于stm32的两轮自平衡小车2(原理篇)".包含自行设计电路板原理图与PCB电路图的过程.详见目录. 目录 stm32管脚分配 硬件原理图 PCB电路图 ...

  8. 基于STM32的二轮自平衡小车

    前言 近年来,移动机器人是目前科学领域比较活跃的领域之一,其应用范围越来越广泛,面临的环境也越来越复杂,这就要求机器人能够适应一些复杂的环境和任务.二轮自平衡机器人正是在这一背景下提出来的,对于制作此 ...

  9. STM32两轮自平衡小车物料采购清单

    最近辞职在家,想学点东西,看了视频教程,觉得枯燥无聊,想着是嵌入式方向的,怎么也要会一些项目吧,便准备开始着手做一些项目,就先从stm32的两轮自平衡小车开始入手吧.以下物料都是自己采购的.主控板是s ...

最新文章

  1. linux网络工程师证书,网络工程师应该考什么证
  2. 共享单车取消月卡优惠 烧钱时代正式结束
  3. gzip压缩後的javascript在ie下不加载
  4. 罗泾数据中心顺利投产 中国太保科技建设正式步入“两地三中心”时代
  5. mysql delimiter 作用
  6. m5310模组数据上传至onenet_硬核干货!基于M5310-A的NB-IoT水表通信模块软件业务逻辑分享...
  7. 陕西国防 c语言第三章实训三答案,C语言程序设计(上)
  8. 本地存储和移动端js框架及bootstrap简介
  9. React中父子组件之间的通信
  10. Java普通工程转换成标准的maven工程
  11. c语言输入的成绩由高到低该怎么,c语言编程:输入学生信息(姓名年龄分数)并按照分数由高到低输出...
  12. 「收藏」其实是欺骗自己
  13. BeanUtils之commons-beanutils
  14. DNS服务器设置正确,DNS服务器配置(DNS各属性详细介绍)
  15. 【Python实例】获取今日零点的datetime
  16. 中专计算机英语听课记录,【听课记录15篇及评析】_英语听课记录及评析_英语听课记录及评析范文5篇...
  17. 面由心生,由脸观心:基于AI的面部微表情分析技术解读
  18. centos各文件夹作用
  19. 【第8章】Java常用核心类
  20. IuCS IuPS IuR IuB Uu接口

热门文章

  1. java腾讯云人脸核身移动浮层H5接入
  2. 如何在linux(ubuntu)下安装字体(给wps安装字体)
  3. ipconfig、ping命令、其他常用网络命令
  4. 2022秋招系列------海康威视
  5. FTP操作命令(windows系统)
  6. 【MATLAB】布朗运动动画仿真
  7. 输入多个单词,统计以指定字母开头的单词个数
  8. 区块链应用(去中心化应用)是什么样的?
  9. 从2020全球前十的数字货币交易所甄别风险
  10. MatLab中矢量图的导出