系列文章目录

编码电机测速

HAL库版 0.96'OLED的使用

HAL库版STM32双轮自平衡车(一) ———代码思路和PID的简单介绍

HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备

HAL库版STM32双轮自平衡车(三) ———代码精讲

HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制

HAL库版STM32双轮自平衡车(五) ———— 调参

完整工程——> 闲鱼搜店铺“黄金独角兽的小店”

完整工程以及学习资料(设置了收费望理解)https://h5.m.goofish.com/item?id=681989715310&ut_sk=1.X2hUgNjQh0QDAMrgZaxtwchr_21407387_1684499716074.copy.detail.681989715310.2209260974794&forceFlush=1&ownerId=9db66f5694ab477fc49456657355a970&un=b92a505ad4316dfe46071105c2583afc&share_crt_v=1&un_site=77&spm=a2159r.13376460.0.0&sp_abtk=common_xianyu_commonInfo&sp_tk=UndhbWRvMlUwNzc%3D&cpp=1&shareurl=true&short_name=h.UEhbs71&bxsign=scd2vrEz8ec8281p2gBEWXb_hK1esb_MFtgLX0U9fHSxWHWEUxw2KDwuHFLf7dA0QUH1VGbvJXD3BKyKhMRbpxqeMktn1Tlm-MUD_wJhhrmkLdpYFWkc1t0KApMVQN8nj5NZvwrV_KDRe53CoD_5Yi2wg&tk=Rwamdo2U077&app=chrome


目录

系列文章目录

前言

一、物料准备

二、原理图(接线) 

三、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以及各模块供电。

电机驱动以及编码器

    

OLED

MPU6050

三、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,通过[(PSC+1)\times (ARR+1)]\div 72000000,可以得到预分频系数为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库版代码的编写以及实现。

码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力


欢迎大家积极交流,本文未经允许谢绝转载!!!
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐