一、直流电机简介和PWM原理
直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
直流电机主要由永磁体(定子)、线圈(转子)和换向器组成
除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等
大功率器件直接驱动
H桥驱动
PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
PWM重要参数:
频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距
电机控制:让电机转一毫秒再停一毫秒,但是由于其具有惯性不可能立马停止,这样做可以使电机处于一个稳定的低速状态。
二、呼吸灯
#include <REGX52.H>
sbit LED=P2^0;
void Delay(unsigned int t)
{
while(t--);
}
void main()
{
unsigned char Time,i;
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);
}
}
}
}
本来想弄全部一起亮,但是一弄蜂鸣器就开始啸叫...由于在自习室吓得我,马上关了哈哈哈哈哈哈哈哈哈,还觉得莫名其妙,后面才想起P2^5是蜂鸣器()。因为P2是包含八个led的,需要用8位16进制来给每一个led赋值,p2=1就相当于p2=0x01就只亮第一个。0x00全亮,0xFF全灭。
三、直流电机调速
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"
sbit Motor=P1^0;
unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;}
if(Speed==1){Compare=25;}
if(Speed==2){Compare=50;}
if(Speed==3){Compare=100;}
}
Nixie(1,Speed);
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100;
if(Counter<Compare)
{
Motor=1;
}
else
{
Motor=0;
}
}
四、用定时器实现的呼吸灯
#include <REGX52.H>
#include "Timer0.h"
sbit LED=P2^0;
unsigned char Counter,Compare,Flag;
void main()
{
Timer0_Init();
while(1)
{
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100;
Compare%=100;
if(Compare>=99)
{
Flag=!Flag;
Counter=0;
Compare=0;
}
if(Flag==0)
{
if(Counter<Compare)
{
LED=0;
}
else
{
LED=1;
}
if(Counter>=99){Compare++;}
}
else if(Flag==1)
{
if(Counter<Compare)
{
LED=1;
}
else
{
LED=0;
}
if(Counter>=99){Compare++;}
}
}
五、潮汐灯(呼吸流水灯)
应该还算是和别人发过那种不一样。他们的是一个呼吸完才到下一个,我这个算是亮到一半就亮下一个。(。・ω・。)要不起名字叫潮汐灯?把时间弄更长一点,亮度再调暗一点,应该很合适。不过本来想用定时器来着。。。。只有四个是因为P2 5一弄tmd煞笔蜂鸣器也要响。。。。。不知道有没有人能帮我解决这个引脚共用的问题(T⌓T)
#include <REGX52.H>
#define LED P2
void Delay(unsigned int t)
{
while(t--);
}
void main()
{
unsigned char Time,i;
while(1)
{
for(Time=0;Time<50;Time++)//0
{
for(i=0;i<20;i++)
{
LED=0xFE;//1111 1110
Delay(Time);
LED=0xFF;//1111 1111
Delay(50-Time);
}
}
for(Time=0;Time<50;Time++)//1
{
for(i=0;i<20;i++)
{
LED=0xFD;//1111 1101
Delay(Time);
LED=0xFE;//1111 1110
Delay(50-Time);
}
}
for(Time=0;Time<50;Time++)//2
{
for(i=0;i<20;i++)
{
LED=0xFB;//1111 1011
Delay(Time);
LED=0xFD;//1111 1101
Delay(50-Time);
}
}
for(Time=0;Time<50;Time++)//1
{
for(i=0;i<20;i++)
{
LED=0xF7;//1111 0111
Delay(Time);
LED=0xFB;//1111 1011
Delay(50-Time);
}
}
for(Time=0;Time<50;Time++)//1
{
for(i=0;i<20;i++)
{
LED=0xFF;//1111 1111
Delay(Time);
LED=0xF7;//1111 0111
Delay(50-Time);
}
}
}
}