跳到主要内容

基于PWM的直流电机调速电路

在本项目中,我将演示如何利用 8051 单片机 生成 PWM(脉宽调制)信号,以及基于 PWM 控制的直流电机调速系统 的实现方法。

1. 引言​

在许多应用中,直流电机(DC Motor)的转速控制至关重要,因为这些应用对精度与保护都有严格要求。这里我们将使用一种称为 PWM(脉宽调制) 的技术来控制直流电机的转速。

直流电机的转速控制可以通过机械或电气方法实现,但这些方法通常需要体积庞大的硬件;相比之下,基于单片机的系统为电机转速控制提供了一种简便的方式。

alt text

在此之前,我们已经学习过如何在没有单片机的情况下,通过 PWM 控制直流电机转速。而在这里,我们将通过单片机来进行同样的实验。

为此,我们将使用 8051 单片机 来产生 PWM 波形。通过改变该 PWM 波形的占空比,我们即可调节直流电机的转速。在 8051 单片机 中,定时器(Timers)被用于产生 PWM 波形。

在本文中,我们将学习如何利用 8051 单片机的定时器 生成 PWM 信号,以及如何使用该 PWM 信号来控制直流电机的转速。

2. PWM信号生成与直流电机调速原理​

2.1 电路原理​

本项目的核心是8051单片机。8051单片机没有专门的PWM电路,因此需要利用定时器和中断来生成PWM信号。

在本项目中,我们将使用8051单片机的Timer0和定时器中断来生成PWM信号。

2.2 如何在8051单片机中生成PWM信号?​

大多数现代单片机(如AVR(例如Arduino)、ARM、PIC等)都配备了专门的PWM硬件和引脚,可以即时激活PWM模式。然而,8051单片机没有这种功能。因此,我们需要使用8051单片机的定时器和中断来生成PWM信号。8051的Timer0配置在Mode0模式下。通过仔细调整高电平和低电平,我们可以保持信号的固定周期。

3. PWM调速电路图​

alt text

4. 电路元件​

  • 8051单片机
  • 11.0592 MHz晶振
  • 电容 — 33pF × 2,10µF
  • 电阻 — 1KΩ × 4,10KΩ × 2
  • 12V直流电机
  • L298N电机驱动模块
  • 按钮 × 5
  • 1KΩ × 8上拉电阻包
  • 串行电缆
  • 12V电池或适配器
  • 连接导线

5. PWM调速电路设计​

5.1 电路设计说明​

电路包括一个8051单片机(及其与振荡器和复位相关的支持电路)、L298N电机驱动模块、直流电机和几个按钮。

12V直流电机连接到L298N电机驱动模块的OUT1和OUT2引脚。电机驱动模块的IN1和IN2引脚连接到+5V(VCC)和GND。电机驱动模块的EN1引脚连接到单片机的P0.0引脚。

四个按钮连接到单片机的P0.4、P0.5、P0.6和P0.7引脚。

通常,我们可以将开关以两种配置方式连接到单片机:上拉配置和下拉配置。

上拉配置:在上拉配置中,单片机引脚被拉高到逻辑1,按钮连接到GND。当按下按钮时,单片机引脚接收逻辑0。

下拉配置:在下拉配置中,单片机引脚被拉低到逻辑0,按钮连接到VCC。当按下按钮时,单片机引脚接收逻辑1。

在本电路中,我们使用上拉配置。因此,我们需要检查逻辑0以确定按钮是否被按下。

alt text

6. 代码​

项目代码如下。

#include<reg51.h>

sbit PWM_Pin = P0^0;
sbit low = P0^4;
sbit medium = P0^5;
sbit high = P0^6;
sbit off = P0^7;

void InitPWM_timer(void);

unsigned char PWM = 0;
unsigned int temp = 0;
char a=1;


int main(void)
{
low=1;
medium=1;
high=1;
off=1;
PWM_Pin=0;

InitPWM_timer();



while(1)
{
if(low==0)
{
PWM=102;
a=0;
}
else if(medium==0)
{
PWM=153;
a=0;
}
else if(high==0)
{
PWM=255;
a=0;
}
else if(off==0)
{
a=1;
PWM_Pin=0;
}
}
}


void InitPWM_timer (void)
{
TMOD &= 0xF0;
TMOD |= 0x01;

TH0 = 0x00;
TL0 = 0x00;

ET0 = 1;
EA = 1;

TR0 = 1;
}


void Timer0_ISR (void) interrupt 1
{
TR0 = 0;

if(PWM_Pin==1 && a==0)
{
PWM_Pin = 0;
temp = (255-PWM);
TH0 = 0xFF;
TL0 = 0xFF - temp&0xFF;
}
else if(PWM_Pin==0 && a==0)
{
PWM_Pin = 1;
temp = PWM;
TH0 = 0xFF;
TL0 = 0xFF - temp&0xFF;
}

TF0 = 0;
TR0 = 1;
}

7. 如何操作电路?​

  1. 将12V电池或适配器连接到开发板。
  2. 打开电源。
  3. 使用编程器将HEX文件烧录到8051单片机中。
  4. 按照电路图连接必要的线路。
  5. 打开电源并按下开关1,观察电机开始旋转,但仅以40%的容量运行。
  6. 按下开关2,电机将以略高于一半的速度运行(60%占空比)。
  7. 按下开关3,电机将以全速旋转(100%占空比)。
  8. 按下开关4以停止电机。

8. 优点​

  • 使用PWM方法可以节省电力。

9. 应用场景​

  • 用于工业中控制电机速度。
  • 用于购物中心。
  • 可以利用该概念控制灯光强度。