1 1 0 停止
在直流电动机的驱动中对大功率的电动机常采用IGBT作为主开关元件,对中小功率的电机常采用功率场效应管作为主开关元件。另外还可以采用集成电路来完成对电机的驱动,系统采用集成电路L298来驱动电机,L298引脚接线图如图10所示:
图10 L298引脚接线图
L298是双H高电压大电流功率集成电路。直接采用L逻辑电平控制,可以驱动继电器、直流电动机、步进电动机等电感性负载。其内部有两个完全相同的功率放大回路[15]。其内部结构和引脚功能如图2-2所示。
L298引脚符号及功能:
SENSA、SENSB:分别为两个H桥的电流反馈脚,不用时可以直接接地 ENA、ENB:使能端,输入PWM信号
IN1、IN2、IN3、IN4:输入端,TTL逻辑电平信号
OUT1、OUT2、OUT3、OUT4:输出端,与对应输入端同逻辑 VCC:逻辑控制电源,4.5~7V GND:地
VSS:电机驱动电源,最小值需比输入的低电平电压高
4.5 LED数码管显示
4.5.1 LED简介
LED(Light Emitting Diode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,它们之间就形成一个“P-N结”。
当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。而光的波长也就是光的颜色,是由形成P-N结的材料决定的。除半导体激光器外,当电流激励时能发射光学辐射的半导体二极管。严格地讲,术语LED应该仅应用于发射可见光的二极管;发射近红外辐射的二极管叫红外发光二极管(IRED,Infrared Emitting Diode);发射峰值波长在可见光短波限附近,由部份紫外辐射的二极管称为紫外发光二极管;但是习惯上把上述三种半导体二极管统称为发光二极管。 4.5.2 LED数码管和单片机的连接
LED数码管接线如图11所示:
图11 LED数码管接线
电路的接法决定了必须采用逐位扫描显示方式。即从段选口送出某位LED的字型码,然后选通该位LED,并保持一段延时时间。然后选通下一位,直到所有位扫描完,完成对PWM的占空比在LED上的实时显示。
4.6独立键盘控制模块
独立式按键就是各按键相互独立,每个按键各接入一根输入线,一根输入线上的按键工作状态不会影响其他输入线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键按下了。独立式按键电路配置灵活,软件简单。但每个按键需要占用一个输入口线,在按键数量较多时,需要较多的输入口线且电路结构复杂,故此种键盘适用于按键较少或操作速度较高的场合。
消除键抖动。一般按键在按下的时候有抖动的问题,即键的簧片在按下时会有轻微的弹跳,需经过一个短暂的时间才会可靠地接触。若在簧片抖动时进行扫描就可能得出不正确的结果。因此,在程序中要考虑防抖动的问题。最简单的办法是在检测到有键按下时,等待(延迟)一段时间再进行“行扫描”,延迟时间为10~20ms。这可通过调用子程序来解决,当系统中有显示子程序时,调用几次显示子程序也能同时达到消除抖动的目的。按键控制模块如图12所示:
图12 按键控制模块
5系统的软件设计
5.1系统软件设计分析
在进行单片机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在控制系统设计中占重要地位。
在程序中通过软件产生PWM,送出预设占空比的PWM波形。PWM(脉冲宽度调制)是一系列周期固定、占空比可调的脉冲系列,由于每个脉冲的高电平时间和低电平时间之和必须等于周期数,所以输出电平的维持时间必须由定时器来控制。设PWM周期为T,高电平时间为TH,低电平时间为TL,电压为VCC,则输出电压的平均值为: =VCC*TH(TH+TL)=VCC*THT=aVCC,当VCC固定时,其电压值取决于PWM波形的占空比a,而PWM的占空比由单片机软件内部用于控制PWM输出的寄存器值决定。
软件主要由3部分组成:主程序、键盘扫描程序、中断处理程序。主程序流程如图12所示:
图12 主程序流程图
5.2系统程序设计分析
5.2.1主程序设计
该主程序主要完成初始化,设置定时常数和中断入口程序,主程序不断的循环处于等待中断状态。
main() {
Time0_int();
while(1) {
if(KSW==0) { }
if(KLR==0)
检测左转、右转
检测开始、停止
延时去抖
**********按键处理*****************************************
DelayM(20); if(KSW==0) {
SW=~SW; }
while(KSW==0); 等待键释放
{ }
if(KSPU==0) {
DelayM(20); if(KSPU==0) {
pwmH++; if(pwmH==pwm) {
pwmH=pwm-1; } }
延时去抖
检测加速
DelayM(20); if(KLR==0) LR=~LR; }
等待键释放
延时去抖
{
while(KLR==0);
while(KSPU==0); }
if(KSPD==0) {
DelayM(20); if(KSPD==0) {
pwmH--; }
while(KSPD==0);
if(pwmH==0) {
pwmH=1;
延时去抖
检测减速
}
}
if(SW==0) {
****************************************************************
}
M1=0; M2=0; bn=0; clearRAM(); } if(SW==1)
{ bn=0; }
clearRAM(); putin(pwm); putin(pwm10); putin(12);
putin(pwmH); putin(pwmH10); if(LR==0) { M1=0; } if(LR==1) { } } ledxs();
数码管显示
M1=M; M2=0; putin(10);
显示右转R
M2=M; putin(11);
显示左转L
显示PWM个位 显示-
显示PWMH个位 显示PWMH十位 显示PWM十位
5.2.2按键延时程序
通过按键延时程序来判断按键的按下与否,消除按键的抖动
void Delay(unsigned int i) 延时单次6us {
while(i--); }
void DelayM(unsigned int t)
延时单次1ms