电机驱动
本节介绍
📝本节您将学习如何使用 MSPM0G3507 的 keil 环境通过电机驱动芯片 BDR6126D 来驱动电机,并且联合按键功能实现长按电机转再长按电机停。
🏆本章⽬标
1️⃣明白如何配置 PWM 外设,设置其频率与占空比;
2️⃣通过电机驱动芯片 BDR6126D 驱动电机动作;
3️⃣实现联合按键功能做到长按电机转再长按电机停。
硬件连接
![]() | ![]() |
---|---|
驱动方法
(1)控制电机的第一种方法——直接使用IO口高低电平
电机的IO口引脚直接配置为输出模式,只要将电机的两个 IO 口输出不同的电平就可以让电机转动起来,将引脚的高低电平交换就可以改变电机转动的方向。
![]() |
---|
L 表示低电平,H 表示高电平。
(2)控制电机的第二种方法——使用定时器PWM功能
以上控制电机的方法比较简单易懂,然而如果你想改变电机转动的速度,以上的方法就行不通了,就需要引入 PWM 功能了;
使用PWM功能:通过IO口复用功能,将引脚配置为 PWM 功能,通过改变 PWM 的占空比改变电机的转速;
先将电机使用到的定时器 PWM 通道进行配置,让 PWM 输出频率为 10000 HZ,不同的电机驱动频率有所差异,大家根据自己的电机型号配置。
工程创建
复制粘贴上一个章节的工程,并重新命名为 04_motor_driver
。
![]() |
---|
在新工程下的 harware 文件夹中,新建两个文件 hw_motor.c 和 hw_motor.h 。然后打开该工程,往工程下的 hardware 虚拟文件夹添加新建的 .c 文件。
![]() | ![]() |
---|---|
更新工程的头文件路径为该工程的路径。
![]() |
---|
引脚配置
打开工程的 .syscfg 文件,再打开图形化代码生成工具,配置按键对应的引脚为开启上拉电阻的输入模式。
![]() | ![]() |
---|---|
![]() | ![]() |
---|---|
关于 PA26 和 PA27 对应的是哪一个定时器的什么通道请参考电路原理分析章节,这里不重复说明。
在配置PWM时,先配置最下方的引脚配置选项,选择TIMG7。
设置电机速度与正反转
往 hw_motor.c 文件中加入以下hw_motor.c选项页的代码,往 hw_motor.h 文件中加入以下hw_motor.h选项页的代码:
#include "hw_motor.h"
// 设置fi引脚的PWM比较值
static void set_fi(uint16_t dat)
{
DL_TimerG_setCaptureCompareValue(PWM_MOTOR_INST,dat,GPIO_PWM_MOTOR_C1_IDX);
}
// 设置bi引脚的PWM比较值
static void set_bi(uint16_t dat)
{
DL_TimerG_setCaptureCompareValue(PWM_MOTOR_INST,dat,GPIO_PWM_MOTOR_C0_IDX);
}
// 限制输入的PWM最大值
// 仅内部使用
static void restrict_pwm_max_value(uint16_t* value)
{
if( *value > MOTOR_PWM_MAX )
{
*value = MOTOR_PWM_MAX;
}
}
// 设置电机速度
void set_motor(uint16_t fi_value, uint16_t bi_value)
{
restrict_pwm_max_value(&fi_value);
restrict_pwm_max_value(&bi_value);
set_fi(fi_value);
set_bi(bi_value);
}
// 电机停止
void stop_motor(void)
{
set_motor(0,0);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef _HW_MOTOR_H_
#define _HW_MOTOR_H_
#include "ti_msp_dl_config.h"
// 电机最大输入的PWM值
#define MOTOR_PWM_MAX 9999
void set_motor(uint16_t fi_value, uint16_t bi_value);
void stop_motor(void);
#endif
2
3
4
5
6
7
8
9
10
11
12
代码说明
我们通过电机驱动芯片的真值表,可以知道,通过控制fi和bi的高低电平变化,就可以控制电机。
//设置fi脚的pwm占空比
static void set_fi(uint16_t dat);
//设置bi脚的pwm占空比
static void set_bi(uint16_t dat);
2
3
4
这里我们配置的PWM是8Khz,在80Mhz的主频下,PWM的计数比较值为 10000。
所以当调用代码 set_fi(10000);
表示向fi引脚输出 0% 的占空比,而 0% 的占空比就是默认的低电平;
调用代码 set_fi(0);
表示 100% 的占空比,而 100% 的占空比就是高电平;
降低比较值,就可以控制电机旋转的速度。
![]() | ![]() |
---|---|
电机驱动验证
接下来我们来实现一个操作:长按右键开启电机,再长按右键关闭电机,如此反复。
往我们工程中的按键任务文件 app_key_task.c 里的右键回调函数中,更改为以下代码:
void btn_right_cb(flex_button_t *btn)
{
static int motor_status = 0;
switch (btn->event)
{
case FLEX_BTN_PRESS_CLICK://单击事件
set_app_key_current_mode( !get_app_key_current_mode() );
break;
case FLEX_BTN_PRESS_LONG_START://长击开始事件
motor_status = !motor_status;
if( motor_status )
{
set_motor(9999,0);
}
if( !motor_status )
{
stop_motor();
}
break;
default:break;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
在该文件添加电机驱动的头文件:
#include "hw_motor.h"
![]() | ![]() |
---|---|
实现效果: