搜索
bottom↓
回复: 3

PIC16F716 spwm程序的疑问

[复制链接]

出0入0汤圆

发表于 2011-4-19 10:07:03 | 显示全部楼层 |阅读模式
由于还处于开发阶段,PI调制和波形换向还没有写上。(正弦波逆变器用)

仿真了下,不能从中断返回,由于是初学,查了好久也没有查出问题,高手们帮我看看。

把PIE1或者GIE 中的任意一个置0,CCP1就有PWM波形输出,所以怀疑是中断部分有问题。程序如下:


#define uchar unsigned char
#include <pic.h>
//uchar time_num;//7,8脚50Hz交越型号计数器
uchar sin_num;
//------------------------------------------------------------  
//使用PIC16F716芯片
//7,8脚输出50HZ交越信号,9、11脚输出spwm互补波形
//1/20khz=50us 1/50/400=50us
//
//------------------------------------------------------------  
__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)
                {
                        sin_num=0;
                }
        //}
//CCPR1L=SPWMTABLE[sin_num];
//sin_num++;
}

   
//------------pwm初始化函数-------------------
void pwmInit()
{
PR2=199;
CCP1CON=0x8c;// 1000 1100pwm双输出,占空比高2位清零,
//PWM 模式。P1A, P1C 高电平有效; P1B, P1D 高电平有效;
CCPR1L=0;//占空比清零
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(7,8脚定时器初始化)
        //TMR0=6;//2MS 初值
}
void main(void)  
{
init() ;
pwmInit();
sin_num=0;
PEIE=1; //(TMR2中断为外设中断)所有未被屏蔽的外设中断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){;}
}

出0入0汤圆

发表于 2011-9-5 16:46:35 | 显示全部楼层
你的程序 调试出来没?不知数组表 是如何产生的,请教一下!

出0入0汤圆

发表于 2014-11-26 13:58:13 | 显示全部楼层
这个可用?

出0入0汤圆

发表于 2014-11-26 13:58:29 | 显示全部楼层
这个可用?压顶 奇才厅
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 10:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表