系列文章目录
编码电机测速
HAL库版 0.96'OLED的使用
HAL库版STM32双轮自平衡车(一) ———代码思路和PID的简单介绍
HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备
HAL库版STM32双轮自平衡车(三) ———代码精讲
HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制
HAL库版STM32双轮自平衡车(五) ———— 调参
完整工程——> 闲鱼搜店铺“黄金独角兽的小店”
目录
系列文章目录
前言
一、物料准备
二、原理图(接线)
三、CubeMX的配置
3.1. 时钟树的配置
3.2. SYS配置
3.3. PWM配置
3.4. 定时器编码器模式配置
3.5. MPU6050配置(I2C 1)
3.6. OLED配置(I2C 2)
3.7. MPU6050引脚中断 配置
3.8. GPIO配置(AIN,BIN)
3.9. NVIC配置(最为关键的一步)
3.10. 最终引脚配置图
总结
视频展示:
STM32自平衡小车
前言
上一篇文章介绍了一些PID的基础知识以及阐明了代码编写的思路,看明白了其实就会觉得平衡小车的制作并没有想象中那么难。那么接下来本文将逐个介绍小车的物料准备、原理图、CubeMX的配置,以及在制作时遇到的一些“大坑”。下一篇文章继续代码分析,PID调参过程的阐述。
一、物料准备
stm32f103c8t6最小系统板12V锂电池DC-DC可调降压模块LM2596S(想要不麻烦可以凑活着用,想要更好的可以去B站看看“工科男孙老师”)0.96寸OLED(IIC接口)两路直流电机驱动(用的是DRV8848而不是TB6612,因为TB6612已经停产,价格飞升性价比不高,两者代码相通)带霍尔编码器的直流减速电机(GM25-370,其他型号亦可)mpu6050小车车架,轮子等二、原理图(接线)
这里仅展示小车最核心的接线,DC-DC降压稳压部分详见我在立创上的开源,但如果是用LM2596S模块就是12V输入,输出3.3V给stm32以及各模块供电。
三、CubeMX的配置
3.1. 时钟树的配置
(1)点击RCC,开启HSE,并选择RC或晶体作为时钟源
(2)配置时钟树,最终为右侧显示
3.2. SYS配置
点击SYS,选择Debug为SW模式,这个主要是烧录调试需要
3.3. PWM配置
(1)在TIM2模式选项中配置的通道1,2为PWM模式,其中通道1为PWMA,通道2为PWMB
(2)要设置PWM频率为10KHz,通过,可以得到预分频系数为0,计时周期为7199,并开启自动重装载值
(3) 点击GPIO Settings ,将其设置为复用推挽模式,高速输出
3.4. 定时器编码器模式配置
将TIM3和TIM4都配置成编码器模式,这里仅展示TIM3的相关配置
(1)在TIM3模式选项中将其配置为编码器模式
(2)设置编码器模式为上升沿下降沿都计数,即四分频。其他设置按默认就好。
(3) 点击GPIO Settings ,将其设置为引脚上拉,大多数编码器都是自带上拉电阻的,这一步只是以防万一。
3.5. MPU6050配置(I2C 1)
选择I2C1模式为I2C,并配置为高速模式
3.6. OLED配置(I2C 2)
选择I2C2模式为I2C,并配置为标准模式
3.7. MPU6050引脚中断 配置
(1)将PB12配置为外部引脚中断模式
(2)点击System Core中的GPIO,配置PB12的外部中断为下降沿触发,并设置为上拉模式(因为在mpu6050.c中对mpu进行了初始化设置,具体设置是->使能了INT中断以及设置中断信号低电平有效,设置上拉模式即可以防止外部干扰,还可以在mpu6050采集完数据后产生下降沿脉冲)
这里也给出mpu6050.c中对mpu进行的初始化设置
3.8. GPIO配置(AIN,BIN)
这里要对驱动模块中的AIN1,AIN2,BIN1,BIN2进行配置,AIN,BIN是控制电机正反转的。
其中stm32的PA2, PA3, PA4, PA5分别对应AIN1,AIN2,BIN1,BIN2。它们的设置一致,这里也只给出AIN1(PA2)的相关配置,其他的不再赘述。
(1)将PA2配置为引脚输出模式
(2)点击System Core中的GPIO,配置为:初始为高电平(也可以设置为低电平),推挽输出,无上下拉,高速传输
3.9. NVIC配置(最为关键的一步)
(1) 点击System Core中的NVIC,将优先级分组设置为:2 bit 分给抢占优先级,2 bit 分给响应优先级(子优先级)
(2) 使能外部中断(EXTI12)并设置系统滴答定时器(systick)的抢占优先级高于外部中断的优先级,这里便是我所说的“大坑”之一,如果不这样设置,程序就会卡死在外部中断 下面探究一下具体原因:
首先在结合生成的工程,来看看Systick的时钟配置以及工作流程,systick首先在HAL_Init()函数中被提到,接下来跟进去看看。在HAL_Init()中调用了 HAL_InitTick,之后再到 HAL_InitTick 中查看说明,下图红框框起部分极为重要.
这段英文解释是说,外设中断进程调用HAL_Delay的时候,要特别注意中断的优先级问题,如果systick的中断优先级低于外设中断优先级,会导致一直在外设中断中阻塞,如果外设中调用了HAL_Delay(),一定要保证Systick的中断优先级高于外设中断优先级。
然而我们的EXTI外部中断程序中哪里用到了HAL_Delay()?在读取mpu6050采集的数据中就有用到。
其实查看mpu6050的驱动程序(dmp)不难发现有很多地方用到了HAL_Delay(),例如在mpu_init()函数中就有用到
3.10. 最终引脚配置图
完整工程——> 小黄鱼搜店铺“黄金独角兽的小店”
总结
以上就是系列文章第二篇要讲的内容,本文介绍了CubeMX的相关配置,物料,接线以及其中要注意的“大坑”,之后也就是下一篇文章重点介绍HAL库版代码的编写以及实现。
码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力
欢迎大家积极交流,本文未经允许谢绝转载!!!