电机驱动----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,一经查实,立即删除!

相关文章

Spring源码十一:事件驱动

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

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

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

HTTP与HTTPS的主要区别

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

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

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

等保测评需要什么SSL证书

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

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

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

序列化Serializable

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

resp 无法连接 redis 服务器

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

.netcore微服务——项目搭建

在.NET Core中,微服务是一种架构风格,它将应用程序构造为一组小型服务的集合,这些服务都通过HTTP-based API进行通信。每个服务都是独立部署的,可以用不同的编程语言编写,并且可以使用不同的数据存储技术。 微服务的主…

什么是网络抓取|常见用例和问题

你可能听说过数据被称为现代信息社会的新石油。由于线上信息量庞大,能够有效地收集和分析网页数据已经成为企业、研究人员和开发人员的关键技能。这就是网页抓取技术的用武之地。网页抓取,也称为网页数据提取,是一种强大的技术,能…

IDEA 2018提交Git之后撤销commit

1、选择项目——>右击git——>找到Repostiory——>执行rest head 2、编辑reset head 3、回退到上一个版本(HEAD~1),点击reset即可,如果还想继续回滚,再次执行即可

Linux平台x86_64|aarch64架构如何实现轻量级RTSP服务

技术背景 我们在做Linux平台x86_64架构或aarch64架构的推送模块的时候,有公司提出这样的技术需求,希望在Linux平台,实现轻量级RTSP服务,实现对摄像头或屏幕对外RTSP拉流,同步到大屏上去。 技术实现 废话不多说&…

在 Baklib Experience 中实现混合 CMS 架构

“还记得 CMS 主要用于在网页上布局内容吗?当时,这满足了网站管理需求。然而,行业正在发生变化,数字体验平台 Baklib Digital Content Experience 正在引领潮流。继续阅读以了解如何以及详细了解可用于确保全渠道成功的两个原则。…

python笔记和练习----少儿编程课程

第1课: 认识新朋友-python 知识点: 1、在英文状态下编写Python语句。 2、内置函数print()将结果输出到标准的控制台上,它的基本语法格式如下: print("即将输出的内容") #输出的内容要用引号引起来,可…

遗漏知识点

什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C语言的一种管理资源、避免泄漏的惯用法。利用的就是C构造的对象最终会被销毁的原则。RAII的做法是使用一个对象&am…

DC/AC电源模块在不同的电源类型之间进行转换

BOSHIDA DC/AC电源模块在不同的电源类型之间进行转换 电力转换是现代社会不可或缺的一部分,它使我们能够在不同的电源类型之间进行转换,从而满足各种设备和应用的需求。DC/AC电源模块是一种用于将直流电转换为交流电的设备,它在电子设备、太…

[单master节点k8s部署]19.监控系统构建(四)kube-state-metrics

kube-state-metrics 是一个Kubernetes的附加组件,它通过监听 Kubernetes API 服务器来收集和生成关于 Kubernetes 对象(如部署、节点和Pod等)的状态的指标。这些指标可供 Prometheus 进行抓取和存储,从而使你能够监控和分析Kubern…

软件是什么?一个软件到底是哪些部分组成的-软件到底有哪些分支呢?

https://doc.youyacao.com/117/2163 软件是什么?一个软件到底是哪些部分组成的-软件到底有哪些分支呢? 何为软件 软件定义 的本质是通过软件编程实现硬件资源的虚拟化、灵活、多样和定制化功能,以最大化系统运行效率和能量效率。它基于硬…

VirtualBox的windows server 2016设置主机和虚拟机共享文件夹

文章目录 安装步骤1. windows server 2016安装增强功能2.上述安装完成之后,需要做共享文件夹,在宿主机,新建一个test文件夹,做共享设置,如下图:3.然后打开虚拟机,设置文件共享 安装步骤 1. win…

kafka系列之消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用KafkaListener(其实底层也是poll()方法)时,它都会返回之前被写入Kafka的记录,即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前所述,Kafka的一…