L298N双路电机驱动模块使用指南

news/2025/3/21 18:44:19/

哦吼,这个模块上手很快!!!

 

L298N,是一款接受高电压的电机驱动器,直流电机和步进电机都可以驱动。一片驱动芯片可同时控制两个直流减速电机做不同动作,在6V到46V的电压范围内,提供2安培的电流,并且具有过热自断和反馈检测功能,可对电机进行直接控制,通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动,操作简单、稳定性好,可以满足直流电机的大电流驱动条件。

L298N 电机驱动板引脚 

代码如下:(无脑转动

#include "stm32f10x.h"uint16_t NUM;int main (void)
{RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef 	 GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_6);GPIO_SetBits(GPIOC,GPIO_Pin_7);while(1){GPIO_ResetBits(GPIOC,GPIO_Pin_6);}}

PWM调速实现
这里就不再是把ENA、ENB再接上高电平了,这个时候就要把跳线帽拔掉了,在通过定时器来控制实现PWM调速,具体先上代码:

#include "timer.h"#define Ina PGout(2)
#define Inb PGout(3)
#define Inc PGout(4)
#define Ind PGout(5)void TIM3_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_Init(GPIOG, &GPIO_InitStructure);                     GPIO_ResetBits(GPIOG,GPIO_Pin_2);                    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         GPIO_Init(GPIOG, &GPIO_InitStructure);                GPIO_ResetBits(GPIOG,GPIO_Pin_3);                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         GPIO_Init(GPIOG, &GPIO_InitStructure);                     GPIO_ResetBits(GPIOG,GPIO_Pin_4);                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         GPIO_Init(GPIOG, &GPIO_InitStructure);                     GPIO_ResetBits(GPIOG,GPIO_Pin_5);                        TIM_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);TIM_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_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure);  TIM_Cmd(TIM3, ENABLE);  }

上面这段代码主要是定时器TIM3的初始化以及四个输入端的初始化,至于那个预分配系数psc和自动重装值arr可以自己设定,这里我设定的是arr=450,psc=7199

然后把PA6,PA7分别连接到ENA和ENB上,设置好arr和psc,最后通过TIM_SetComparex函数设置占空比即可实现PWM调速功能

整体关键代码
剩下一下重要代码如下:

void qianjin(void)
{TIM_SetCompare2(TIM3,100);//设置通道2的占空比实现PWM调速,这里是100,在0~450间,越小速度越快TIM_SetCompare1(TIM3,100);//设置通道1的占空比实现PWM调速Ina=1;Inb=0;Inc=1;Ind=0;
}
void houtui(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=0;Inb=1;Inc=0;Ind=1;
}
void zuozhuan(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=0;Inb=0;Inc=1;Ind=0;
}
void youzhuan(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=1;Inb=0;Inc=0;Ind=0;
}
void stop(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=0;Inb=0;Inc=0;Ind=0;
}


主函数:

int main(void){    vu8 key=0;delay_init();        //      LED_Init();              //KEY_Init(); //TIM3_PWM_Init(450,7199);while(1){key=KEY_Scan(0);    //通过按键简单实现if(key){                           switch(key){                 case WKUP_PRES:    LED0=0;qianjin();break; case KEY1_PRES:    // qianjin();delay_ms(5000);delay_ms(5000);delay_ms(5000);houtui();delay_ms(5000);delay_ms(5000);delay_ms(5000);break;case KEY0_PRES:    LED0=1;stop();break;}}else delay_ms(10); }
}

常见问题
1.电机不会转动?
(1)有响声但是齿轮不转,可能是电压不够,加大电压
(2)接线存在错误,没有与MCU共地等
(3)逻辑端编程错误,没有正确的使能
2.关于ENA和ENB上面的跳线帽要不要拔去?
这取决于你的程序是怎么输出PWM波的,如果是通过ENA来接收PWM控制的,跳线帽就要拔了,接自己的I/O输出。如果是通过IN1和IN2来控制的则不用拔。


http://www.ppmy.cn/news/290988.html

相关文章

SCRUM的五个事件

Scrum 使用固定的事件来产生规律性,以此来减少 Scrum 之外的其它会议的必要。所有事 件都是有时间盒限定的事件,也就是说每一个事件限制在最长的时间范围内。一旦 Sprint 开始,它的持续时间是固定的,不能缩短或者延长。而其他事件…

国产触控笔哪个牌子好?第三方电容笔推荐

对于那些把iPad当做学习工具的人来说,这已经成为了他们生活中不可缺少的一部分。但没有人买得起苹果原装电容笔,因为苹果电容笔的售价太贵了。因此,最好还是用一支普通的电容笔。我是个一个苹果粉,同时也是个数字发烧友&#xff0…

【网络】· VTP虚拟局域网中继

目录 🍉VTP技术 🍉以太网通道配置 🍒sw1配置 🍒sw2配置 🍉VTP工作原理 🍒VTP模式 🍒VTP通告 🍒VTP的版本 🍒VTP修改编号 🍒VTP通告类型 🍒VTP修剪…

忆捷迷你硬盘更换图标e_40个出色的迷你图标集

当您寻求为您的设计寻找图标时,您可能最终会得到不同种类的图标,其中一些用途广泛的图标,而另一些则特定于利基市场。 但是,在为移动应用程序或移动网页设计进行设计时,需要一组微型图标 。 因此,对于所有…

常用元器件的识别

一、电阻电阻在电路中用“R”加数字表示,如:R15表示编号为15的电阻。电阻在电路中的主要作用为分流、限流、分压、偏置、滤波(与电容器组合使用)和阻抗匹配等。1、参数识别:电阻的单位为欧姆(Ω&#xff09…

双十二有哪些数码好物值得入手?年终最值得入手系列

双十一过去了,不知不觉又到了双十二,大家在双十一都入手了什么?还有哪些好物没有买呢?如果还没有入手或者还不知道需要买哪些实用性好物的,根据我这篇好物文章,肯定能找到~快来看看有没有你想要的吧~ 一、…

移动硬盘可以识别但无法读取的处理方法

如果你的电脑可以识别出硬盘,只是无法读取数据,包括在磁盘管理里面也没法打开,可能是索引文件坏了,可以尝试这样修复。 我的实际修改过程如下: C:\Documents and Settings\XXX>chkdsk h:/f 文件系统的类型是 NTFS。 卷标是 EAGET忆捷 。 CHKDSK 正在校验文件(3 的阶段…

关于移动硬盘变成CD驱动器的非正常修复方法

我的硬盘是忆捷,在想将这个盘刷Linux启动盘时意外发现硬盘变成了CD驱动器,在网上找了很多方法,用驱动精灵,找主控芯片后量产都不好使,后来发现了Rufus,用Rufus从新将Ubuntu的ios刷了一次就成功了。 打开Ru…