基于51单片机的PWM调速

描述

13.1 项目分析

脉宽调制(PWM)基本原理 :控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。 也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。 按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。

例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。 这些脉冲宽度相等,都等于∏/n,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。 如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。 可以看出,各脉冲宽度是按正弦规律变化的。 根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的。 对于正弦的负半周,也可以用同样的方法得到PWM波形。

在PWM波形中,各脉冲的幅值是相等的,要改变等效输出正弦波的幅值时,只要按同一比例系数改变各脉冲的宽度即可,因此在交-直-交变频器中,PWM逆变电路输出的脉冲电压就是直流侧电压的幅值。 根据上述原理,在给出了正弦波频率,幅值和半个周期内的脉冲数后,PWM波形各脉冲的宽度和间隔就可以准确计算出来。 按照计算结果控制电路中各开关器件的通断,就可以得到所需要的PWM波形。

采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同. PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形. 按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。

PWM技术在生活中的应用非常广,最常用的就是开关电源,通过改变脉宽来改变输出的电压,扩展的还有LED调光,直流电机调速,以及显示器中的颜色合成等。

13.2 原理图

逆变电路

**13.3 **源代码

正规的PWM调速的过程应该是用户输入指定的转速,由电机上面的转速传感器采集当前转速输入单片机进行比较,根据转速的差值计算出PWM的占空比,这个占空比是需要提前进行数学建模,将电机的转速与PWM占空比的数学关系推导出来,采用查表法或者数据查询的方式将占空比增大,这里就不进行数学建模,直接采用默认的数据,占空比1%~100% 对应的转速平均分布。 PWM的频率和占空比由定时器0确定,设置频率1000Hz,采用按键设置占空比,源代码如下图所示。

/*********************************************************************************************************
                头    文    件    引    用
*********************************************************************************************************/
#include <reg51.h>                                            //导入51单片机头文件
#include <intrins.h>
/*********************************************************************************************************
              数    据    类    型    定    义
*********************************************************************************************************/
#define u8 unsigned char                                        //定义无符号字符型数据(0~255)
#define u16 unsigned int                                        //定义无符号整型数据(0~65535)
/*********************************************************************************************************
                  变    量    定    义
*********************************************************************************************************/
u8 Duty;                                                //占空比
u8 TIM0_Count ;
u8 LED_Data[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F } ;
/*********************************************************************************************************
                  端    口    定    义
*********************************************************************************************************/
sbit OUT = P2^7 ;                                            //电机接口
/********************************************************
Name    :delay_ms
Function  :毫秒级别延时函数
Paramater  :
      ms:延时的ms数
Return    :None
********************************************************/
void delay_ms( u16 ms )
{
  u8 i ;
  while( --ms )
    for( i=0; i<110; i++ ) ;
}
/********************************************************
Name    :EXIT0_IRQHandler
Function  :外部中断0中断服务函数
Paramater  :None
Return    :None
********************************************************/
void EXIT0_IRQHandler() interrupt 0
{
  do
  {
    Duty ++ ;
    if( Duty==100 )
    {
      TR0 = 0 ;
      Duty = 0 ;
    }
    else
      TR0 = 1 ;

    P2 = 0xFE ;
    P0 = LED_Data[ Duty/10 ] ;
    delay_ms( 2 ) ;

    P2 = 0xFD ;
    P0 = LED_Data[ Duty%10 ] ;
    delay_ms( 2 ) ;

    delay_ms( 500 ) ;
  }while( ( P3&0x04 )!=0x04 ) ;
}
/********************************************************
Name    :TIM0_IRQHandler
Function  :定时器0中断服务函数
Paramater  :None
Return    :None
********************************************************/
void TIM0_IRQHandler() interrupt 1
{
  TH0 = ( 65535-10 )/256 ;                                      //计数器设置频率1000Hz
  TL0 = ( 65535-10 )/256 ;
  TIM0_Count ++ ;
  if( TIM0_Count<=Duty )
    OUT = 0 ;
  else if( ( TIM0_Count<100 )&&( TIM0_Count>Duty ) )
    OUT = 1 ;
  else
  {
    OUT = 0 ;
    TIM0_Count = 0 ;
  }
}
/********************************************************
Name    :KEY_Scan
Function  :键盘扫描
Paramater  :None
Return    :None
********************************************************/
void PWM_Init()
{
  Duty = 0 ;
  TIM0_Count = 0 ;
  IE = 0x83 ;                                              //开启EA+EX0+ET0
  TMOD = 0x01 ;                                            //定时器设置16位模式
  TH0 = ( 65535-10 )/256 ;                                      //计数器设置频率1000Hz
  TL0 = ( 65535-10 )/256 ;
  IT0 = 1 ;                                              //下降沿触发
}
/*********************************************************************************************************
                    主    函    数
*********************************************************************************************************/
void main()
{
  PWM_Init() ;
  while( 1 )
  {
    P2 = 0xFE ;
    P0 = LED_Data[ Duty/10 ] ;
    delay_ms( 2 ) ;

    P2 = 0xFD ;
    P0 = LED_Data[ Duty%10 ] ;
    delay_ms( 2 ) ;
  }
}

13.4 仿真截图

逆变电路

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分