STM32CubeMX——霍尔编码器、L298N驱动电机

2023-05-16

前言

人生如逆旅,我亦是行人。 ————苏轼《临江仙·送钱穆父》


目录:

  1. L298N电机驱动介绍
  2. 编码器介绍
  3. 电机介绍
  4. 新建工程
  5. 编写代码
  6. 实验结果


一、L298N电机驱动介绍

B站-视频讲解:l298n电机驱动模块 电机正反转 电机调速

L298NST 公司生产的一种高电压、大电流电机驱动芯片。该芯片采用 15 脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达 3A,持续工作电流为 2A ;额定功率 25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用 L298N 芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。

  • 作用与用途:

    1. 可实现电机正反转及调速;
    2. 启动性能好,启动转矩大;
    3. 工作电压可达到 36V,4A
    4. 可同时驱动两台直流电机;
    5. 适合应用于机器人设计及智能小车的设计;

下面为最常见的一款L298N芯片,值得注意的是,它已经内置的5V供电,所以不必从外面再接5V输入。届时5V端子将成为5V输出,为了保证L298N供电的稳定性(供电不足可能引起L298N的烧毁),不建议使用此5V供电作为单片机的电源。
在这里插入图片描述

接口介绍:

一、12V供电

理论上最高可以接入35v(没试过最低和最高的电压,此处是某宝卖家提供的参数),购买直流电机前,先看清楚直流电机的相关参数和性能,如果满足L298N的使用要求,再进行购买使用,否则容易烧毁L298N。

二、GND共地

顾名思义,接地线。但要注意的是,此处GND不但要接驱动电源的GND,如果是和别的单片机或者其他系统连接在一起的时候,一定要从这里再引出一根GND和单片机或者系统的GND相连。即整个系统的GND连接在一起,如果不连接在一起,电压没有参考电平,无法进行正常的控制。

三、5V供电

这是一个特殊的端口。既可以做L298N的逻辑电压的输入,也可以做外部单片机或系统的5v供电口。具体切换在板载5v跳帽中介绍。

四、板载5V跳帽

  • 12v供电口接≥5V的电源电压时,板载5v跳帽不拔除,5v供电口有电压输出。数值具体大小自己用万用表测,反正当12v口接7.4v时,5v供电口是输出5v的。
  • 12v供电口≤5v的电源电压时,板载5v跳帽需要拔除,因为L298N需要逻辑驱动电压来驱动板子。此时5v供电口就变成了L298N的逻辑电压供电的输入口。供电电压在3.3v -5v之间。

五、通道AB使能跳帽

  • 需要PWM控制就拔除,不需要PWM控制就不用拔除(老玩家就别管这句话了,就算不拔除也可以做到PWM调试的,应该懂的都懂)。
  • PWM控制对于电机而言表现出来现象的就是转速控制,在Arduino里用analogWrite(Pin,Value)语句来实现 [Pin(对应的针脚),Value(0-255之间的整型数字)]

六、逻辑输入

  • IN1和IN2为一组,对应OutA(输出A);
  • IN3和IN4为一组,对应OutB(输出B)。

七、输出AB

直接接相应的输出即可。
在这里插入图片描述

  • 注意事项:

    1. 当你的驱动电压(上图标识为12V输入,实际可以接受的输入范围是7-12V)为7V-12V的时候,可以使能板载的5V逻辑供电,当使用板载5V供电之后,接口中的+5V供电不要输入电压,但是可以引出5V电压供外部使用。(这种即为常规应用!)
    2. 当驱动电压高于12V,小于等于24V(芯片手册中提出可以支持到 35V ,但是按照经验一般 L298N 保守应用最大电压支持到24V已经很了不起!)时,比如要驱动额定电压为 18V 的电机。首先必须拔除板载 5V 输出使能的跳线帽。然后在 5V 输出端口外部接入5V 使能即 一个电平为 5V 的控制信号,当此信号输入有效时,且电机驱动模块中电源供电正常时,电机驱动模块输出电流。否则即使电源供电正常,电机上也无电流。电压对L298N内部逻辑电路供电。(这种是高压驱动的非常规应用!)

!!强调!!:L298N电机驱动、STM32单片机、编码器电机三者在使用过程中,一定要把三者的GND连接在一起,也就是共地!!!驱动电压可以接受的输入范围是7~12V,板子标识为VCC输入,一般都是使用航模电池或买电池盒。

  • 原理图:

在这里插入图片描述

  • L298N引脚:

    1. 情况一: 用L298N驱动两台直流减速电机的电路。引脚A,B可用于PWM控制。如果机器人项目只要求直行前进,则可将IN1,IN2和IN3,IN4两对引脚分别接高电平和低电平,仅用单片机的两个端口给出PWM信号控制使能端A,B即可实现直行、转弯、加减速等动作。
    2. 情况二: 用L298实现二相步进电机控制。将IN1,IN2和IN3,IN4两对引脚分别接入单片机的某个端口,输出连续的脉冲信号。信号频率决定了电机的转速。改变绕组脉冲信号的顺序即可实现正反转。

在这里插入图片描述
在这里插入图片描述

  • L298N 驱动 A/B 控制逻辑:

    1. IN1IN2 为一组,对应 OutA(输出A);
    2. IN3IN4 为一组,对应 OutB(输出B)。

使能端 A/B输入引脚 1/3输入引脚 2/4电机运动方式
110前进(顺时针转动)
101后退(逆时针转动)
111紧急停车
100紧急停车
0--停止(自由转动)

二、编码器介绍

B站-视频介绍:【电工知识】编码器是干什么用的,这下终于明白了!

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器可以把角位移或直线位移转换成电信号,是工业中常用的电机定位设备,可以精确地测试出电机的角位移和旋转位置。其最直接的作用就是可以测量位移,通过位移就可以计算出速度。

简单的来说,学习电机上的编码器,是为了能够通过编码器测出电机的转速,从而能够更好地控制电机进行工作。


1.编码器的种类


按输出信号分:增量式和绝对式

增量式:就是每转过单位的角度就发出一个脉冲信号。通常为A相、B相、Z相输出,A相、B相为相互延迟1/4周期的脉冲输出,根据延迟关系可以区别正反转,而且通过取A相、B相的上升和下降沿可以进行2或4倍频;Z相为单圈脉冲,即每圈发出一个脉冲。
绝对式:就是对应一圈,每个 基准的角度 发出 一个唯一与该角度对应二进制的数值,通过外部记圈器件可以进行多个位置的记录和测量。

  • 绝对式编码器由机械位置决定的每个位置是唯一的,它无需记忆,无需找参考点,而且不用一直计数,什么时候需要知道位置,什么时候就去读取它的位置,从而大大提高了编码器的抗干扰能力、数据可靠性提高。

区别在于:绝对式掉电不丢失读取数值,增量式会丢失。


按传感技术分:光电式和霍尔式(光式、磁式、电容式)

光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是应用最多的传感器,由光源、光码盘和光敏元件组成。
霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。 是由霍尔码盘(磁环)和霍尔元件组成。

  1. 光电式:当光线穿过齿轮盘时,接收器会计一次数,并传送给CPU。不同的转速,自然在相同时间内的计数值不一样,进而达到测速的功能。
    在这里插入图片描述

  2. 霍尔式:霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号 (通常相差90°,我们称为AB相)。

    测速可以通过计算相同时间内的脉冲数,判断转向:
    可以看到下图,当顺时针旋转时,A相处在下降沿时,B相是高电平。A相处在上升沿时,B相是低电平;当逆时针旋转时,(即把上面的波形从右向左看)A相处在下降沿时,B相是低电平。A相处在上升沿时,B相是高电平。进而判断正反转。
    在这里插入图片描述

两者的主要区别:

  1. 检测方式不同:霍尔编码器是电磁检测位置,光电编码器是光电检测位置
  2. 精度不同:霍尔编码器一般是精度不高,用作粗略的位置反馈,而光电编码器精度高,可以实现高精度的位置检测


2. 霍尔编码器实物图接线

在这里插入图片描述
接线表:

霍尔编码器的接口STM32单片机的IO口设置的工作模式
VCCVCC(3.3V)-
GNDGND-
A相接单片机的脉冲检测接口定时器编码模式
B相接单片机的脉冲检测接口定时器编码模式

霍尔编码器的接口L298N电机驱动的接口
M+(电机线+)接电机驱动的输出OUT1
M-(电机线-)接电机驱动的输出OUT2

3. 倍频原理

我们通过软件的方法实现四倍频,首先可以看出图中编码器输出的AB相波形,正常情况下我们使用M法测速的时候,会通过测量单位时间内A相输出的脉冲数来得到速度信息,常规的方法,我们只测量A相(或者B相)的上升沿或者下降沿,也就是图中对应数字1234中的某一个,这样就只能计数3次,而四倍频的方法是测量A相和B相编码器的上升沿和下降沿。 这样在同样的时间内,可以计数12次(3个1234的循环)。这就是四倍频的原理。
因为编码器输出的是标准的方波,所以我们可以直接用单片机进行读取,在软件中的处理方法分两种,自带编码器接口的单片机如STM32,可以直接使用硬件计数,而没有编码器接口的单片机如51单片机,可以通过外部中断读取,比如把编码器A相输出接到单片机的外部中断输入口,这样就可以通过跳变沿触发中断,然后在对应的中断服务函数里面,通过B相电平来确定正反转。如当一个A相来一个跳变沿的时候,如果B相是高电平就认为是正转,低电平就认为是反转。
在这里插入图片描述


三、电机介绍

电机(英文:Electric machinery,俗称“马达”)是指依据电磁感应定律实现电能转换或传递的一种电磁装置。
电机在电路中是用字母M(旧标准用D)表示,它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源,发电机在电路中用字母G表示,它的主要作用是利用机械能转化为电能。

我所使用的也是一种减速电机,即电机头部有一个减速器,电机转动带动减速器里的齿轮后再通过减速器的输出轴输出相应的转速。比如减速比是 1: 30表示电机转动 30圈,电机的减速器转动一圈
在这里插入图片描述

M法测速

在这里插入图片描述

  • T0为自行设置的时间;
  • M0为在设定时间内的脉冲数;
  • C为单圈总脉冲数。(直流电机轴旋转一圈 在霍尔传感器每个引脚有 13个脉冲信号 输出)

最终接线表:(只使用 IN1IN2 这一组,对应 OutA(输出A))

霍尔编码器的接口STM32单片机的IO口
编码器VCC(5V)VCC(5V)
编码器GNDGND
编码器A相定时器编码器模式的通道(TIMx_CH1)
编码器B相定时器编码器模式的通道(TIMx_CH2)

霍尔编码器的接口L298N电机驱动的接口
M+(电机线+)接电机驱动的输出OUT1
M-(电机线-)接电机驱动的输出OUT2

STM32单片机的IO口L298N电机驱动
GNDL298N的GND
输出IO口高电平IN1
输出IO口低电平IN2
PWM波产生通道(定时器PWM波产生通道)通道A使能端

12V供电电池L298N电机驱动
负极(黑线)L298N的GND(三个电源接入的最中间)
正极(红线)L298N的12V接口(三个电源接入的左边)

四、新建工程


硬件:

  • 芯片: STM32F103RBT6(正点原子NANO开发板)
  • STM32CubeMX软件
  • IDEMDK-Keil 软件
  • STM32F1xxHAL库·
  • 上述所介绍的:L298N电机驱动模块、带有霍尔编码编码器的直流减速电机以及用来供电的 12V电池红线:正;黑线:负


1.打开STM32CubeMX软件,点击“新建工程”

在这里插入图片描述

2. 选择 MCU 和封装

在这里插入图片描述

3.配置时钟

在这里插入图片描述
在这里插入图片描述
具体学习可以参考:博客网站-RCC学习

4.配置调试模式

5.串口(USART1)配置

在这里插入图片描述

6. 引脚(IO)配置

配置两输出IO引脚,作为输出电机驱动的IN1IN2
在这里插入图片描述

7. 定时器配置为PWM输出模式

配置定时器1的通道1产生 PWM 波,用以连接 L298N 电机驱动模块的输出A的使能输入。(将跳线帽拔掉
在这里插入图片描述

8. 定时器配置为编码器模式(Encoder)

配置定时器2(TIM2)为编码器模式(Encoder Mode),连接电机上面的编码器的A相与B相。

分频系数表示对计数值进行分频,编码器模式默认时四倍频。

编码器上的AB相应该接编码器模式对应的引脚。 编码器模式就相当于一个专门计数的工具,当编码器的码盘转动时,A、B相输出矩形波形脉冲,进入PA0PA1进行计数(数脉冲)。

在这里插入图片描述

9. 定时器配置中断函数

在这里插入图片描述
记得开启定时器中断,注:编码器的更新中断定时器最好要比10ms定时器的优先级高,用来防止在更新中被打断。
在这里插入图片描述

10.生成代码

输入项目名称和路径。(注:路径中不允许出现中文。)
在这里插入图片描述
选择应用的IDE,开发环境MDK-ARM V5
在这里插入图片描述
每个外设生成独立的 ’.c/.h’ 文件

  • 不勾: 所有初始化代码都生成在 main.c
  • 勾选: 初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

    点击 GENERATE CODE 生成代码

11.构建工程

  • DeBug的模式根据不同的芯片进行选择:
    在这里插入图片描述


  • 实物连接图:

在这里插入图片描述
在这里插入图片描述


五、编写代码

  • 在主函数main.c中添加代码:

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  HAL_TIM_Base_Start_IT(&htim3);      //开启10ms中断
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);   //开启PWM
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_1);   //开启编码器定时器
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_2);   //开启编码器定时器
  
  __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);      //开启编码器定时器更新中断,防溢出处理
  
  __HAL_TIM_SET_COUNTER(&htim2, 30000);           //将编码器定时器初始值设定为30000
  

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

  • 编写中断处理函数HAL_TIM_PeriodElapsedCallback();

//中断处理函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM3)
	{
		__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,20000);
	}
}


六、实验结果

完成上述过程,结果是电机会转动起来,如果电机没有转动起来,可以通过检查线路,或者会出现板子烧毁的情况,会其他的情况。如果板子仍可以正常工作且接线无误,则考虑是不是L298N电机驱动的问题,可以通过使用万用表进行测量OUT1和OUT2两个引脚和GND之间是否有电压差,如果测得电压很小,则可能是驱动烧坏。换了新的驱动之后,测试有没有用的时候,切记一定要记得L298N驱动模块与STM32单片机要共地。(同一个电位参考)


谢谢阅读

在这里插入图片描述


---------------------
作者:W_oilpicture
来源:CSDN
原文:https://blog.csdn.net/WandZ123/article/details/124583452
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX——霍尔编码器、L298N驱动电机 的相关文章

随机推荐

  • NetEQ 算法

    NetEQ 算法中集成了自适应抖动控制算法以及语音包丢失隐藏算法 这项技术使其能够快速且高解析度地适应不断变化的网络环境 xff0c 确保音质优美且缓冲延迟最小 研究的重点是 NetEQ 模块 xff0c 其中所涉及的处理过程包括抖动消除
  • 数组的形参与实参,通过引用传递数组

    数组形参 xff1a void printValues int void printValues int void printValues int 10 以上三种是等价的 通常 xff0c 将数组形参直接定义为指针要比使用语法定义更好 第三
  • java 简单员工管理系统

    package cn test import java io import java util class Emp 64 Override public String toString return 34 Emp empNo 61 34 4
  • 关闭虚拟机vmware自动挂起

    1 xff0c 桌面右键 属性 xff0c 里的屏幕保护程序 xff0c 选 无 2 xff0c 控制面板的电源选项 xff0c 方案为 一直开着 xff0c 具体选项选 从不关机 3 xff0c 在Windows 2003 Server点
  • GTK+2.0之初始学习篇(二)—— g_signal_connect宏解释及HelloWorld

    GTK 43 2 0中利用信号 回调函数机制来处理窗口外部传来的事件 消息或信号 以下实现的是单击窗口关闭按钮 xff0c 窗口自动关闭 在程序中调用了gtk main quit 函数实现退出主循环 include lt gtk gtk h
  • linux-----页、页表、页框(块)

    基本介绍 我们知道 xff0c 在linux操作系统中 xff0c CPU在执行一个进程的时候 xff0c 都会访问内存 但CPU并不是直接访问物理内存地址 xff0c 而是通过虚拟地址空间来间接的访问物理内存地址 所谓的虚拟地址空间 xf
  • CMake交叉编译配置

    罗列一下cmake常用的命令 CMake支持大写 小写 混合大小写的命令 1 添加头文件目录INCLUDE DIRECTORIES 语法 xff1a include directories AFTER BEFORE SYSTEM dir1
  • 8086CPU的14个寄存器全称

    通用寄存器 xff1a ax accumulate register 累加器 bx based register 基地址寄存器 cx count register 计数器 dx data registered 数据寄存器 段寄存器 xff1
  • 项目开发-后台管理框架

    开发中几乎的平台都需要一个后台管理 xff0c 但是从零开发一套后台控制面板并不容易 xff0c 幸运的是有很多开源免费的后台控制面板可以给开发者使用 xff0c 那么有哪些优秀的开源免费的控制面板呢 xff1f 我在 Github 上收集
  • 项目经理必备工具-个人推荐

    点击链接 项目经理必备工具 进入详细说明
  • 如何绕过CDN找源站ip?

    如何绕过CDN找源站ip xff1f 这是一个总结帖 xff0c 查了一下关于这个问题的国内外大大小小的网站 xff0c 对其中说的一些方法总结归纳形成 xff0c 里面具体发现ip的方法不是原创 xff0c 所有参考的原贴都也贴在了后面
  • Navicat修改MySQL数据库密码就是这么简单

    方法1 xff1a 用SET PASSWORD命令 首先登录MySQL 格式 xff1a mysql gt set password for 用户名 64 localhost 61 password 39 新密码 39 例子 xff1a m
  • Axure 元件库-原型

    元件名称 xff1a 1 Axure交互原型设计指南 rp 2 PC和移动原型常用元件 rp 3 后台模板 rp 4 全局说明 rp https pan baidu com s 1vmac 08MZAKj6qsdjwIZlg 提取码 xff
  • Node.js 通过http调用外部接口

    通过http request发送带参数的post请求 data xff1a 发送的内容 opt xff1a 描述将要发出的请求 data xff1a 事件在数据到达时被触发 end xff1a 请求结束时触发 error xff1a 发生错
  • 想成为出色的 CTO,你要具备这七大能力

    编者按 xff1a 首席技术官这一职位在20世纪80年代出现于美国 起于做很多技术研发的大公司 xff0c 如General Electric 主要职能是将科研成果转化实际效益 简单地说 xff0c 就是一个企业中技术的最高负责人 要扮演好
  • Keil中添加自己的头文件

    xfeff xfeff 方法一 在keil的开发环境下添加 xff1a 请注意上面的系统生成的头文件目录是 xff1a xff0c 即 dd jj pp kk xff0c 其中 是相对于项目文件 uvproj 而言的 其中 表示项目文件所在
  • http authorization 基本认证

    最近做的一个项目需要与其它系统对接接口 xff0c 对方提供的是webservice的接口 xff0c 并且需要Basic Authorization基本认证 xff0c 一开始都是用postman请求 xff0c 用户名和密码需要填在Ba
  • 终端命令安装 chrome for linux

    终端里安装chrome for linux 备注 xff1a 我是在Linux Mint 17 1 64位系统下安装的chrome for linux xff0c 其它Debian衍生版应该也是一样的 1 在终端里输入下载命令 xff1a
  • Arduino串口函数详解

    本文总结了Arduino常用串口操作函数 xff0c 函数说明部分来源于Arduino 官网串口使用指南 xff0c 示例与实验部分为自编 本文是对Arduino串口操作函数的较全面总结 xff0c 可作为工具贴查找使用 1 串口设置 xf
  • STM32CubeMX——霍尔编码器、L298N驱动电机

    前言 人生如逆旅 xff0c 我亦是行人 苏轼 临江仙 送钱穆父 目录 xff1a L298N电机驱动介绍编码器介绍电机介绍新建工程编写代码实验结果 一 L298N电机驱动介绍 B站 视频讲解 xff1a l298n电机驱动模块 电机正反转