直流电机驱动PWM
直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
直流电机主要由永磁体(定子)、线圈(转子)和换向器组成
除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等
驱动电路¶
- 大功率器件直接驱动
不具备变换电机转动方向的能力。
由于电机(感性元件)具有较大的电感,关闭电机的一瞬间,由于电感需要维持原有电流,如果此时电机短路,就会产生较大的电压,甚至高出电源电压。因此接上 续流二极管 ,可以实现导通,避免突发大电压。
- H桥驱动
PWM介绍¶
PWM (Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
PWM重要参数:
频率 = \(1 / T_S\),占空比=\(T_{ON}/T_S\),精度=占空比变化步距,\(T_{ON}+T_{OFF}=T_S\)
产生PWM方法¶
graph TD
A[计数器,定时自增] <-->|比较大小| B[比较值,用户设置]
B --> C{计数器 < 比较值}
B --> D{计数器 >= 比较值}
C -->|是| E[输出0]
D -->|是| F[输出1]
小于输出0,还是大于输出0;等于号在小于还是大于,都可以进行配置。
LED呼吸灯¶
main.cpp
#include <REGX52.H>
#include "Nixie.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;
NixieTube(1, Time);
Delay(Time);
LED = 1;
NixieTube(1, 100-Time);
Delay(100 - Time);
}
}
for(Time = 100; Time > 0; Time--){
for(i = 0; i < 20; i++){
LED = 0;
NixieTube(1, Time);
Delay(Time);
LED = 1;
NixieTube(1, 100-Time);
Delay(100 - Time);
}
}
}
}
直流电机调速¶
main.cpp
#include <REGX52.H>
#include "Nixie.h"
#include "Delay.h"
#include "Key.h"
#include "Timer0.h"
unsigned char Counter, Compare;
unsigned char KeyNumber, Speed;
sbit LED = P2^0;
sbit Motor = P1^0;
void main(){
Timer0Init();
Compare = 4;
while(1){
NixieTube(1, Speed);
KeyNumber = Key();
if(KeyNumber == 1){
Speed++;
Speed %= 4;
if(Speed == 0) Compare = 0;
if(Speed == 1) Compare = 50;
if(Speed == 2) Compare = 75;
if(Speed == 3) Compare = 100;
}
if(KeyNumber == 2){
Speed--;
Speed %= 4;
if(Speed == 0) Compare = 0;
if(Speed == 1) Compare = 50;
if(Speed == 2) Compare = 75;
if(Speed == 3) Compare = 100;
}
if(KeyNumber == 3){
Speed = 0;
Compare = 0;
}
}
}
void Timer0_Rountine(void) interrupt 1
{
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter %= 100;
if(Counter < Compare){
Motor = 1;
}else{
Motor = 0;
}
}