0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于51单片机的PWM调速

CHANBAEK 来源:滑小稽笔记 作者:电子技术园地 2023-01-17 16:27 次阅读

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 仿真截图

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

    关注

    6001

    文章

    43973

    浏览量

    620845
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4900

    浏览量

    209906
  • 51单片机
    +关注

    关注

    269

    文章

    5649

    浏览量

    120700
  • 脉宽调制
    +关注

    关注

    3

    文章

    204

    浏览量

    38048
  • 逆变电路
    +关注

    关注

    19

    文章

    267

    浏览量

    39133
收藏 人收藏

    评论

    相关推荐

    基于单片机的AT89C51的直流电机PWM调速系统

    基于单片机的AT89C51的直流电机PWM调速系统文章设计了以单片机AT89C51和L298控制
    发表于 12-07 16:34

    单片机小车PWM调速程序

    单片机小车PWM调速程序
    发表于 08-19 11:28

    谁有基于单片机的AT89C51的直流电机PWM调速系统的资料。

    小弟最近研究单片机。急需单片机AT89C51的直流电机脉宽调制(PWM)调速系统。
    发表于 05-19 17:16

    51单片机PWM调速时遇到的问题,哪位大神帮我看看!

    下面是单片机PWM调速直流电机的程序,PWMOUT连接P2.4端口作为PWM输出口,依照程序,当温度在30度以下时,应该输出低电平,但是proteus仿真中却输出了方波
    发表于 04-06 20:31

    怎样去设计基于51单片机的霍尔直流电机PWM调速系统

    基于51单片机的霍尔直流电机PWM调速系统有哪些具体功能?怎样去设计基于51单片机的霍尔直流电机
    发表于 10-19 08:53

    基于51单片机霍尔转速测量温度PWM调速设计方案

    基于51单片机霍尔转速测量温度PWM调速设计
    发表于 09-25 07:32

    基于单片机PWM调速系统设计

    本文主要研究了利用与MCS-51兼容的at89c51单片机,通过PWM方式控制直流电机调速的方法。
    发表于 11-02 18:19 547次下载

    51单片机PWM调速程序

    发表于 08-31 13:35 110次下载

    51单片机PWM调速程序

    单片机pwm产生的方法及程序,里面的很详细的教程
    发表于 11-02 17:36 97次下载

    pwm调速

    51单片机接驱动L298N,PWM调速程序。
    发表于 05-11 11:08 1次下载

    pwm调光程序,基于51单片机pwm调速调光程序

    PW调光是一种利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,应用于ID照明中可以控制灯具的调光。随着节能以及光照的个性化需求越来越多,LED调光已经逐渐形成一个趋势,灯光智能化控制也一直是个热点oP‘WM 调光技术是一个被应用的比较多的一种调光技术,也是一直以来被广为看好的一种调光方式。
    发表于 10-27 14:32 1.3w次阅读

    pwm调速频率,51单片机PWM调速程序

    51单片机pwm调速频率主要通过一个定时器和一个IO口来实现PWM的输出。在一个周期里面,首先让IO口输出高电平,并定时一定的时间然后再将
    发表于 10-30 11:27 2.6w次阅读

    基于STM32单片机的小车PWM调速系统

    基于STM32单片机的小车PWM调速系统
    发表于 06-03 09:22 40次下载

    51单片机实现PWM直流电机调速(注释详细)

    51单片机实现PWM直流电机调速(注释详细)(电源技术投稿)-51单片机实现
    发表于 09-24 14:58 247次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>实现<b class='flag-5'>PWM</b>直流电机<b class='flag-5'>调速</b>(注释详细)

    51 单片机 PWM调速基本原理

    /********************************************************************************* 标题: 恒速运行 *************************
    发表于 11-10 19:50 8次下载
    <b class='flag-5'>51</b> <b class='flag-5'>单片机</b> <b class='flag-5'>PWM</b><b class='flag-5'>调速</b>基本原理