STC89C5 2 学习笔记( 十一 )
综述:本文讲述了直流电机以及PWM调速。
一、直流电机
1、特点
(1)直流电机能将电能转化位机械能。
(2)直流电机有两个电极,电极正接时,电机正转;电极反接时,电机反转。
(3)电机的功率比较大,不可以直接接在单片机的IO口上,需要在IO口和电机之间接驱动电路。
2、常见的两种驱动电路
(1)直接驱动电路:电机只能固定一个方向转动。
①三极管直接驱动
电路原理:如果IN输入低电平,三极管导通,电流从电源流向三极管流向电机。当IN输入高电平时,三极管截止,电流不导通,而由于电机是一个感性元件,电流不能突变,于是,电机会产生一个极大的电压,这时,电机和三极管产生对抗:当电机的感性很大时,三极管击穿或者IO击穿,对电路的稳定性和安全性造成影响。所以这里必须要有二极管,做续流二极管的作用,可以在三极管断开时,和电机形成回路,使电机的电流流向二极管,逐渐消耗电流,达到保护电路的作用。
(拓展:如果电路中有电感元件,由于电流不能突变,那么可能会产生一个高于电源的电压,产生巨大的危险。)
②ULN2003驱动电路
ULN2003驱动电路也是只能使电机往一个方向转动的电路。由于ULN2003内部相当于有达林顿管,也能够达到保护电路的作用,左移可以直接在芯片外部接电机(Vcc接电机正极,OUT1接电机负极),当P10为高电平时,OUT1输出为低电平,电机转动。
(2)H桥驱动电路:电机可以向两个方向转动。
IN1和IN4导通,IN2和IN3断开时,电机正转;IN2和IN3导通,IN1和IN4断开时,电机反转。这里由于电机既能正转,又能反转,所以不需要加续流二极管,也能具有很强的耐压性。
二、PWM
1、PWM调速原理
通过控制开关断开闭合来控制电机速度(脉冲宽度调制)。由于PWM在开关断开时不会立马停止,所以,当单片机快速断开开关,再打开开关时,电机还是转动的,而且,电机会以一个比一直闭合开关小的速度在转动。当电机断开的时间占比越大时,速度就会越小,因此,可以通过控制开关断开闭合时间来控制电机的速度。(类似于开关电源的原理,开关电源是控制开关断开闭合时间来控制输出电压。)
注意:需要在惯性系统里!
2、PWM相关参数
Ts是周期,Ton是高电平时间,Toff是低电平时间。频率f=1/Ts,占空比=Ton/Ts,精度=占空比变化布距(一般会保证调制时间一样的情况下来调整占空比,不同也行)
三、代码
1、LED不同亮度
(1)直接给LED赋值来实现
While(1)
{
LED=0;
LED=1;
LED=1;
LED=1;
LED=1;
LED=1;
LED=1;
}
(2)利用延时函数来实现
While(1)
{
LED=0;
Delay(5);
LED=0;
Delay(95);
}
(3)利用定时器来实现
思路:将LED置0(也可以是1,那么结果就会反过来),然后定时器中设置变量进行计数,在变量未达到比较值时,LED始终保持0的状态,即亮灯状态(LED在低电平时为亮灯状态),当超过比较值后,产生中断,LED置1,待计数值达到最高限度(这里可以看成周期)之内,LED始终为1,即灭灯状态,待计数达到最高限度后,计数会重新开始,LED为0,也即是循环之前的操作。这种循环使LED能够维持它的亮度。这里可以通过改变比较值来改变占空比,从而改变LED灯的亮度。
(利用定时器和计数器来实现计数,再通过计数的值和比较值相比来实现置1还是置0,实现LED占空比,最终实现改变比较值的大小就能控制LED亮度。)
void Timer0_Routine() interrupt 1
{
TL0=0x9C;
TH0=0xFF;
Counter++;
Counter%=100;
if (Counter<Compare)
{
LED=0
}
else
{
LED=1;
}
}
2、LED呼吸灯
(1)在while里运用for循环和延时函数
思路:
①使LED亮一小段时间,灭一小段时间,使LED达到一种亮度;
②延长①状态相应的时间,呈现维持LED亮度的现象;
③慢慢增加LED高电平的时间,呈现LED慢慢变亮的现象;
④再慢慢减少LED高电平的时间,呈现LED慢慢变暗的现象;
⑤循环增加LED高电平的时间与减少LED高电平的时间,呈现LED慢慢变暗后又慢慢变亮的,达到一种呼吸灯的效果。
while(1)
{
for(Time=0;Time<100;Time++)
{
for(i=0;i<20;i++)
{
LED=0;
Delay(Time);
LED=1;
Delay(100-Time);
}
}
for(Time=100;Time>0;Time--)
{
for(i=0;i<20;i++)
{
LED=0;
Delay(Time);
LED=1;
Delay(100-Time);
}
}
}
}
(2)利用定时器
由于(1)需要不断进行for循环和Delay,占用太多CPU资源,于是可以利用定时器来实现减少CPU资源浪费。
参考视频:51单片机学习.视频
侵权联系删除!