微软公司宣布不再支持你正在使用的 IE浏览器,这会严重影响浏览网页,请使用微软最新的Edge浏览器
您好, 登录| 注册|

基于PIC16F877单片机通过SPWM脉宽调制技术软件产生纯正炫波,内容包含MPLAB源文件和protues仿真文件

  • 2014-04-30 07:57
  • 余健

    LV.0
  • 8718

    浏览

  • 22

    回复

  • 1

    获赞

  • 基于PIC16F877单片机通过SPWM脉宽调制技术软件产生纯正炫波,内容包含MPLAB源文件和protues仿真文件。

    输出波形如下:

    波形输出

    protues的原理图:

    原理图

    C程序源代码:

    //  CCP1 PWM做为DAC输出例子,输出SPWM 波形,
    //  即 sin PWM
    //  请注意本例子中两全局变量的单位是指令周期
    
    #include "pic.h"
    
      __CONFIG (HS & LVPDIS & WDTDIS);
      unsigned char g_Period=255;    //PWM周期,单位为指令周期,最大值为255
      unsigned char g_DutyWidth=50; //PWM高电平宽度初值,单位为指令周期,最大值为255
    
    #define  B1 RB0   // 按键B1状态由RB0端口输入
    #define	XTAL_FREQ	4	// 外接晶振主频,单位为MHz
    
    const unsigned char st[] = 
    {
     0x0, 0x2, 0x4, 0x6, 0x8, 0xb, 0xd, 0xf,         //8
     0x11, 0x13, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, //16
     0x23, 0x25, 0x27, 0x29, 0x2b, 0x2d, 0x2f, 0x31, 
     0x33, 0x35, 0x37, 0x39, 0x3b, 0x3d, 0x3f, 0x41,     //32
     0x43, 0x45, 0x47, 0x48, 0x4a, 0x4c, 0x4e, 0x4f, 
     0x51, 0x53, 0x54, 0x56, 0x58, 0x59, 0x5b, 0x5c, 
     0x5e, 0x5f, 0x61, 0x62, 0x64, 0x65, 0x66, 0x68, 
     0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6f, 0x70, 0x71,    //64
     0x72, 0x73, 0x74, 0x74, 0x75, 0x76, 0x77, 0x78, 
     0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 
     0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,    //88
     0x7e, 0x7e //7e(126)
    };
    
    void DelayMS(unsigned int ms) //定义延时函数
    {
      unsigned int j=0;
      for(ms;ms>0;ms--)
       for(j=27*XTAL_FREQ;j>0;j--) // 1MHz时约是27,其它主频请酌情修改
       {
       }
    }  
    
    
    void InitPWM(unsigned char dw)
    {
      TRISC2=0; // RC2做为PWM输出引脚
        
      T2CKPS1=0;  //TMR2预分频比为1:1
      T2CKPS1=0;
      TMR2ON=1;   // 使能TMR2模块
    
      // 设置PWM的工作周期
      PR2=g_Period-1; 
      
      // 设置占空比,本例子忽略高电平最低两位
      CCPR1L=dw;  //获得高电平宽度高8位  
      CCP1X=(g_DutyWidth>>1) & 0x01; // 获得高电平宽度的次低位
      CCP1Y=g_DutyWidth & 0x01;      // 获得高电平宽度最低位
      CCP1M3=1; //1100:PWM输出模式
      CCP1M2=1;
      CCP1M1=0;
      CCP1M0=0;
      // 以上四条语句建议写为:
      // CCP1CON=(CCP1CON & 0xF0) | 0b00001100; 
    }
    
    void main()
    { unsigned char i;
      TRISB0=1; // RB0输入
      InitPWM(50); // 初始化CCP1的PWM方式
      DelayMS(1);//为何延时1mS
      while(1)
      {
        for(i=0;i<90;i++)
        {
          CCPR1L=128+st[i];//128+126=255;
           DelayMS(1);
        }
        for(i=89;i>0;i--)
        {
          CCPR1L=128+st[i];
          DelayMS(1);
        }
        for(i=0;i<90;i++)
        {
          CCPR1L=128-st[i];
           DelayMS(1);
        }
        for(i=89;i>0;i--)
        {
          CCPR1L=128-st[i];
          DelayMS(1);
        }
        //*/
        if(B1==0)  // 若按键B1有变化
        {
          DelayMS(30); // 消除机械按键前沿抖动
          if(B1==0)  // 再判断为0说明是一次正常按键
          {
             g_DutyWidth+=50;    //增加占空比
             CCPR1L=g_DutyWidth; //赋值给高电平宽度寄存器
             if(g_DutyWidth>=g_Period)  //超出了PWM周期
             {
               g_DutyWidth=0; // 则高电平宽度清零,等待下次按键后增值
             }
             while(B1==0); // 等待用户抬起B1
             DelayMS(30); // 消除机械按键后沿抖动
          }
         
        }
      }
    }
    



    同是电子工程师,请一定不要吝啬你的赞!

    1人已赞

    编辑 举报

    LV.1

    4095982

    1487915

    13

    577061

    说说你的看法

  • LV.

    @

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    取消
    发送
  • 现在还没有回复呢,说说你的想法

    现在还没有回复呢,说说你的想法

    全部回复(22)

  • pppyyy02

    LV.1

    2014-04-30 11:14

    @

    很不错!
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4096007

    1487915

    13

    508330

    取消
    发送
    2
  • 345295362

    LV.1

    2014-04-30 23:34

    @pppyyy02

    很不错!
      TRISC2=0; // RC2做为PWM输出引脚
        
      T2CKPS1=0;  //TMR2预分频比为1:1
      T2CKPS1=0;
      TMR2ON=1;   // 使能TMR2模块
    为何TMR1定时器的预分频要设置2步,一句T2CKPS1=0;不久OK了吗
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4096062

    1487915

    13

    478476

    取消
    发送
    3
  • 345295362

    LV.1

    2014-04-30 23:52

    @345295362

      TRISC2=0; // RC2做为PWM输出引脚
        
      T2CKPS1=0;  //TMR2预分频比为1:1
      T2CKPS1=0;
      TMR2ON=1;   // 使能TMR2模块
    为何TMR1定时器的预分频要设置2步,一句T2CKPS1=0;不久OK了吗
    还有就是你的正弦波实际只是一个直流电压,并非正负交替输出的正弦波,模拟示波器没有时基显示,这只是一个假象,在实际逆变桥上,不仅最少要用到2路SPWM输出,还设计死区时间,正如你所说的,这只是一个DA转换,输出一个参考正弦波,通过添加一个2.5V基准源而得到正半周和负半周的正弦信号,实际应用显然没多少用处。
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4096063

    1487915

    13

    478476

    取消
    发送
    4
  • 余健

    LV.1

    2014-05-08 10:41

    @345295362

    还有就是你的正弦波实际只是一个直流电压,并非正负交替输出的正弦波,模拟示波器没有时基显示,这只是一个假象,在实际逆变桥上,不仅最少要用到2路SPWM输出,还设计死区时间,正如你所说的,这只是一个DA转换,输出一个参考正弦波,通过添加一个2.5V基准源而得到正半周和负半周的正弦信号,实际应用显然没多少用处。
    一切只是为了学习哈
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4096725

    1487915

    13

    577061

    取消
    发送
    5
  • zhhufe

    LV.1

    2014-05-18 20:38

    @

    学习学习  谢谢分享  请发一份  zhhufe@yeah.net

    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4097423

    1487915

    13

    395671

    取消
    发送
    6
  • 75482758

    LV.1

    2014-08-28 10:58

    @

    来一份学习下,感谢,75482758@qq.com
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4102127

    1487915

    13

    535297

    取消
    发送
    7
  • xzszrs

    LV.1

    2014-08-28 22:10

    @

    不错!加精。
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4102165

    1487915

    13

    70075

    取消
    发送
    8
  • 无奈的啊

    LV.1

    2014-08-29 23:44

    @

    求编译好的hex文件和仿真文件,多谢楼主!

    14399956@胖企鹅点抗

    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4102241

    1487915

    13

    614206

    取消
    发送
    9
  • release

    LV.1

    2014-09-05 08:53

    @

    顶一个,顺便做标记,有空的时候学习。
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4102485

    1487915

    13

    3059

    取消
    发送
    10
  • 电力新员工

    LV.1

    2014-09-10 22:27

    @

    楼主你好,学习学习 821688218@qq.com 求个资料,万分感谢!
    0

    设为最佳答案

    置顶

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    4102615

    1487915

    13

    621091

    取消
    发送
    11
  • 现在还没有回复呢,说说你的想法

    1 2 3  
  • 回复

  • 收藏

  • 点赞

  • 举报有害信息

  • 已超出发布时间24小时,无法编辑与删除
    关于我们 联系方法 广告服务 会议服务 电子星球APP 网站地图 不良信息举报 热线:400-003-2006
    © 2002-2021 Netbroad(网博互动)公司版权所有 津ICP备 11006234号-2 联网备案号:12010402000747 增值电信业务经营许可证:津B2-20120058