/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include #include #define uchar unsigned char #define uint unsigned int sbit en1=P1^0; /* L298的Enable A */ sbit en2=P1^1; /* L298的Enable B */ sbit s1=P1^2; /* L298的Input 1 */ sbit s2=P1^3; /* L298的Input 2 */ sbit s3=P1^4; /* L298的Input 3 */ sbit s4=P1^5; /* L298的Input 4 */ uchar t=0; /* 中断计数器 */ uchar m1=0; /* 电机1速度值 */ uchar m2=0; /* 电机2速度值 */ uchar tmp1,tmp2; /* 电机当前速度值 */ /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */ void motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) /* 电机1的处理 */ { m1=abs(speed); /* 取速度的绝对值 */ if(speed<0) /* 速度值为负则反转 */ { s1=0; s2=1; } else /* 不为负数则正转 */ { s1=1; s2=0; } } if(index==2) /* 电机2的处理 */ { m2=abs(speed); /* 电机2的速度控制 */ if(speed<0) /* 电机2的方向控制 */ { s3=0; s4=1; } else { s3=1; s4=0; } } } } void delay(uint j) /* 简易延时函数 */ { for(j;j>0;j--); } void main() { uchar i; TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值 */ TL0=0x9B; EA=1; /* 开中断 */ ET0=1; /* 定时器0允许中断 */ TR0=1; /* 启动定时器0 */ while(1) /* 电机实际控制演示 */ { for(i=0;i<=100;i++) /* 正转加速 */ { motor(1,i); motor(2,i); delay(5000); } for(i=100;i>0;i--) /* 正转减速 */ { motor(1,i); motor(2,i); delay(5000); } for(i=0;i<=100;i++) /* 反转加速 */ { motor(1,-i); motor(2,-i); delay(5000); } for(i=100;i>0;i--) /* 反转减速 */ { motor(1,-i); motor(2,-i); delay(5000); } } } void timer0() interrupt 1 /* T0中断服务程序 */ { if(t==0) /* 1个PWM周期完成后才会接受新数值 */ { tmp1=m1; tmp2=m2; } if(t if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */ } L298可驱动2个电机,OUTl、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。1298的逻辑功能如表1所列。 如图1所示,:Intel8253输出二组PWM波,每一组PWM波用来控制一个电机的速度.另外二个I/O口可以控制电机的正反转.控制方法与控制电路都比较简单。即P10、P11控制第一个电机的方向,输入的:PWMl控制第一个电机的速度;P12、P13控制第二个电机的方向,输入的PWM2控制第二个电机的速度。 由于电机在正常工作时对电源的干扰很大,只用一组电源时会影响单片机的正常工作。所以选用双电源供电。一组5V电源给单片机和控制电路供电,另外一组5V、9V电源给L298N的 VSS、 VS供电。在控制部分和电机驱动部分之间用光耦隔开,以免影响控制部分电源的品质。 图1就是一个实现智能小汽车的应用电路。D1、Q1是一对红外发射接收对管,与LM324构成光电传感检测电路。通过Intel8253和1298N可实现汽车的加速、减速、刹停,并可通过两个电机的不同转速实现左转和右转等功能。 L298内部是一个三极管的H桥 VSS是逻辑电平参考电压输入,一般是5V或3.3V逻辑 VS是电机供电你是5V的电机就接5V的电压即可 L298N芯片介绍 L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7 V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46 V。输出电流可达2.5 A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。表1是L298N功能逻辑图。 In3,In4的逻辑图与表1相同。由表1可知EnA为低电平时,输入电平对电机控制起作用,当EnA为高电平,输入电平为一高一低,电机正或反转。同为低电平电机停止,同为高电平电机刹停。 如果单片机还有其他大量的工作要做,请选择有PWM功能的,可以实现精确调速; 如果要求不高,可以由软件模拟PWM输出调制: //P0.0,P0.1为电机驱动口 P0.3口为ENA口 void pwm(uchar speed,uint gotime) { uchar j; for (gotime;gotime>0;gotime--) { for (j=1;j<=100;j++) { if(j<=speed) { P0|=0x03; delay(5); //需要根据实际调节 } else { P&=0xfc; delay(5); //需要根据实际调节 } } } } void delay(uint time) { do { time--; } while (time>1); } void main() { while(1) { P0|=0X08; pwm(30,1000); P0&=0Xfb; delay(10000); P0|=0X08; pwm(50,1000); P0&=0Xfb; delay(10000); P0|=0X08; pwm(80,1000); P0&=0Xfb; delay(10000); }下载本文