• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖
  • 论坛首页
  • 逆变/光伏/并网
  • 基于PIC16F877单片机通过SPWM脉宽调制技术软件产生纯正炫波,内容包含MPLAB源文件和protues仿真文件

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

基于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); // 消除机械按键后沿抖动
      }
     
    }
  }
}



全部回复(22)
正序查看
倒序查看
pppyyy02
LV.4
2
2014-04-30 11:14
很不错!
0
回复
345295362
LV.6
3
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
回复
345295362
LV.6
4
2014-04-30 23:52
@345295362
TRISC2=0;//RC2做为PWM输出引脚T2CKPS1=0;//TMR2预分频比为1:1T2CKPS1=0;TMR2ON=1;//使能TMR2模块为何TMR1定时器的预分频要设置2步,一句T2CKPS1=0;不久OK了吗
还有就是你的正弦波实际只是一个直流电压,并非正负交替输出的正弦波,模拟示波器没有时基显示,这只是一个假象,在实际逆变桥上,不仅最少要用到2路SPWM输出,还设计死区时间,正如你所说的,这只是一个DA转换,输出一个参考正弦波,通过添加一个2.5V基准源而得到正半周和负半周的正弦信号,实际应用显然没多少用处。
0
回复
余健
LV.3
5
2014-05-08 10:41
@345295362
还有就是你的正弦波实际只是一个直流电压,并非正负交替输出的正弦波,模拟示波器没有时基显示,这只是一个假象,在实际逆变桥上,不仅最少要用到2路SPWM输出,还设计死区时间,正如你所说的,这只是一个DA转换,输出一个参考正弦波,通过添加一个2.5V基准源而得到正半周和负半周的正弦信号,实际应用显然没多少用处。
一切只是为了学习哈
0
回复
zhhufe
LV.5
6
2014-05-18 20:38

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

0
回复
75482758
LV.6
7
2014-08-28 10:58
来一份学习下,感谢,75482758@qq.com
0
回复
2014-08-28 22:10
不错!加精。
0
回复
2014-08-29 23:44

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

14399956@胖企鹅点抗

0
回复
release
LV.6
10
2014-09-05 08:53
顶一个,顺便做标记,有空的时候学习。
0
回复
2014-09-10 22:27
楼主你好,学习学习 821688218@qq.com 求个资料,万分感谢!
0
回复
刘1234
LV.4
12
2014-09-12 11:10
@电力新员工
楼主你好,学习学习821688218@qq.com求个资料,万分感谢!

顶一好,

0
回复
余健
LV.3
13
2014-09-13 17:46
@电力新员工
楼主你好,学习学习821688218@qq.com求个资料,万分感谢!
以发送,多多交流
0
回复
ssff
LV.5
14
2014-09-20 09:57
@余健
以发送,多多交流
这才是好帖,谢谢。
0
回复
莫妙文
LV.1
15
2014-09-20 12:49
好贴学习了
0
回复
wj_12691495
LV.8
16
2014-09-20 14:41
@莫妙文
好贴学习了
这个要好好看看。
0
回复
2014-09-21 10:25
楼主什么时候开个手把手教PIC的帖子啊
0
回复
qiankm
LV.5
18
2014-10-05 09:45
,顶上。源代码公开的必须顶
0
回复
2014-10-16 21:23
求编译好的hex文件和仿真文件,邮箱zhang1388888@126.com,多谢楼主!
0
回复
lksy
LV.3
20
2014-11-03 08:46
求编译好的hex文件和仿真文件,多谢楼主! 13261033626@163.com
0
回复
2014-11-08 23:56
我想要整个工程文件研究学习一下可以吗? zhongqingdianzi@163.com
0
回复
kldmz
LV.3
22
2014-11-10 08:58

好,顶一个

0
回复
囚牛
LV.1
23
2014-12-09 18:16
1243143848@qq.coml楼猪,虾虾尼。
0
回复