转载1:https://blog.csdn.net/p_xiaojia/article/details/79310858
一、L298N的一些基本参数
使用方法:
输出A: 通道A输出 ,连接电机
输出B: 通道B输出 ,连接电机
12V供电: 主电源正极输入
供电GND: 主电源正负极极输入
5V输出: 5v电压输出端,可用于给MCU供电
ENA: 通道A使能
ENB: 通道B使能
IN1~IN4: 逻辑输入IN1~IN2控制通道A,逻辑输入IN3~IN4控制通道B
板载5V跳线帽: 接上后板载5V输出有效
二、实际接线图
由上述模块参数可知:
主电源的电压输入范围+5V~+35V,如果想通过模块输出5V电压来驱动你的MCU
则主电源的电压输入范围+7V~+35V
1.版内电压驱动
很多开发板上都会带有5V和3.3V的直流电压输出,可用此作为主电源的输入
为什么需要升压模块呢?
原因有两个:(1)开发板的5V输出口不一定有5V,可能只有4.?
(2)模块不一定刚好5V就能动,我的是5.3多才会转
2.外接电源驱动
此方法电源和MCU需要共地
三、程序逻辑控制方法
51编程:
Stm32 编程:
1.先配置I/O口
2.如何在stm32内像51程序一样控制?
首先定义宏
那么PAout()哪里来?
关于地址映射这部分内容,具体实现请参考正点原子的例程。
四、常见问题:
1.电机不会转动?
(1)有响声但是齿轮不转,可能是电压不够,加大电压
(2)接线存在错误,没有与MCU共地等
(3)逻辑端编程错误,没有正确的使能
2.关于ENA和ENB上面的跳线帽要不要拔去?
这取决于你的程序是怎么输出PWM波的,如果是像我上面的程序那样通过ENA来接收PWM控制的,跳线帽就要拔了,接自己的I/O输出。如果是通过IN1和IN2来控制的则不用拔。
===========================================================================
注意:不使用PWM进行调速的时候,一定要将L298N上的使能端(ENA或ENB)的跳帽接上,否则电机不会转。
当然,如果使用PWM进行调速就把跳帽摘掉接杜邦线
实际接线和编程:(如果不加升压模块,直接使用STM32的5V引脚施加电压的话,马达不会转动,因为STM32的5V引脚实际上只有4.6V左右)
工程结构:
bsp_moto.h
#ifndef __BSP_MOTO_H__ #define __BSP_MOTO_H__ #include "stm32f10x.h" #define HIGH 1 #define LOW 0 #define GPIO_MOTO_CLK RCC_APB2Periph_GPIOA #define GPIO_MOTO_PORT GPIOA #define GPIO_MOTO_Pin_IN1 GPIO_Pin_2 #define GPIO_MOTO_Pin_IN2 GPIO_Pin_3 #define IN1(a)\ if(a) GPIO_SetBits(GPIO_MOTO_PORT, GPIO_MOTO_Pin_IN1);\ else GPIO_ResetBits(GPIO_MOTO_PORT, GPIO_MOTO_Pin_IN1); #define IN2(a)\ if(a) GPIO_SetBits(GPIO_MOTO_PORT, GPIO_MOTO_Pin_IN2);\ else GPIO_ResetBits(GPIO_MOTO_PORT, GPIO_MOTO_Pin_IN2); /*GPIO端口初始化*/ void GPIO_Moto_Init(void); /*Moto1正转*/ void Moto1_Forward(void); /*Moto1反转*/ void Moto1_Reverse(void); #endif /*__BSP_MOTO_H__*/
bsp_moto.c
#include "./moto/bsp_moto.h"
/*GPIO端口初始化*/
void GPIO_Moto_Init(void)
{
// 结构体
GPIO_InitTypeDef GPIO_InitStruct;
// 开时钟
RCC_APB2PeriphClockCmd(GPIO_MOTO_CLK, ENABLE);
// 实例化
GPIO_InitStruct.GPIO_Pin = GPIO_MOTO_Pin_IN1|GPIO_MOTO_Pin_IN2;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
// 初始化
GPIO_Init(GPIO_MOTO_PORT, &GPIO_InitStruct);
GPIO_ResetBits(GPIO_MOTO_PORT, GPIO_MOTO_Pin_IN1|GPIO_MOTO_Pin_IN2);
}
/*Moto1正转*/
void Moto1_Forward(void)
{
IN1(HIGH);
IN2(LOW);
}
/*Moto1反转*/
void Moto1_Reverse(void)
{
IN1(LOW);
IN2(HIGH);
}
main.c
#include "stm32f10x.h"
#include "./moto/bsp_moto.h"
// 延迟time毫秒
void Delay_ms(uint16_t time)
{
u16 i=0;
while(time--)
{
i=10000; //自己定义
while(i--) ;
}
}
int main(void)
{
GPIO_Moto_Init();
while(1)
{
// Moto1正转,延迟2秒
Moto1_Forward();
Delay_ms(2000);
// Moto1反转,延迟2秒
Moto1_Reverse();
Delay_ms(2000);
}
}
实验现象:
马达正转2秒,反转2秒,如此循环
=========== 正转2秒,停止2秒,反转2秒,停止2秒,如此循环 ============
int main(void)
{
GPIO_Moto_Init();
while(1)
{
// Moto1正转2秒
Moto1_Forward();
Delay_ms(2000);
// Moto1停止2秒
Moto1_Pause();
Delay_ms(2000);
// Moto1反转2秒
Moto1_Reverse();
Delay_ms(2000);
// Moto1停止2秒
Moto1_Pause();
Delay_ms(2000);
}
}
===========================================================================
转载2:https://blog.csdn.net/teavamc/article/details/77429519
本文仅简单驱动该模块并实现直流减速电机的正反控制,并无步进电机的控制。
实验环境:
(一)STM32F10X 单片机
(二)L298N驱动模块
(三)若干直流减速电机
第一步:L298N正确与STM32接线
我的L298N的模块如下
我们可以参考下图进行接线
然后买模块的时候,商家也提供了一份接线图
好了,现在接线就变得非常简单了,我把我的接线图贴上来供大家参考:
正确的配置后我们就可以开始编写L298N的驱动程序了,根据L298N的使用手册,我们可以知道298是使用IN端口和MCU板子上的GPIO引脚进行TLL电位信号通讯的,所以操作起来也十分的简单,就配置GPIO引脚的电平信号即可操作。
上图是用于驱动直流电机的TLL配置图,下图是用于驱动步进电机的TLL配置图
我们这里采用的是直流电机,所以只看直流电机的就可以了。
我们从TLL配置图可以知道,我们只用配置高低电平就实现控制电机的正反转,那我们来写一个示例程序程序。
这里是motor.c
-
-
-
-
-
-
void Motor_12_Config(void) //定义初始化函数
-
{
-
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO_InitTypeDef结构体
-
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //开启引脚时钟
-
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //定义IN引脚
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出功率
-
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA的引脚参数,写进
-
-
GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); //所有引脚拉低
-
}
-
-
void Motor_1_STOP(void)
-
{
-
IN1(High);
-
IN2(High);
-
}
-
-
void Motor_1_PRun(void)
-
{
-
IN1(Low);
-
IN2(High);
-
}
-
-
void Motor_1_NRun(void)
-
{
-
IN1(High);
-
IN2(Low);
-
}
-
-
void Motor_2_STOP(void)
-
{
-
IN3(High);
-
IN4(High);
-
}
-
-
void Motor_2_PRun(void)
-
{
-
IN3(Low);
-
IN4(High);
-
}
-
-
void Motor_2_NRun(void)
-
{
-
IN3(High);
-
IN4(Low);
-
}
其相关的值都在头文件中进行了宏定义,我们再来看头文件
motor.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
void Motor_12_Config(void);
-
-
void Motor_1_STOP(void);
-
void Motor_1_PRun(void);
-
void Motor_1_NRun(void);
-
-
void Motor_2_STOP(void);
-
void Motor_2_PRun(void);
-
void Motor_2_NRun(void);
-
-
程序文件都写完了之后,我们就在主程序中调用即可。
main.c
-
-
-
-
-
-
-
-
-
-
int main(void)
-
{
-
Motor_12_Config(); //298电机驱动初始化
-
delay_init(); //延时函数初始化
-
Key1_GPIO_Config(); //按键初始化
-
-
while(1)
-
{
-
Motor_1_PRun(); //正转
-
Motor_2_PRun();
-
-
delay_ms(10000); //转三秒
-
delay_ms(10000);
-
delay_ms(10000);
-
-
Motor_1_NRun(); //反转
-
Motor_2_NRun();
-
-
delay_ms(10000); //转三秒
-
delay_ms(10000);
-
delay_ms(10000);
-
-
Motor_1_STOP(); //停止
-
Motor_2_STOP();
-
-
delay_ms(10000); //停三秒
-
delay_ms(10000);
-
delay_ms(10000);
-
}
-
}
然后rebuild整个工程,靠近stm32直接运行就可以调用了。
非常简单的代码,但是具体使用的话建议还是连接PWM进行分档与调速
【最后提醒】
如果出现了电机没反应的情况,线路连接和程序确定没有问题,那么问题就很可能 STM32没有和L298N共地!!!
STM32一定要和L298N共地才行!!!
图中绿色圈圈内的那根粉红色的线就是 STM32 连接到了 12V 电源的 GND