【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转

本文仅简单驱动该模块并实现直流减速电机的正反控制,并无步进电机的控制。

实验环境:

(一)STM32F10X 单片机

(二)L298N驱动模块

(三)若干直流减速电机


第一步:L298N正确与STM32接线

    我的L298N的模块如下

【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转_第1张图片

我们可以参考下图进行接线

【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转_第2张图片

然后买模块的时候,商家也提供了一份接线图

【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转_第3张图片


好了,现在接线就变得非常简单了,我把我的接线图贴上来供大家参考:

【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转_第4张图片


正确的配置后我们就可以开始编写L298N的驱动程序了,根据L298N的使用手册,我们可以知道298是使用IN端口和MCU板子上的GPIO引脚进行TLL电位信号通讯的,所以操作起来也十分的简单,就配置GPIO引脚的电平信号即可操作。

【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转_第5张图片

上图是用于驱动直流电机的TLL配置图,下图是用于驱动步进电机的TLL配置图

【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转_第6张图片

我们这里采用的是直流电机,所以只看直流电机的就可以了。

我们从TLL配置图可以知道,我们只用配置高低电平就实现控制电机的正反转,那我们来写一个示例程序程序。

这里是motor.c

#include "motor_1.h"  //导入led头文件
#include "stm32f10x.h"  //导入STM32官方库
#include "stm32f10x_rcc.h"  //导入STM32的RCC时钟库
#include "delay_other.h"       //延时库

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

#ifndef __MOTOR1_H
#define __MOTOR1_H


#include "stm32f10x.h"
#include "stm32f10x_gpio.h"

#define High    1
#define Low     0

#define IN1(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_2);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_2)

#define IN2(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_3);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_3)

#define IN3(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_4);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_4)

#define IN4(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_5);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_5)

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);

#endif

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

main.c

#include "stm32f10x.h"         //官方库
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

#include "motor_1.h"
#include "delay_other.h"
#include "Key_1.h"


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



有地方不懂的就在评论区问,有错误请指出,大家共同进步!

因本文不太严谨,所以严禁转载!


你可能感兴趣的:(【STM32】)