电机驱动----L298N

一、介绍

        L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,内含4路逻辑驱动电路,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。一个模块可同时驱动两个直流电机工作,具有反馈检测和过热自断功能。其模块实物图如下所示:

二、引脚说明

引脚名引脚号描述
GND1,10,11,20接地
Sense A2在该引脚和接地之间连接检测电阻器以控制负载的电流。
Sense B19
N.C.3;18无连接
OUT14

桥A的输出;连接在这两个引脚之间的负载上流过的电流在引脚1处监测。

OUT25
Vs6供电电压用于功率输出级。一个无感的10nF电容必须连接在这个引脚和地之间。
Input17桥A的TTL兼容输入。
Input29
EnableA8TTL兼容使能输入:L状态禁用桥A(使能A)和/或桥B(使能B)。
EnableB14
VSS12模块的供电电压。一个100nF电容必须连接在这个引脚和地之间。
Input313桥B的TTL兼容输入。
Input415
OUT316桥B的输出。连接在这两个引脚之间的负载上流过的电流在引脚15处监测。
OUT417
  • IN1, IN2, IN3, IN4: 输入控制引脚,控制电机的转动方向。
  • ENA, ENB: 使能引脚,用于启动和停止电机。
  • OUT1, OUT2, OUT3, OUT4: 输出引脚,连接到电机端子。
  • VSS: 逻辑电压供应引脚。
  • VS: 电机电压供应引脚。
  • GND: 地引脚。

三、工作原理

1.供电控制:

        只需要在12V供电处接上7-12V电压,供电GND处与单片机共地即可,5V供电处会输出一个5V的电压,可以用于给单片机供电,做小车时最常用的就是这种方式。使用这种方式时,板载5V使能不用管。 

2.控制逻辑:

        不用PWM调速,就单纯想让电机转动,就给使能脚一个高电平即可,可以通过跳线帽将其与高电平输出脚相连,如果给使能脚低电平的话,电机将无法转动。其转动逻辑如下表:

        电机1电机2电机1电机2
IN1IN2IN3IN4
1010正转正转
0101反转反转
相同相同相同相同停止停止

启动电机1:使能引脚ENA设置为高电平 

停止电机1:使能引脚ENA设置为低电平

IN1高电平,IN2低电平:电机1正转

IN1低电平,IN2高电平:电机1反转

电机2同理,不做过多解释。

四、代码示例

1.带PWM示例

接线:

L298NSTM32
OUT1和OUT2电机1的两个端子
OUT3和OUT4电机2的两个端子
ENAPA7
ENBPA6
IN1和IN2PA0和PA1
IN3和IN4PA4和PA5
VSS5V
GNDGND

l298n.h


#ifndef __L1298N_H
#define __L1298N_H
#include "sys.h"#define MOTOR_PIN_A GPIO_Pin_7
#define MOTOR_PIN_B GPIO_Pin_6#define MOTOR_CTRL_A GPIO_Pin_0
#define MOTOR_CTRL_B GPIO_Pin_1
#define MOTOR_CTRL_C GPIO_Pin_4
#define MOTOR_CTRL_D GPIO_Pin_5#define GPIO_PORT_MOTOR GPIOA#define SET_PIN_HIGH(PORT, PIN) GPIO_SetBits(PORT, PIN)
#define SET_PIN_LOW(PORT, PIN) GPIO_ResetBits(PORT, PIN)#define MOTOR_FORWARD()   { PAout(0) = 1; PAout(1) = 0; PAout(4) = 1; PAout(5) = 0; }
#define MOTOR_BACKWARD()  { PAout(0) = 0; PAout(1) = 1; PAout(4) = 0; PAout(5) = 1; }
#define MOTOR_STOP()      { PAout(0) = 0; PAout(1) = 0; PAout(4) = 0; PAout(5) = 0; }void Forward(void);
void Back(void);
void Stop(void);
void TIM3_PWM_Init(u16 arr,u16 psc);#endif

l298n.c 

#include "timer.h"
#include "l298n.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"void TIM3_PWM_Init(uint16_t arr, uint16_t psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// Enable clocksRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// GPIO ConfigurationGPIO_InitStructure.GPIO_Pin = MOTOR_PIN_A | MOTOR_PIN_B;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_PORT_MOTOR, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = MOTOR_CTRL_A | MOTOR_CTRL_B | MOTOR_CTRL_C | MOTOR_CTRL_D; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_Init(GPIO_PORT_MOTOR, &GPIO_InitStructure);// Reset motor control pinsSET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_A);SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_B);SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_C);SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_D);// Timer base configurationTIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// PWM Mode configuration for Channel 1 and Channel 2TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure);  TIM_OC1Init(TIM3, &TIM_OCInitStructure);  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_Cmd(TIM3, ENABLE);  
}void Forward()
{MOTOR_FORWARD();TIM_SetCompare2(TIM3, 1);  TIM_SetCompare1(TIM3, 1);   
}void Back()
{MOTOR_BACKWARD();TIM_SetCompare2(TIM3, 1);   TIM_SetCompare1(TIM3, 1);   
}void Stop(void)
{MOTOR_STOP();
}

main.c


#include "delay.h"
#include "usart.h"
#include "l298n.h"int main(void){		delay_init();	   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	uart_init(115200);	TIM3_PWM_Init(999,0);  while(1){Forward(); delay_ms(3000);Back(); delay_ms(3000);}	 

 

 

2.无PWM控制

接线:

L298NSTM32
OUT1和OUT2电机1的两个端子
OUT3和OUT4电机2的两个端子
ENAPA6
ENBPA7
IN1和IN2PA0和PA1
IN3和IN4PA2和PA3
VSS5V
GNDGND

此demo为不带PWM的双电机版本的STM32HAL库示例: 

#include "stm32f1xx_hal.h"// 定义引脚
#define ENA_Pin GPIO_PIN_6
#define ENA_GPIO_Port GPIOA
#define IN1_Pin GPIO_PIN_0
#define IN1_GPIO_Port GPIOA
#define IN2_Pin GPIO_PIN_1
#define IN2_GPIO_Port GPIOA
#define ENB_Pin GPIO_PIN_7
#define ENB_GPIO_Port GPIOA
#define IN3_Pin GPIO_PIN_2
#define IN3_GPIO_Port GPIOA
#define IN4_Pin GPIO_PIN_3
#define IN4_GPIO_Port GPIOAvoid SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1) {// 启动电机1,设置方向为顺时针HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);HAL_Delay(2000);// 停止电机1HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_RESET);HAL_Delay(2000);// 启动电机2,设置方向为逆时针HAL_GPIO_WritePin(ENB_GPIO_Port, ENB_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, GPIO_PIN_SET);HAL_Delay(2000);// 停止电机2HAL_GPIO_WritePin(ENB_GPIO_Port, ENB_Pin, GPIO_PIN_RESET);HAL_Delay(2000);}
}// 时钟配置
void SystemClock_Config(void) {// ... (根据具体需求配置时钟)
}// GPIO初始化
static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = IN1_Pin | IN2_Pin | IN3_Pin | IN4_Pin | ENA_Pin | ENB_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}// 错误处理
void Error_Handler(void) {// ... (错误处理代码)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现Java应用的快速开发与迭代

实现Java应用的快速开发与迭代 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 引言 随着软件开发周期的不断缩短和市场竞争的加剧,快速开发和…

Spring源码十一:事件驱动

上一篇Spring源码十:BeanPostProcess中,我们介绍了BeanPostProcessor是Spring框架提供的一个强大工具,它允许我们开发者在Bean的生命周期中的特定点进行自定义操作。通过实现BeanPostProcessor接口,开发者可以插入自己的逻辑&…

JAVA基础(8) 面向对象编程3

目录 一、关键字static 1.概念 2.static关键字 (1)使用范围: (2)被修饰后的成员具备以下特点: 3.静态变量 (1)语法格式 (2)静态变量的特点 &#xf…

k8s-第五节-StatefulSet

StatefulSet StatefulSet 是用来管理有状态的应用,例如数据库。 前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。 而像**数据库、Redis **这类…

CPU是什么?

CPU,全称Central Processing Unit,中文名为中央处理器,是计算机系统的核心部件,负责执行程序指令、处理数据以及控制计算机内部的其他组件。简单来说,CPU就像是计算机的大脑,负责进行所有的思考和计算工作。…

在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法

在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法 在使用 apt 或 apt-get 进行软件包管理时,有时会遇到以下错误提示: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporari…

CCM的作用及原理

CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后,就是当AWB将白色校正之后其他颜色也会跟着有明显变化,CCM的作用就是要保持白色不变,把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…

代码随想录Day73(Part09)

badijkstar(堆优化版) 题目:47. 参加科学大会(第六期模拟笔试) (kamacoder.com) 思路:直接看答案 答案 import java.util.*;class Edge {int to; // 邻接顶点int val; // 边的权重Edge(int to, int val) {this.to to;this.val …

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配(非流式)MainBranch结果展示 代码适配(流式) 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

力扣139 单词拆分 Java版本

文章目录 题目描述代码 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1&#xff1a…

HTTP与HTTPS的主要区别

HTTP(超文本传输协议)与HTTPS(超文本传输安全协议)的主要区别在于安全性、数据传输方式、默认使用的端口以及对网站的影响。 一、安全性: HTTP是一种无加密的协议,数据在传输过程中以明文形式发送&#x…

堆和栈的区别及应用场景

堆和栈的区别及应用场景 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在计算机科学和编程领域,堆(Heap)和栈&#xff08…

InfluxDB时序数据库基本使用介绍

1、概要介绍 1.1、时序数据库使用场景 所谓时序数据库就是按照一定规则的时间序列进行数据读写操作的数据库。它们常被用于以下业务场景: 物联网IOT场景:可用于IOT设备的指标、状态监控数据存取。IT建设场景:可用于服务器、虚拟机、容器的…

等保测评需要什么SSL证书

在进行信息安全等级保护(简称“等保”)测评时,选择合适的HTTPS证书对于确保网站的安全性和合规性至关重要。以下是在等保测评中选择HTTPS证书时应考虑的因素: 国产证书: 等保测评倾向于使用国产品牌的SSL证书&#x…

代码随想录Day76(图论Part11)

97.小明逛公园(Floyd) 题目:97. 小明逛公园 (kamacoder.com) 思路: 答案 import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();…

传统sql查询痛点及衍生的项目设计思路(设计一款可视化查询工具)

背景 最近三年,工作中很大一部分时间是写sql报表。业务很复杂,几十个表。常用的就有十几个。经常表连接达七八个。写得多了,我也很熟练了,但就是足够熟练了,我就越感觉有以下问题困扰我: 无法串联excel表…

上网行为管理系统是什么?有哪些好用的上网行为管理系统?

IT经理(ITM): 大家好,今天我们聚在这里,是为了讨论一个对我们公司来说越来越重要的议题:上网行为管理系统(WBS)。我们知道,员工的网络使用已经不仅仅是个人行为,它直接影…

序列化Serializable

一、传输对象的方式 将对象从内存传输到磁盘进行保存,或者进行网络传输,有两种方式: 实现Serializable接口,直接传输对象转成json字符串后,进行字符串传输 二、直接传输对象 implements Serializable Data Equal…

Java中的设计模式在实际项目中的应用

Java中的设计模式在实际项目中的应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 设计模式是解决软件设计中常见问题的经验总结,它们提供了一种…

resp 无法连接 redis 服务器

问题原因可能是:防火墙 防火墙对这个端口没有开放,所以主机访问不到 解决方法: 步骤1:开发指定端口号 #放通6379/tcp端口 firewall-cmd --zonepublic --permanent --add-port6379/tcp 步骤2:重启防火墙 firewall-c…