josephcnblog

转载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

 

  1. #include "motor_1.h" //导入led头文件
  2. #include "stm32f10x.h" //导入STM32官方库
  3. #include "stm32f10x_rcc.h" //导入STM32的RCC时钟库
  4. #include "delay_other.h" //延时库
  5.  
  6. void Motor_12_Config(void) //定义初始化函数
  7. {
  8. GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO_InitTypeDef结构体
  9. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //开启引脚时钟
  10.  
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //定义IN引脚
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出功率
  14. GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA的引脚参数,写进
  15.  
  16. GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); //所有引脚拉低
  17. }
  18.  
  19. void Motor_1_STOP(void)
  20. {
  21. IN1(High);
  22. IN2(High);
  23. }
  24.  
  25. void Motor_1_PRun(void)
  26. {
  27. IN1(Low);
  28. IN2(High);
  29. }
  30.  
  31. void Motor_1_NRun(void)
  32. {
  33. IN1(High);
  34. IN2(Low);
  35. }
  36.  
  37. void Motor_2_STOP(void)
  38. {
  39. IN3(High);
  40. IN4(High);
  41. }
  42.  
  43. void Motor_2_PRun(void)
  44. {
  45. IN3(Low);
  46. IN4(High);
  47. }
  48.  
  49. void Motor_2_NRun(void)
  50. {
  51. IN3(High);
  52. IN4(Low);
  53. }

 

其相关的值都在头文件中进行了宏定义,我们再来看头文件

motor.h

 

  1. #ifndef __MOTOR1_H
  2. #define __MOTOR1_H
  3.  
  4.  
  5. #include "stm32f10x.h"
  6. #include "stm32f10x_gpio.h"
  7.  
  8. #define High 1
  9. #define Low 0
  10.  
  11. #define IN1(a) if (a) \
  12. GPIO_SetBits(GPIOA,GPIO_Pin_2);\
  13. else \
  14. GPIO_ResetBits(GPIOA,GPIO_Pin_2)
  15.  
  16. #define IN2(a) if (a) \
  17. GPIO_SetBits(GPIOA,GPIO_Pin_3);\
  18. else \
  19. GPIO_ResetBits(GPIOA,GPIO_Pin_3)
  20.  
  21. #define IN3(a) if (a) \
  22. GPIO_SetBits(GPIOA,GPIO_Pin_4);\
  23. else \
  24. GPIO_ResetBits(GPIOA,GPIO_Pin_4)
  25.  
  26. #define IN4(a) if (a) \
  27. GPIO_SetBits(GPIOA,GPIO_Pin_5);\
  28. else \
  29. GPIO_ResetBits(GPIOA,GPIO_Pin_5)
  30.  
  31. void Motor_12_Config(void);
  32.  
  33. void Motor_1_STOP(void);
  34. void Motor_1_PRun(void);
  35. void Motor_1_NRun(void);
  36.  
  37. void Motor_2_STOP(void);
  38. void Motor_2_PRun(void);
  39. void Motor_2_NRun(void);
  40.  
  41. #endif


程序文件都写完了之后,我们就在主程序中调用即可。

main.c

 

  1. #include "stm32f10x.h" //官方库
  2. #include "stm32f10x_gpio.h"
  3. #include "stm32f10x_rcc.h"
  4.  
  5. #include "motor_1.h"
  6. #include "delay_other.h"
  7. #include "Key_1.h"
  8.  
  9.  
  10. int main(void)
  11. {
  12. Motor_12_Config(); //298电机驱动初始化
  13. delay_init(); //延时函数初始化
  14. Key1_GPIO_Config(); //按键初始化
  15.  
  16. while(1)
  17. {
  18. Motor_1_PRun(); //正转
  19. Motor_2_PRun();
  20.  
  21. delay_ms(10000); //转三秒
  22. delay_ms(10000);
  23. delay_ms(10000);
  24.  
  25. Motor_1_NRun(); //反转
  26. Motor_2_NRun();
  27.  
  28. delay_ms(10000); //转三秒
  29. delay_ms(10000);
  30. delay_ms(10000);
  31.  
  32. Motor_1_STOP(); //停止
  33. Motor_2_STOP();
  34.  
  35. delay_ms(10000); //停三秒
  36. delay_ms(10000);
  37. delay_ms(10000);
  38. }
  39. }


然后rebuild整个工程,靠近stm32直接运行就可以调用了。

非常简单的代码,但是具体使用的话建议还是连接PWM进行分档与调速

 

【最后提醒】

如果出现了电机没反应的情况,线路连接和程序确定没有问题,那么问题就很可能 STM32没有和L298N共地!!!

STM32一定要和L298N共地才行!!!


 

图中绿色圈圈内的那根粉红色的线就是 STM32 连接到了 12V 电源的 GND

 

分类:

技术点:

相关文章: