打印

PIC16F716 SPWM程序的疑问

[复制链接]
4898|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lybpotter|  楼主 | 2011-4-19 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于还处于开发阶段,PI调制和波形换向还没有写上(逆变器用)。
仿真了下,不能从中断返回,由于是初学,查了好久也没有查出问题,高手们帮我看看。
我把PIE1或者GIE任何一个置零,PWM就有波形...所以判断为要么没进中断,要么就是死在中断地方了。
程序如下:
#define uchar unsigned char
#include
//uchar time_num;
uchar sin_num;
//------------------------------------------------------------  
//使用PIC16F716芯片
//7,8脚输出50HZ交越信号,9、11脚输出spwm互补波形
//1/20khz=50us 1/50/400=50us
// 由于调9,11脚的SPWM波形,7,8脚的交越信号被我注释掉了,可能看起来有点不便
//------------------------------------------------------------  
__CONFIG(HS&WDTDIS);
//----------------------------------------------------------
const unsigned char SPWMTABLE[200]={
0 ,  4 ,  4 ,  8 ,  8 ,  8 ,  12 ,  12 ,  16 ,  16 ,
20,  20,  20,  96,  96,  28 ,  28 ,  28 ,  32 ,  32 ,
36 ,  36 ,  40 ,  40 ,  40 ,  44 ,  44 ,  48 ,  48 ,  48 ,
52 ,  52 ,  52 ,  56 ,  56 ,  60 ,  60 ,  60 ,  64 ,  64 ,
64 ,  68 ,  68 ,  68 ,  72 ,  72 ,  72 ,  76 ,  76 ,  76 ,
80 ,  80 ,  80 ,  80 ,  84 ,  84 ,  84 ,  88 ,  88 ,  88 ,
88 ,  92 ,  92 ,  92 ,  92 ,  96 ,  96 ,  96 ,  96 ,  96 ,
100,  100,  100,  100,  100,  100,  104,  104,  104,  104,
104,  104,  104,  108,  108,  108,  108,  108,  108,  108,
108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
108,  108,  108,  108,  108,  108,  108,  104,  104,  104,
104,  104,  104,  104,  100,  100,  100,  100,  100,  100,
96,  96,  96,  96,  96,  92,  92,  92,  92,  88,
88,  88,  88,  72,  72,  72,  80,  80,  80,  80,
76 ,  76,  76 ,  72 ,  72 ,  72 ,  68 ,  68 ,  68 ,  64 ,
64 ,  64,  60 ,  60 ,  60 ,  56 ,  56 ,  52 ,  52 ,  52 ,
48 ,  48 ,  48 ,  44 ,  44 ,  40 ,  40 ,  40 ,  36 ,  36 ,
32 ,  32 ,  28,  28 ,  28 ,  24 ,  24 ,  20 ,  20 ,  20 ,
16 ,  16 ,  12 ,  12 ,  8 ,  8 ,  8 ,  4 ,  4 ,  0  
};//CCPR1L查表值,一个周期为RP2+1=199+1=200
//200 为50us  所以计算值*4即可
//脉冲周期是正弦波的周期除以脉冲个数 1/50/400=50uS
//------------------------------------------------------

//-------------中断服务程序------------------------------------  
void interrupt timer2()  
{  
if(TMR2IE==1&&TMR2IF==1)
{
TMR2IF=0;
    CCPR1L=SPWMTABLE[sin_num];
    sin_num++;}
  if(sin_num==199)//查表200次
  {
   sin_num=0;
  }
}

   
//------------pwm初始化函数-------------------
void pwmInit()
{
PR2=199;
CCP1CON=0x8c;// 1000 1100pwm双输出,占空比高2位清零,
//PWM 模式。P1A, P1C 高电平有效; P1B, P1D 高电平有效;
CCPR1L=50;//占空比清零
TMR2IF=0; //Timer2 中断标志位清零
T2CON=0x24; //0010 0100预分频1,后分频5,使能timer2
TMR2IE=1; //允许TMR2 和 PR2 匹配中断
}
//-----------------------------------------------
void init()
{TRISB=0;//D端口为输出
PORTB=0X00;
//OPTION=0x04;//0000 0100 预分频配置到timer0定时器,预分频为1:32
//TMR0=6;//2MS 初值
}

//------------主函数------------------------

void main(void)  
{
init() ;
pwmInit();
sin_num=0;
PEIE=1; //(TM2中断为外设中断)所有未被屏蔽的外设中断1开放0关闭
GIE=1; //使能所有未被屏蔽的中断1使能0关闭
/*while(1)//7,8脚50Hz波形被我调试时候注释掉了
    {
   
   CCPR1L=SPWMTABLE[sin_num];
   if(sin_num==199)
   {sin_num=0;}
   if(T0IF==1)
      {TMR0=6;
   T0IF=0;
   time_num++;
   }//2ms
   if(time_num==5)
      {time_num=0;
    RB1=!RB1;
    RB2=!RB2;}
  }*/

while(1){;}
}


请高手帮我看看,谢谢~
沙发
251566208| | 2011-4-19 13:54 | 只看该作者
有看过数据手册吗?

使用特权

评论回复
板凳
251566208| | 2011-4-19 13:59 | 只看该作者
正常PWM是要满足一个周期才会更新的

使用特权

评论回复
地板
lybpotter|  楼主 | 2011-4-19 14:12 | 只看该作者
能具体点吗? 3# 251566208

使用特权

评论回复
5
251566208| | 2011-4-19 14:43 | 只看该作者
每次T2中断一到就进中断更新,可能反应不过来
中断对PWM没有作用,可以关掉

使用特权

评论回复
6
lybpotter|  楼主 | 2011-4-19 14:57 | 只看该作者
恩  我试试看 5# 251566208

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝