l298n电机驱动模块_STM32电机PWM控制

ec2e9c24ac6c98a79d8b27d0230e3e12.png

2.1 STM32电机PWM控制

我们这里提供左右两个电机PWM控制代码,在公众号:小白学移动机器人,发送:电机PWM控制,即可获得源码工程下载链接。

2.1.1 实现工具

STM32单片机、直流减速电机、TB6612双路电机驱动器、keil5

2.1.2 电机实物接线图解

具体到我们的电机,我们可以看看电机后面的图解。

589cff9dc11efa0da986baf77e4b2c9d.png

中间的四根线(红绿白黑)是编码器的线,只是用于测速,和直流电机本身没有联系。

综上所述,我们只需控制施加在黄线和棕色线两端的直流电压大小和极性即可实现调试和换向。

2.1.3 TB6612FNG 使用说明

要实现上面的调试和换向功能,我们可以使用单片机实现的,但是单片机IO 的带负载能力较弱,而直流电机是大电流感性负载,所以我们需要功率放大器件,在这里,我们选择了 TB6612FNG驱动器。

TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。也许大家更熟悉 L298N,其实这两者的使用基本一致的。而且,相比 L298N 的热耗性和外围二极管续流电路,它无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。对于PWM信号输入频率范围,高达100KHz的频率足以满足我们大部分的要求:

677173fda04374ecc57543fd44e14a3b.png

以下是TB6612模块测试一个电机的接线图:

367002aedc63ea1dbbe3244042f62b4d.png

VM直接接电池即可,VCC是内部的逻辑供电,一般给3.3v或者5v都行,模块的3个GND接任意一个就行。STBY置高模块才能正常工作。

完成上面的接线之后,我们可以开始控制电机了,上图中红色的部分的5个引脚控制一路电机,蓝色部分控制另一路电机,这里以A路为例。A01和A02分别接电机的+和-。然后同PWMA,AIN2,AIN1控制电机。其中PWMA接到单片机的PWM引脚,一般10KHZ即可,并通过改变占空比调节电机的速度。下面是真值表:

f758c2ad842c4b02e856ce75784c0c0d.png

AIN1接3.3-5v、AIN2接GND,PWMA接到3.3-5v。这样相当于控制电机满占空比正转,反转相反。

2.1.4 部分代码分享

我这里就用通俗的话描述一下定时器的PWM。

首先明确一点,STM32单片机引脚PWM电压输出一般为0-3.3V。该电压属于有效值,看过波形的大家都知道,PWM一个周期内有高电平和低电平。切换电平标志就是0-自动重载值范围内的一个数,相比即可得到PWM的百分比大小。例如TIM1->CCR1这个寄存器就存放了一个这样的数字。当定时器的计数器比较当前数字等于TIM1->CCR1,立即切换引脚电平状态。

大家都知道每一个定时器的内部都有一个16计数器,根据计数模式的不同,该计数器存在自加、自减两种情况,这里按自加描述。定时器硬件配置的时候往往需要我们填入两个参数,自动重载值 arr、预分频值psc。

预分频值psc的作用:决定该定时器的时钟频率的大小。

自动重载值 arr的作用:范围在0-65535之间,决定该定时器溢出的位置大小。

举个例子,这里按照单片机系统时钟72MHz描述,如果psc=7200,那么该定时器的时钟频率为72M/7200=10KHz,也就是说该计数器每秒自加10000次数据。如果arr=1000,那么也就是说该定时器1000/10000=0.1溢出一次,也就是说该PWM的频率为1/0.1=10Hz。

(1)TB6612驱动器引脚配置、PWM配置

Motor_Init函数中的四个引脚选择根据每个人的情况而定,需要做必要的更改。

PWM_Init函数中具体的PWM引脚选择也是根据每个人的情况而定,如果可以的话,可以直接按照这里的配置使用。

#include 

(2)PWM电机控制

#include 

(3)main.c

#include 

2.1.5 总结

其实本篇文章就是简单的实现一下直流减速电机PWM控制。还没有对电机的速度实现闭环控制,下一篇,我们来写光电霍尔编码器的电机测速的原理以及代码实现。

系列文章

搭建ROS小车真的难吗?

ROS小车软件结构以及控制流程

923bb1607063561d5f0d9d82211edf1a.png
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于STM32F4单片机+L298N电机驱动+FBT06蓝牙控制小车系统设计WORD论文+软件源码+硬件设计方案: “基于stm32f4的蓝牙控制小车”是一个基于意法半导体与ARM公司生产的STM32F4 DISCOVERY开发板的集电机驱动模块、电源管理模块、stm32f4主控模块、蓝牙串口通信模块、android控制模块电机驱动模块使用了两个L298N芯片来驱动4路电机,使能端连接4路来自主控板的PWM波信号,8个输入端接主控板的8个输出端口;电源管理模块使用了LM2940-5.0芯片进行12V到5V的转换,12V用于电机模块的供电,5V用于蓝牙模块、传感器等的供电;主控模块采用了MDK编辑程序,然后下载到主控板,实现硬件与软件的交互;蓝牙串口通信模块则是采用了FBT06_LPDB针插蓝牙模块,与主控板进行串口通信,同时与android手机进行通信;android控制模块是一个集开启蓝牙、搜索蓝牙、控制小车等功能。用户可以通过android控制端进行控制小车的运动,实现一些用户需要的功能和服务。 1. 引言 蓝牙的创始人是瑞典爱立信公司,蓝牙技术是一种无限数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。手机之间通过蓝牙实现数据共享成为常理,将手机变为遥控器为人们的生活带来无限方便。遥控小车在工业、国防、科研等领域应用越来越广泛,例如说:消防遥控小车、探测小车等。本文详细阐述了使用蓝牙通信的手机遥控小车前行、倒退、左转、右转和停止等功能的软硬件设计过程。 2. 系统方案 该系统分为电机驱动模块、电源管理模块、主控板、蓝牙通信模块、android控制端等5个模块,如图2.1所示: 图2.1 系统模块图 3. 系统硬件设计 3.1 电机驱动模块 3.1.1 L298N的封装 H 桥电路虽然有着诸多的优点,但是在实际制作过程中,由于元件较多,电路的搭建也较为麻烦,增加了硬件设计的复杂度。 由于H 桥电路有诸多的优点,但是在实际制作过程中电路又比较麻烦,因此在本设计中我们采用H 桥集成电机驱动芯片L298。L298N 的工作原理和以上介绍的H 桥相同,引脚图如图3.1 所示: 图3.1 L298N封装图 3.1.2 L298N的原理图设计 L298N 是ST 公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15 脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间 峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H 桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电 压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N 芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。L298 的参考电路图如图3.2所示。
以下是使用STM32控制L298N电机驱动模块的示例代码: ```c #include "stm32f10x.h" // 定义L298N驱动模块的引脚 #define ENA PBout(0) #define IN1 PBout(1) #define IN2 PBout(2) #define IN3 PBout(3) #define IN4 PBout(4) #define ENB PBout(5) // 初始化函数 void L298N_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟 // 配置ENA引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置IN1、IN2、IN3、IN4引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置ENB引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } // 控制函数 void L298N_Control(uint8_t right_dir, uint8_t left_dir, uint8_t right_speed, uint8_t left_speed) { // 控制右侧电机 if (right_dir == 0) { IN1 = 0; IN2 = 1; } else { IN1 = 1; IN2 = 0; } ENA = right_speed; // 控制左侧电机 if (left_dir == 0) { IN3 = 0; IN4 = 1; } else { IN3 = 1; IN4 = 0; } ENB = left_speed; } int main(void) { L298N_Init(); // 初始化L298N驱动模块 while (1) { // 控制左右电机正转,速度为50% L298N_Control(0, 0, 128, 128); delay_ms(2000); // 控制左右电机反转,速度为50% L298N_Control(1, 1, 128, 128); delay_ms(2000); // 控制电机正转,右电机反转,速度为50% L298N_Control(0, 1, 128, 128); delay_ms(2000); // 控制电机反转,右电机正转,速度为50% L298N_Control(1, 0, 128, 128); delay_ms(2000); } } ``` 以上示例代码中,控制函数`L298N_Control`的参数说明如下: - `right_dir`:右侧电机的方向,0为正转,1为反转。 - `left_dir`:左侧电机的方向,0为正转,1为反转。 - `right_speed`:右侧电机的速度,取值范围为0到255。 - `left_speed`:左侧电机的速度,取值范围为0到255。 在控制函数中,首先根据传入的方向参数,控制IN1、IN2引脚或IN3、IN4引脚输出相应的电平,从而控制电机的方向;然后根据传入的速度参数,控制ENA或ENB引脚输出相应的PWM波,从而控制电机的速度。具体的PWM占空比可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值