直流电机驱动模块--第四组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
直流电机驱动模块
一、摘要
本直流电机采用集成芯片L298和由分立元件构成的驱动电路模块来驱动,控制端连接51单片机,由51单片机控制输出PWM 脉冲控制L298和分立元件驱动电路模块的输出和PWM 脉冲输出的方向,从而控制直流电机的转速大小和正反转。本次测试采用51最小系统板、L298驱动电路和分立元件驱动电路模块,对单片机进行编程间接控制直流电机的启停、转速大小和正反转。
关键字:直流电机、L298N 、AT89C51、PWM
二、L298芯片介绍
L298是SGS 公司的产品,比较常见的是15脚Multiwatt 封装的L298N ,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。
图为L298驱动芯片
L298N 可接受标准TTL 逻辑电平信号V SS ,V SS 可接4.5~7 V 电压。4脚V S 接电源电压,V S 电压范围V IH 为+2.5~46 V 。输出电流可达2.5 A ,可驱动电
感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验模块中我们选用驱动两台电动机。5,7,10,12脚接输入
控制电平,由单片机控制,控制电机的启停、正反转和速度大小。E nA ,E nB 接控
制使能端,可控制电机的停转,本实验模块中让其接电源正极使L298处于导通状态。
L298内部原理图
三、硬件设计
IN1
IN2
ENA OUT1OUT2OUT3OUT4
IN3IN4ENB
6V 动力电源
+5V:芯片电压5V。
VCC:电机电压,最大可接50V。
GND:共地接法。
输出端:接电机。
EN1、EN2:高电平有效,EN1、EN2分别为IN1和IN2、IN3和IN4的使能端。
IN1~ IN4:输入端,输入端电平和输出端电平是对应的。
四、程序设计
#include
#define TH0_TL0 (65536-1000)//设定中断的间隔时长
unsigned char count0 = 50;//低电平的占空比
unsigned char count1 = 0;//高电平的占空比
bit Flag = 1;//电机正反转标志位,1正转,0反转
sbit Key_add=P2 ^ 0; //电机减速
sbit Key_dec=P2 ^ 1; //电机加速
sbit Key_turn=P2 ^ 2; //电机换向
sbit PWM1=P2^6;//PWM 通道1,反转脉冲
sbit PWM2=P2^7;//PWM 通道2,正转脉冲
unsigned char Time_delay;
/************函数声明**************/
void Delay(unsigned char x);
void Motor_speed_high(void);
void Motor_speed_low(void);
void Motor_turn(void);
void Timer0_init(void);
/****************延时处理**********************/
void Delay(unsigned char x)
{
Time_delay = x;
while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔}
/*******按键处理加pwm占空比,电机加速**********/
void Motor_speed_high(void)//
{
if(Key_add==0)
{
Delay(10);
if(Key_add==0)
{
count0 += 5;
if(count0 >= 100)
{
count0 = 100;
}
}
while(!Key_add);//等待键松开
}
}
/******按键处理减pwm占空比,电机减速*****/
void Motor_speed_low(void)
{
if(Key_dec==0)
Delay(10);
if(Key_dec==0)
{
count0 -= 5;
if(count0 <= 0)
{
count0 = 0;
}
}
while(!Key_dec );
}
}
/************电机正反向控制**************/ void Motor_turn(void)
{
if(Key_turn == 0)
{
Delay(10);
if(Key_turn == 0)
{
Flag = ~Flag;
}
while(!Key_turn);
}
}
/***********定时器0初始化***********/ void Timer0_init(void)
{
TMOD=0x01; //定时器0工作于方式1
TH0=TH0_TL0/256;
TL0=TH0_TL0%256;
TR0=1;
ET0=1;
EA=1;
}
/*********主函数********************/
void main(void)
{
Timer0_init();