Skip to content

直流电机驱动PWM

直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转

直流电机主要由永磁体(定子)、线圈(转子)和换向器组成

除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等

驱动电路

  • 大功率器件直接驱动

不具备变换电机转动方向的能力。

由于电机(感性元件)具有较大的电感,关闭电机的一瞬间,由于电感需要维持原有电流,如果此时电机短路,就会产生较大的电压,甚至高出电源电压。因此接上 续流二极管 ,可以实现导通,避免突发大电压。

image-20250130200100522

  • H桥驱动

image-20250130200118296

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;
    }
}