前言
人生如逆旅,我也是行人。-苏轼《临江仙》·送钱穆父》
目录:
- L298N电机驱动介绍
- 编码器介绍
- 电机介绍
- 新建工程
- 编写代码
- 实验结果
一、L298N电机驱动介绍
B站-视频讲解:l298n电机驱动模块 电机正反转 电机调速
L298N
是ST
公司生产的高压大电流电机驱动芯片。该芯片采用15
脚包装。主要特点是工作电压高,最高工作电压可达46V
;输出电流大,瞬时峰值电流可达3A
,持续工作电流为2A
;额定功率25W
。内含两个H桥式高压大电流全桥式驱动器可用于驱动直流电机、步进电机、继电器线圈等感应负载;采用标准逻辑电平信号控制;有两个使能控制端,允许或禁止设备在不受输入信号影响的情况下工作,使内部逻辑电路部分在低压下工作;可外接检测电阻,并将变化反馈给控制电路。L298N
芯片驱动电机,可驱动两相步进电机或四相步进电机或两个直流电机。
以下是最常见的一个L298N
值得注意的是,芯片已内置5V
供电,不需要从外面连接5V
输入。届时5V
端子将成为5V
为了保证输出L298N
供电稳定性(供电不足可能导致L298N
不建议使用烧毁)5V
供电作为单片机的电源。
接口介绍:
一、12V供电
理论上,最高可访问35v(我没有尝试过最低和最高的电压,这是一个宝藏卖家提供的参数)。在购买直流电机之前,如果满足,请先查看直流电机的相关参数和性能L298N使用要求,然后购买使用,否则容易烧毁L298N。
二、GND共地
顾名思义,接地线。但需要注意的是,这里GND不仅要连接驱动电源GND,如果与其他单片机或其他系统连接,一定要从这里引出另一个GND单片机或系统GND连接。即整个系统GND连接在一起,如果不连接在一起,电压没有参考电平,无法正常控制。
三、5V供电
这是一个特殊的端口。可以做到L298N输入逻辑电压也可以是外部单片机或系统的5v供电口。板载5具体切换v跳帽介绍。
四、板载5V跳帽
- 12v供电口接≥5V的电源电压时,板载5v跳帽不拔,5v供电口有电压输出。用万用表测量数值的具体尺寸。反正是12v口接7.4v时,5v输出5为输出5v的。
- 12v供电口≤5v电源电压时,板载5v因为L298N驱动板需要逻辑驱动电压。v供电口变成了L298N逻辑电压供电的输入口。供电电压为3.3v -5v之间。
五、通道AB使能跳帽
- 需要PWM无需控制即可拔除PWM控制不需要拔除(老玩家不在乎这句话,即使不拔除也可以。PWM调试的,应该懂的都懂)。
- PWM对于电机来说,控制是速度控制的现象Arduino里用analogWrite(Pin,Value)实现 语句[Pin(对应针脚),Value(0-255之间的整形数字)
六、逻辑输入
- IN1和IN二是一组,对应OutA(输出A);
- IN3和IN四是一组,对应OutB(输出B)。
七、输出AB
直接输出相应。
-
注意事项:
- 当您的驱动电压(上图标记为
12V
输入,实际可接受的输入范围是7-12V
)为7V-12V
当它能使板载时5V
当使用板载电源时,使用逻辑电源5V
供电后,接口中的5V
不要输入电压供电,但会导致5V
外部使用电压(这是常规应用! - 当驱动电压高于时
12V
,小于等于24V
(芯片手册提出支持35V
,但根据经验,L298N
保守应用的最大电压支持24V
它已经很棒了!)例如,驱动额定电压为18V
电机。首先,必须拆除板载5V
输出跳线帽。然后在5V
输出端口外接入5V
使能即 一个电平为5V
控制信号,当信号输入有效,电机驱动模块电源正常时,电机驱动模块输出电流。否则,即使电源正常,电机上也没有电流。L298N
内部逻辑电路供电。(这是高压驱动的非常规应用!
- 当您的驱动电压(上图标记为
-
L298N引脚:
- 用L298N驱动两台直流减速电机的电路。A,B可用于PWM控制。如果机器人项目只需要直接前进,可以IN1,IN2和IN3,IN4两对引脚分别连接高电平和低电平,仅用单片机的两个端口给出PWM信号控制使能端A,B可实现直行、转弯、加减速等动作。
- 用L二相步进电机控制将于298实现。IN1,IN2和IN3,IN两个引脚分别连接到单片机的端口,输出连续的脉冲信号。信号频率决定了电机的速度。改变绕组脉冲信号的顺序可以实现正反转。
使能端 A/B | 输入引脚 1/3 | 输入引脚 2/4 | 电机运动方式 |
---|---|---|---|
1 | 1 | 0 | 前进(顺时针转动) |
1 | 0 | 1 | 后退(逆时针转动) |
1 | 1 | 1 | 紧急停车 |
1 | 0 | 0 | 紧急停车 |
0 | - | - | 停止(自由转动) |
二、编码器介绍
B站-视频介绍:【电工知识】编码器是干什么用的,这下终于明白了!
编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器可以把角位移或直线位移转换成电信号,是工业中常用的电机定位设备,可以精确地测试出电机的角位移和旋转位置。其最直接的作用就是可以测量位移,通过位移就可以计算出速度。
简单的来说,,从而能够更好地控制电机进行工作。
1.编码器的种类
按输出信号分:增量式和绝对式
。通常为A相、B相、Z相输出,A相、B相为相互延迟1/4周期的脉冲输出,根据延迟关系可以区别正反转,而且通过取A相、B相的上升和下降沿可以进行2或4倍频;Z相为单圈脉冲,即每圈发出一个脉冲。 ,通过外部记圈器件可以进行多个位置的记录和测量。
- 绝对式编码器由机械位置决定的每个位置是唯一的,它无需记忆,无需找参考点,而且不用一直计数,什么时候需要知道位置,什么时候就去读取它的位置,从而大大提高了编码器的抗干扰能力、数据可靠性提高。
按传感技术分:光电式和霍尔式(光式、磁式、电容式)
光电编码器,是一种通过将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是应用最多的传感器,由光源、光码盘和光敏元件组成。 霍尔编码器是一种通过将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。 是由霍尔码盘(磁环)和霍尔元件组成。
-
光电式:当光线穿过齿轮盘时,接收器会计一次数,并传送给CPU。不同的转速,自然在相同时间内的计数值不一样,进而达到测速的功能。
-
霍尔式:霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号 (通常相差90°,我们称为AB相)。
测速可以通过计算相同时间内的脉冲数,判断转向: 可以看到下图,,A相处在下降沿时,B相是高电平。A相处在上升沿时,B相是低电平;,(即把上面的波形从右向左看)A相处在下降沿时,B相是低电平。A相处在上升沿时,B相是高电平。进而判断正反转。
两者的主要区别:
- 检测方式不同:霍尔编码器是电磁检测位置,光电编码器是光电检测位置
- 精度不同:霍尔编码器一般是精度不高,用作粗略的位置反馈,而光电编码器精度高,可以实现高精度的位置检测
2. 霍尔编码器实物图接线
霍尔编码器的接口 | STM32 单片机的IO口 |
设置的工作模式 |
---|---|---|
VCC | VCC(3.3V) | - |
GND | GND | - |
A相 | 接单片机的脉冲检测接口 | 定时器编码模式 |
B相 | 接单片机的脉冲检测接口 | 定时器编码模式 |
霍尔编码器的接口 | L298N 电机驱动的接口 |
---|---|
M+ (电机线+) |
接电机驱动的输出OUT1 |
M- (电机线-) |
接电机驱动的输出OUT2 |
3. 倍频原理
我们通过软件的方法实现四倍频,首先可以看出图中编码器输出的AB相波形,正常情况下我们使用M法测速的时候,会通过测量单位时间内A相输出的脉冲数来得到速度信息,常规的方法,我们只测量A相(或者B相)的上升沿或者下降沿,也就是图中对应数字1234中的某一个,这样就只能计数3次,而 这样在同样的时间内,可以计数12次(3个1234的循环)。这就是四倍频的原理。 因为编码器输出的是标准的方波,所以我们可以直接用单片机进行读取,在软件中的处理方法分两种,自带编码器接口的单片机如STM32,可以直接使用硬件计数,而没有编码器接口的单片机如51单片机,可以通过外部中断读取,比如把编码器A相输出接到单片机的外部中断输入口,这样就可以通过跳变沿触发中断,然后在对应的中断服务函数里面,通过B相电平来确定正反转。如当一个A相来一个跳变沿的时候,如果B相是高电平就认为是正转,低电平就认为是反转。
三、电机介绍
电机(英文:Electric machinery,俗称“马达”)是指依据电磁感应定律实现电能转换或传递的一种电磁装置。 电机在电路中是用字母M(旧标准用D)表示,它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源,发电机在电路中用字母G表示,它的主要作用是利用机械能转化为电能。
我所使用的也是一种减速电机,即电机头部有一个减速器,电机转动带动减速器里的齿轮后再通过减速器的输出轴输出相应的转速。比如减速比是 1: 30
,。
M法测速
- T0为自行设置的时间;
- M0为在设定时间内的脉冲数;
- C为单圈总脉冲数。( 在霍尔传感器每个引脚有 输出)
最终接线表:(只使用 IN1
和 IN2
这一组,对应 OutA
(输出A))
霍尔编码器的接口 | STM32 单片机的IO口 |
---|---|
编码器VCC(5V) | VCC(5V) |
编码器GND | GND |
编码器A相 | 定时器编码器模式的通道(TIMx_CH1) |
编码器B相 | 定时器编码器模式的通道(TIMx_CH2) |
霍尔编码器的接口 | L298N 电机驱动的接口 |
---|---|
M+ (电机线+) |
接电机驱动的输出OUT1 |
M- (电机线-) |
接电机驱动的输出OUT2 |
STM32 单片机的IO口 |
L298N 电机驱动 |
---|---|
GND | L298N的GND |
输出IO口高电平 | IN1 |
输出IO口低电平 | IN2 |
PWM 波产生通道(定时器PWM 波产生通道) |
通道A使能端 |
12V 供电电池 |
L298N 电机驱动 |
---|---|
负极(黑线) | L298N的GND(三个电源接入的最中间) |
正极(红线) | L298N的12V接口(三个电源接入的左边) |
四、新建工程
硬件:
-
STM32F103RBT6
(正点原子NANO
开发板) STM32CubeMX
软件IDE
:MDK-Keil
软件STM32F1xxHAL
库·- 上述所介绍的:
L298N
电机驱动模块、带有霍尔编码编码器的以及用来供电的 ()
1.打开STM32CubeMX软件,点击“新建工程”
2. 选择 MCU 和封装
3.配置时钟
博客网站-RCC学习
4.配置调试模式
5.串口(USART1)配置
6. 引脚(IO
)配置
配置两输出IO
引脚,作为输出电机驱动的IN1
和IN2
。
7. 定时器配置为PWM
输出模式
配置定时器1的通道1产生 PWM
波,用以连接 L298N
电机驱动模块的输出A的使能输入。()
8. 定时器配置为编码器模式(Encoder)
配置定时器2(TIM2)为编码器模式(Encoder Mode),连接电机上面的编码器的A相与B相。
分频系数表示对计数值进行分频,编码器模式默认时四倍频。
编码器模式就相当于一个专门计数的工具,当编码器的码盘转动时,A、B相输出矩形波形脉冲,进入PA0
和PA1
进行计数(数脉冲)。
9. 定时器配置中断函数
记得开启定时器中断,
10.生成代码
输入项目名称和路径。 选择应用的
IDE
,开发环境MDK-ARM V5
- 所有初始化代码都生成在
main.c
- 初始化代码生成在对应的外设文件。 如
GPIO
初始化代码生成在gpio.c
中。
11.构建工程
五、编写代码
/* 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 */}
//中断处理函数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单片机要共地。(同一个电位参考)