一、直流电机简介和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 P2void 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 1110Delay(Time);LED=0xFF;//1111 1111Delay(50-Time);}}for(Time=0;Time<50;Time++)//1{for(i=0;i<20;i++){LED=0xFD;//1111 1101Delay(Time);LED=0xFE;//1111 1110Delay(50-Time);}} for(Time=0;Time<50;Time++)//2{for(i=0;i<20;i++){LED=0xFB;//1111 1011Delay(Time);LED=0xFD;//1111 1101Delay(50-Time);}} for(Time=0;Time<50;Time++)//1{for(i=0;i<20;i++){LED=0xF7;//1111 0111Delay(Time);LED=0xFB;//1111 1011Delay(50-Time);}} for(Time=0;Time<50;Time++)//1{for(i=0;i<20;i++){LED=0xFF;//1111 1111Delay(Time);LED=0xF7;//1111 0111Delay(50-Time);}} }
}