电机驱动----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.rhkb.cn/news/369715.html

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

相关文章

LeetCode刷题记录:(15)三角形最小路径和

知识点&#xff1a;倒叙的动态规划 题目传送 解法一&#xff1a;二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…

代理设计模式和装饰器设计模式的区别

代理设计模式: 作用:为目标(原始对象)增加功能(额外功能,拓展功能) 三种经典应用场景: 1&#xff1a;给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等) 2&#xff1a;远程代理&#xff08;网络通信&#xff0c;输出传输&#xff08;RPC&#xff0c;D…

2024年07月03日 Redis部署方式和持久化

Redis持久化方式&#xff1a;RDB和AOF&#xff0c;和混合式 RDB&#xff1a;周期备份模式&#xff0c;每隔一段时间备份一份快照文件&#xff0c;从主线程Fork一个备份线程出来备份&#xff0c;缺点是会造成数据的丢失。 AOF&#xff1a;日志模式&#xff0c;每条命令都以操作…

LabVIEW环境下OCR文字识别的实现策略与挑战解析

引言 在自动化测试领域&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术扮演着重要角色&#xff0c;它能够将图像中的文字转换成机器可编辑的格式。对于使用LabVIEW约5个月&#xff0c;主要进行仪器控制与数据采集的你而言…

linux ls文件排序

linux可以使用ls命令结合一些选项来按照文件大小对文件和目录进行排序。以下是一些常用的方法&#xff1a; 1、这里&#xff0c;-l 选项表示长格式输出&#xff08;包括文件权限、所有者、大小等&#xff09;&#xff0c;-S 选项表示按照文件大小排序&#xff0c;-h 选项表示以…

hitcontraining_uaf

BUUCTF[PWN][堆] 题目&#xff1a;BUUCTF在线评测 (buuoj.cn) 程序del是没有将申请的指针清零&#xff0c;导致可以再次调用输出print。 查看add_note函数&#xff1a;根据当前 notelist 是否为空&#xff0c;来申请了一个8字节的空间将地址(指针)放在notelist[i]中&#xff…

Unity 解包工具(AssetStudio/UtinyRipper)

文章目录 1.UtinyRipper2.AssetStudio 1.UtinyRipper 官方地址&#xff1a; https://github.com/mafaca/UtinyRipper/ 下载步骤&#xff1a; 2.AssetStudio 官方地址&#xff1a; https://github.com/Perfare/AssetStudio 下载步骤&#xff1a;

Eslint prettier airbnb规范 配置

1.安装vscode的Eslint和prettier 插件 eslint&#xff1a;代码质量检查工具 https://eslint.nodejs.cn/docs/latest/use/getting-started prettier&#xff1a;代码风格格式化工具 https://www.prettier.cn/docs/index.html /* eslint-config-airbnb-base airbnb 规范 esl…

ASP.NET Core Blazor 5:Blazor表单和数据

本章将描述 Blazor 为处理 HTML 表单提供的特性&#xff0c;包括对数据验证的支持。 1 准备工作 继续使用上一章项目。   创建 Blazor/Forms 文件夹并添加一个名为 EmptyLayout.razor 的 Razor 组件。本章使用这个组件作为主要的布局。 inherits LayoutComponentBase<div …

泛微E9开发 根据故障来源新增明细行,并且初始化错误类型

根据故障来源新增明细行&#xff0c;并且初始化错误类型 1、需求说明2、实现方法3、扩展知识点3.1 批量修改字段值或显示属性3.1.1 格式3.1.2 参数3.1.3 演示 3.2 根据字段ID获取字段信息3.2.1 格式3.2.2 参数3.2.3 演示 1、需求说明 用户对出现故障的机器或设备进行判断问题判…

【数据库了解与学习】

1.下载所需版本安装包 1.1将所需文件压缩包以及安装包放在你选择的任意一盘&#xff0c;新建一个没有文字和空格的文件夹 1.2双击打开安装包&#xff0c;选择Custom自定义模式然后点击右下方的Next 1.4三连点击1&#xff0c;再点击箭头出现3&#xff0c;选中3出现4&#xff0c;…

Java--继承

1.继承的本质是对某一批类的抽象&#xff0c;从而实现对世界更好的建模 2.extends的意思是“扩展”&#xff0c;子类是父亲的扩展 3.Java中只有单继承&#xff0c;没有多继承 4.继承关系的两个类&#xff0c;一个为子类&#xff08;派生类&#xff09;&#xff0c;一个为父类…

用html+css设计一个列表清单小卡片

目录 简介: 效果图: 源代码: 可能的问题: 简介: 这个HTML代码片段是一个简单的列表清单设计。它包含一个卡片元素(class为"card"),内部包含一个无序列表(ul),列表项(li)前面有一个特殊的符号(△)。整个卡片元素设计成300px宽,150px高,具有圆角边…

【C语言题目】34.猜凶手

文章目录 作业标题作业内容2.解题思路3.具体代码 作业标题 猜凶手 作业内容 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff…

NoSQL 非关系型数据库 Redis 的使用:

redis是基于内存型的NoSQL 非关系型数据库&#xff0c;本内容只针对有基础的小伙伴&#xff0c; 因为楼主不会做更多的解释&#xff0c;而是记录更多的技术接口使用&#xff0c;毕竟楼主不是做教学的&#xff0c;没有教学经验。 关于redis的介绍请自行搜索查阅。 使用redis数据…

JMH320【亲测】【御剑九歌】唯美仙侠手游御剑九歌+WIN学习手工端+视频教程+开服清档+运营后台+授权GM物品充值后台

资源介绍&#xff1a; 这也是仙梦奇缘的一个游戏 注意&#xff1a;外网14位IP或域名 ———————————————————————————————————– ps后台介绍: 1区运营后台&#xff1a;http://ip:9981/admin/admintool/ 2区运营后台&#xff1a;http://ip…

Finding Global Homophily in Graph Neural Networks When Meeting Heterophily

本文发表于:ICML22 推荐指数: #paper/⭐⭐⭐ 问题背景: 异配图的邻接矩阵难以确定,以及异配图的计算复杂度开销大 可行的解决办法:高通滤波多跳邻居,GPRGNN(pagerank一类&#xff0c;各阶邻居的权重不同,ACM-GCN&#xff08;高低通滤波,H2GCN&#xff08;应该复杂度很大&…

若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题

生成代码修改前 <el-form-item label"课程学科" prop"subject"><el-select v-model"queryParams.subject" placeholder"请选择课程学科" clearable><el-optionv-for"dict in course_subject":key"dict…

Java并发编程知识整理笔记

目录 ​1. 什么是线程和进程&#xff1f; 线程与进程有什么区别&#xff1f; 那什么是上下文切换&#xff1f; 进程间怎么通信&#xff1f; 什么是用户线程和守护线程&#xff1f; 2. 并行和并发的区别&#xff1f; 3. 创建线程的几种方式&#xff1f; Runnable接口和C…

自己动手实现语音识别

声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布,建立音频内容和文本的对应关系,以此作为模型训练的基础。 语音mfc…