给新手的两轮自平衡小车开发实战指南
  • Introduction
  • 前言
    • 前言
    • 推荐学习路线
  • 套件上手
    • 必看开箱组装
    • 参数特点一览
    • 蓝牙遥控模式
    • 红外循迹模式
    • 超声跟随模式
    • 超声避障模式
    • 提起识别
    • 着陆识别
    • OLED显示说明
    • 烧录程序指南
    • 修改遥控APP
    • 修改开机模式
    • 硬件组成概述
    • IO引脚分配
    • 软件功能说明
    • 程序框架介绍
    • 分析排除故障
  • 原理分析篇
    • 平衡原理
    • 动力学分析
    • 数学建模
    • Simulink仿真
  • 电路开发篇
    • 系统框架一览
    • 主控模块
    • 稳压模块
    • 驱动模块
    • 蓝牙模块
    • 传感器模块
    • 底板功能说明
    • 电机参数说明
    • 洞洞板底板手工焊接教程
  • 软件开发篇
    • 约定代码编写规则
    • 安装MDK-ARM软件
    • 使用MDK-ARM软件编译代码
    • 安装STM32CubeMX软件
    • STM32CubeMX软件生成工程
    • GPIO与LED闪烁的仪式感
    • Timer与按键消抖的应用
    • Usart与Printf函数重定向
    • Timer编码器模式读取编码器
    • PWM与TB6612FNG驱动电机
    • 硬件I2C读取MPU6050原始数据
    • 加速度计、陀螺仪的工作原理和数据融合
    • MPU6050姿态解算和数据融合
    • PID控制原理与增量式PID算法
    • 电机速度闭环内环PID控制
    • 直立平衡角度环PID控制
    • 运动速度闭环外环PID控制
    • 提高PWM频率为24kHz
    • 移植U8g2单色图形库驱动OLED
  • 其他
    • 扩展投稿
由 GitBook 提供支持
在本页
  • 预先了解
  • 具体步骤

这有帮助吗?

  1. 软件开发篇

PWM与TB6612FNG驱动电机

上一页Timer编码器模式读取编码器下一页硬件I2C读取MPU6050原始数据

最后更新于5年前

这有帮助吗?

本小节教你使用 STM32CubeMX 配置 PWM,并通过控制 TB6612FNG 电机驱动芯片驱动电机的转速和方向。

预先了解

STM32 与 TB6612FNG 的主要接线:

  • PB0 --> AIN1

  • PB1 --> AIN2

  • PA3 --> BIN1

  • PA4 --> BIN2

  • TIM3_CH1 --> PWMA

  • TIM3_CH2 --> PWMB

TB6612FNG 电机驱动芯片,内置双 H 桥,可以驱动两个直流电机。其中,PWMA、AIN1、AIN2 为一组控制引脚,PWMA 为 PWM 速度控制引脚,AIN1、AIN2 为方向控制引脚;PWMB、BIN1、BIN2 为一组控制引脚,PWMB 为 PWM 速度控制引脚,BIN1、BIN2 为方向控制引脚。

具体步骤

在上一小节中,我们配置定时器 TIM4 的编码器接口模式,在转动电机时能读取小车右侧电机编码器的脉冲数据。接下来,我们以配置右侧电机的相关控制引脚(TIM3_CH2、PA3、PA4)为例,进行具体的说明。

驱动电机的 PWM 频率一般用 10kHz(0.0001ms),而且 TIM3 定时器是挂在 PAB1 时钟上,所以系统时钟 TIMx_CNT = 72MHz = 72000000Hz,设置 TIMx_PSC = 72,那么 TIMx_ARR = (TIMx_CNT/TIMx_PSC)* 0.1ms = (72000000/72)*0.0001 = 100。

进入我们上一小节修改过的 MiaowLabs-Demo 文件夹,找到 MiaowLabs-Demo.ioc 工程文件,双击,打开工程。在左侧 Pinout&Configuration 界面中的 Timers 下拉中点击 TIM3,然后在 TIM3 Mode and Configuration 的 Mode 中将 Channel2 选择为 PWM Generation CH2,并在下方的参数设置选项卡中将 Prescaler 设为 72,即预分频系数(TIMx_PSC)设为 72;Counter Period 设为 100,即计数周期(自动加载值 TIMx_ARR)设为 100;Pulse 设为 100,即占空比设置为 100%。

点击 GENERATE CODE,重新生成代码。

打开 MDK-ARM 工程,左侧 Application/User main.c 源文件的 main 函数里可以看到多出一个 TIM3 初始化函数: MX_TIM3_Init();。

TIM3_CH2 引脚生成 PWM 的底层驱动就配置好了,等 GPIO 也配置好再一起用。

回到 STM32CubeMX 软件界面,在右侧界面的芯片中分别点击 PA3、PA4,并将其配置为 GPIO_Output。在 System Core 下拉菜单中选择 GPIO,然后在左侧的 System Core 下拉菜单中选择 GPIO,然后在 GPIO Mode and Configuration 中对 PA3、PA4 引脚进行配置,GPIO output level 代表 GPIO 默认输出电平,在这里设置为低电平;GPIO mode 代表 GPIO 引脚模式,在这里设置为推挽输出;GPIO Pull-up/Pull-down 即 GPIO 上拉或下拉,在这里设置为既不上拉也不下拉;Maximum output speed 即 最大输出速度,在这里设置为低速;User Label 即用户标签,在这里将 PA3 改为 BIN1,PA4 改为 BIN2。

点击 GENERATE CODE,重新生成代码。

打开 MDK-ARM 工程,左侧 Application/User 里找到 gpio.c 源文件,双击打开,可以看到 MX_GPIO_Init() 函数里面已经有 BIN1_Pin|BIN2_Pin 的相关初始化代码。

在 main.c 中的 /* USER CODE BEGIN 2 */ 和 /* USER CODE END 2 */ 之间加入以下代码:

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启TIM3_CH2的PWM输出
  HAL_GPIO_WritePin(BIN1_GPIO_Port, BIN1_Pin, GPIO_PIN_SET);//初始化BIN1引脚为低电平
  HAL_GPIO_WritePin(BIN2_GPIO_Port, BIN2_Pin, GPIO_PIN_RESET);//初始化BIN2引脚为高电平
  /* USER CODE END 2 */

然后,在主循环中加入以下代码:

if(g_iButtonState == 1)//如果按键被按下
    {
        HAL_GPIO_TogglePin(BIN1_GPIO_Port,BIN1_Pin);//翻转BIN1引脚电平,如果是低电平则翻转为高电平,如果是高电平则翻转为低电平
        HAL_GPIO_TogglePin(BIN2_GPIO_Port,BIN2_Pin);//翻转BIN2引脚电平,如果是低电平则翻转为高电平,如果是高电平则翻转为低电平
        g_iButtonState = 0;//按键状态归0,代表松开
    }

上面这段代码的意思是,每次按下按键,左侧电机的转动方向都会更换一次,默认是全速转动(占空比 100%)。

代码已经编写好了。这时候,在 MDK-ARM 中点击编译按钮,会提示有一个警告(Warning),这是因为在上个实验中,我们定义了一个变量,但是在这次实验中没有使用。我们可以注释或者删除这个变量。

然后再重新编译一次,发现已经没有任何错误或者警告提示。

把代码烧录进小车中的 MiaowLabs-STM32F1-Micro 核心板,然后打开底板上的电源开关,小车的左侧电机全速转动,当我们按下用户按键,可以发现每按一下,电机的转向都会改变。就这样,我们实现了通过 TB6612FNG 驱动芯片,使用按键控制电机转向的功能。

Parameter Settings 选项卡的参数配置
重新生成代码
代码截图
配置 PA3、PA4 引脚
重新生成代码
代码截图
代码截图
编译后提示有一个警告
编译后没有提示任何错误和警告