树梅派硬件学习_L298N模块驱动

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树梅派硬件学习_L298N模块驱动相关的知识,希望对你有一定的参考价值。

L298N模块驱动电机

L298N模块概述

硬件图:
在这里插入图片描述

控制逻辑图:
在这里插入图片描述

一. 电源引脚
VCC 外接直流电源引脚,电压范围在5~35V之间
GND GND是接地引脚,连接到电源负极
5V 驱动芯片内部逻辑供电引脚,如果安装了5V跳帽,则此引脚可输出5V电压,为微控板或其他电路提供电力供给,如果拔掉5V跳帽,则需要独立外接5V电源
二. 控制引脚

  1. IN1 & IN2 电机驱动器A的输入引脚,控制电机A转动及旋转角度
    IN1输入高电平HIGH,IN2输入低电平LOW,对应电机A正转
    IN1输入低电平LOW,IN2输入高电平HIGH,对应电机A反转
    IN1、IN2同时输入高电平HIGH或低电平LOW,对应电机A停止转动
    调速就是改变IN1、IN2高电平的占空比(需拔掉ENA处跳帽)

  2. IN3 & IN4 电机驱动器B的输入引脚,控制电机B转动及旋转角度
    IN3输入高电平HIGH,IN4输入低电平LOW,对应电机B正转
    IN3输入低电平LOW,IN4输入高电平HIGH,对应电机B反转
    IN3、IN4同时输入高电平HIGH或低电平LOW,对应电机B停止转动
    调速就是改变IN3、IN4高电平的占空比(需拔掉ENB处跳帽)

三. 输出引脚

  1. OUT1 & OUT2 电机驱动器A的输出引脚,接直流电机A或步进电机的A+和A-
  2. OUT3 & OUT3 电机驱动器B的输出引脚,接直流电机B或步进电机的B+和B-

四. 调速控制引脚

  1. ENA 电机A调速开关引脚,拔掉跳帽,使用PWM对电机A调速,插上电机A高速运行
  2. ENB 电机B调速开关引脚,拔掉跳帽,使用PWM对电机B调速,插上电机B高速运行

树梅派的pwm

一般使用软件模拟pwm:
树莓派硬件上支持的PWM输出的引脚有限,为了突破这个限制,wiringPi提供了软件实现的PWM输出API。
需要包含头文件:#include <softPwm.h>
编译时需要添pthread库链接: -lpthread

  1. 创建软件PWM
int softPwmCreate (int pin, int initialValue, int pwmRange);

参数:
pin:用来作为软件PWM输出的引脚
initalValue:引脚输出的初始值
pwmRange:PWM值的范围上限
返回:0表示成功。
功能 : 使用一个指定的pin引脚创建一个模拟的PWM输出引脚

  1. 设置占空比
void softPwmWrite (int pin, int value);

参数:
pin:通过softPwmCreate创建的引脚
value:PWM引脚输出的值
功能 : 更新引脚输出的PWM值

硬件接线图

在这里插入图片描述

L298N模块驱动代码

初始化:

#ifndef L298N_H
#define L298N_H

#include <wiringPi.h>
#include <softPwm.h>

#define PIN_PWM 1
#define PIN_LED_forward 21
#define PIN_LED_backward 22
#define PIN_IN1 28 
#define PIN_IN2 29 

int speed_val = 500; //0~1024

void Motor_Setup(void)
{
	pinMode(PIN_LED_forward,OUTPUT);
	pinMode(PIN_LED_backward,OUTPUT);
	digitalWrite(PIN_LED_forward,0);
	digitalWrite(PIN_LED_backward,0);
	
	pinMode(PIN_IN1,OUTPUT);
	pinMode(PIN_IN2,OUTPUT);
	digitalWrite(PIN_IN1,0);
	digitalWrite(PIN_IN2,0);
	
	softPwmCreate(PIN_PWM, speed_val, 1000);
}

电机正反转控制:

void Motor_Forward(void)
{
	softPwmWrite (PIN_PWM, speed_val);
	digitalWrite(PIN_LED_forward,1);
	digitalWrite(PIN_LED_backward,0);
	digitalWrite(PIN_IN1,1);
	digitalWrite(PIN_IN2,0);
	printf("正转...\\n");
}

void Motor_Backward(void)
{
	softPwmWrite (PIN_PWM, speed_val);
	digitalWrite(PIN_LED_forward,0);
	digitalWrite(PIN_LED_backward,1);
	digitalWrite(PIN_IN1,0);
	digitalWrite(PIN_IN2,1);
	printf("反转...\\n");
}

void Motor_Stop(void)
{
	softPwmWrite (PIN_PWM, 0);
	digitalWrite(PIN_LED_forward,0);
	digitalWrite(PIN_LED_backward,0);
	digitalWrite(PIN_IN1,0);
	digitalWrite(PIN_IN2,0);
	printf("停止...\\n");
}

速度控制:

void speedUp(void)
{
	speed_val += 100;
	if(speed_val>=1000) speed_val=1000;
	softPwmWrite (PIN_PWM, speed_val);
	printf("加速: %d %%\\n",speed_val);
}

void speedDown(void)
{
	speed_val -= 100;
	if(speed_val<=0) speed_val=0;
	softPwmWrite (PIN_PWM, speed_val);
	printf("减速: %d %%\\n",speed_val);
}

主程序:

/*
 * L298N.c
 * 
 * 
 */

#include "IR.h"
#include "L298N.h"

void wiringPiStart(void)
{
	wiringPiSetup();
	IR_Setup();
	Motor_Setup();
}

int main(int argc, char **argv)
{
	wiringPiStart();
	while(1){
		if(IR_ReadData())
		{
			if(IR_code[2] == 0x45) Motor_Forward();
			if(IR_code[2] == 0x46) Motor_Stop();
			if(IR_code[2] == 0x47) Motor_Backward();
			if(IR_code[2] == 0x40) speedDown();
			if(IR_code[2] == 0x43) speedUp();
			if(IR_code[2] == 0x44) {Motor_Stop();return 0;}
		}
		delay(500);
	}
	return 0;
}


输出

正转...
加速: 300 %
加速: 400 %
加速: 500 %
加速: 600 %
加速: 700 %
加速: 800 %
加速: 900 %
加速: 1000 %
减速: 900 %
减速: 800 %
减速: 700 %
减速: 600 %
减速: 500 %
减速: 400 %
减速: 300 %
减速: 200 %
停止...
反转...
停止...

以上是关于树梅派硬件学习_L298N模块驱动的主要内容,如果未能解决你的问题,请参考以下文章

树梅派硬件学习_多线程任务

直流电机+L298N电机驱动模块

树莓派 3 + L298N模块 驱动直流电机

树梅派硬件编程_ADC

树梅派硬件编程_按键中断

树梅派硬件编程_QT_OLED显示字符