系列文章目录
?
带编码器的直流减速电机测速
HAL库版 0.96'OLED的使用
HAL库版STM32双轮自平衡车(二) ————?代码分析,PID调参过程(正在写。。。)
目录
系列文章目录
前言
一、物料准备
二、原理图(接线)?
三、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.? 最终引脚配置图?
总结
视频展示:
前言
谁不想圆个平衡小车梦,趁着暑假制作了一个经典小项目——两轮自平衡小车,现在实现的功能仅限于小车自平衡保持直立以及外界干扰(如:手用力推小车)时小车能够以很快的响应速度恢复平衡直立。本文将逐个介绍小车的物料准备、原理图、CubeMX的配置,以及在制作时遇到的一些“大坑”。下一篇文章继续代码分析,PID调参过程的阐述。
文章中有涉及到OLED显示以及直流减速电机的测速,这两部分不再赘述,想要了解的兄弟请移步至我的主页或是点击本文一开始的系列文章目录学习。
一、物料准备
- 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库版代码的编写以及实现。
码字不易,希望喜欢的小伙伴别忘了**点赞+收藏+关注**,你们的肯定就是我创作的动力
欢迎大家积极交流,本文未经允许谢绝转载!!! ?
|