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

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

    关注

    6030

    文章

    44501

    浏览量

    632279
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5123

    浏览量

    213253
  • 51单片机
    +关注

    关注

    273

    文章

    5697

    浏览量

    123046
  • 脉宽调制
    +关注

    关注

    3

    文章

    215

    浏览量

    38273
  • 逆变电路
    +关注

    关注

    19

    文章

    295

    浏览量

    39390
收藏 人收藏

    评论

    相关推荐

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

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

    8098 单片机和伺服电机PWM 调速控制

    8098 单片机和伺服电机PWM 调速控制  摘 要 本文介绍应用8098 单片机丰富的接口功能, 采用数字调制的方法来实现直流伺服电机的PWM
    发表于 04-13 15:09 130次下载

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

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

    51单片机PWM调速程序

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

    51单片机PWM调速程序

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

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

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

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

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

    基于AT89C51单片机直流电机PWM调速程序分享

    这是一款AT89C51单片机直流电机PWM调速程序,程序可以直接用于AT89C52、AT89S51、AT89S
    发表于 10-19 16:03 1.7w次阅读

    基于51单片机直流电机PWM调速程序

    这是一款AT89C51单片机直流电机PWM调速程序,程序可以直接用于AT89C52、AT89S51、AT89S
    的头像 发表于 10-24 15:56 4.9w次阅读
    基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>直流电机<b class='flag-5'>PWM</b><b class='flag-5'>调速</b>程序

    使用51单片机实现霍尔转速测量温度PWM调速系统的设计源代码免费下载

    本文档的主要内容详细介绍的是使用51单片机实现霍尔转速测量温度PWM调速系统的设计源代码免费下载。
    发表于 09-27 18:10 26次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>实现霍尔转速测量温度<b class='flag-5'>PWM</b><b class='flag-5'>调速</b>系统的设计源代码免费下载

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

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

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

    51单片机实现PWM直流电机调速(注释详细)(电源技术投稿)-51单片机实现
    发表于 09-24 14:58 250次下载
    <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>基本原理

    基于单片机直流PWM调速控制设计

    基于单片机直流PWM调速控制设计
    发表于 11-23 16:22 84次下载
    基于<b class='flag-5'>单片机</b>直流<b class='flag-5'>PWM</b><b class='flag-5'>调速</b>控制设计

    基于51单片机直流电机PID调速设计LCD1602仿真可调PWM

    基于51单片机直流电机PID调速设计LCD1602仿真可调PWM
    发表于 11-23 17:36 67次下载
    基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>直流电机PID<b class='flag-5'>调速</b>设计LCD1602仿真可调<b class='flag-5'>PWM</b>