电机驱动​

电机驱动​

电机驱动 ​本节介绍 ​📝本节您将学习如何使用 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选项页的代码:

hw_motor.chw_motor.hc#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);

}123456789101112131415161718192021222324252627282930313233343536373839c#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);

#endif12345678910111213代码说明

我们通过电机驱动芯片的真值表,可以知道,通过控制fi和bi的高低电平变化,就可以控制电机。

c//设置fi脚的pwm占空比

static void set_fi(uint16_t dat);

//设置bi脚的pwm占空比

static void set_bi(uint16_t dat);1234这里我们配置的PWM是8Khz,在80Mhz的主频下,PWM的计数比较值为 10000。

所以当调用代码 set_fi(10000); 表示向fi引脚输出 0% 的占空比,而 0% 的占空比就是默认的低电平;

调用代码 set_fi(0); 表示 100% 的占空比,而 100% 的占空比就是高电平;

降低比较值,就可以控制电机旋转的速度。

电机驱动验证 ​接下来我们来实现一个操作:长按右键开启电机,再长按右键关闭电机,如此反复。

往我们工程中的按键任务文件 app_key_task.c 里的右键回调函数中,更改为以下代码:

cvoid 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;

}

}12345678910111213141516171819202122232425262728在该文件添加电机驱动的头文件:

c#include "hw_motor.h"1实现效果:

代码下载地址

https://gitee.com/lcsc/easy-pid-beginner-kit/tree/master/examples/Keil/04_motor_driver

上一篇: lol双修混伤流EZ玩法一览
下一篇: 使用免费AI滤镜创建吸引眼球的视觉效果

相关文章

《黄河之歌》
【菁禾GENHAO】大麥若葉青汁 四盒優惠
《暗黑破坏神3》25赛季挑战秘境开荒攻略[多图]
Minecraft Mod 安裝教學
什麼是陰宅?陰宅的形勢及風水寶地
平板流量卡使用全攻略:从选卡插卡到设置优化,一篇搞定!