树梅派硬件学习_L298N模块驱动
Posted Leslie X徐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树梅派硬件学习_L298N模块驱动相关的知识,希望对你有一定的参考价值。
L298N模块驱动电机
L298N模块概述
硬件图:
控制逻辑图:
一. 电源引脚
VCC 外接直流电源引脚,电压范围在5~35V之间
GND GND是接地引脚,连接到电源负极
5V 驱动芯片内部逻辑供电引脚,如果安装了5V跳帽,则此引脚可输出5V电压,为微控板或其他电路提供电力供给,如果拔掉5V跳帽,则需要独立外接5V电源
二. 控制引脚
-
IN1 & IN2 电机驱动器A的输入引脚,控制电机A转动及旋转角度
IN1输入高电平HIGH,IN2输入低电平LOW,对应电机A正转
IN1输入低电平LOW,IN2输入高电平HIGH,对应电机A反转
IN1、IN2同时输入高电平HIGH或低电平LOW,对应电机A停止转动
调速就是改变IN1、IN2高电平的占空比(需拔掉ENA处跳帽) -
IN3 & IN4 电机驱动器B的输入引脚,控制电机B转动及旋转角度
IN3输入高电平HIGH,IN4输入低电平LOW,对应电机B正转
IN3输入低电平LOW,IN4输入高电平HIGH,对应电机B反转
IN3、IN4同时输入高电平HIGH或低电平LOW,对应电机B停止转动
调速就是改变IN3、IN4高电平的占空比(需拔掉ENB处跳帽)
三. 输出引脚
- OUT1 & OUT2 电机驱动器A的输出引脚,接直流电机A或步进电机的A+和A-
- OUT3 & OUT3 电机驱动器B的输出引脚,接直流电机B或步进电机的B+和B-
四. 调速控制引脚
- ENA 电机A调速开关引脚,拔掉跳帽,使用PWM对电机A调速,插上电机A高速运行
- ENB 电机B调速开关引脚,拔掉跳帽,使用PWM对电机B调速,插上电机B高速运行
树梅派的pwm
一般使用软件模拟pwm:
树莓派硬件上支持的PWM输出的引脚有限,为了突破这个限制,wiringPi提供了软件实现的PWM输出API。
需要包含头文件:#include <softPwm.h>
编译时需要添pthread库链接: -lpthread
- 创建软件PWM
int softPwmCreate (int pin, int initialValue, int pwmRange);
参数:
pin:用来作为软件PWM输出的引脚
initalValue:引脚输出的初始值
pwmRange:PWM值的范围上限
返回:0表示成功。
功能 : 使用一个指定的pin引脚创建一个模拟的PWM输出引脚
- 设置占空比
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模块驱动的主要内容,如果未能解决你的问题,请参考以下文章