求教,PIC30F2010的PWM输出问题

2020-02-09 09:27发布

各位高手,急请指教!我利用PIC30F2010写的PWM程序总是不正常.数组中等的数据是逐渐增大的.利用这个数组的数据做为占空比,利用PWM中断输出的脉冲波形
的宽度也应该是逐渐增大的,可事实就不是,前两个脉冲总是很宽,为什么?急请指教!下面是我的全部程序.拜托了.

#include "p30f2010.h"
//配置位
_FOSC(CSW_FSCM_OFF&XT_PLL4);                                        //4倍频锁相环,晶振频率7.3728M
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF&MCLR_EN);
_FGS(CODE_PROT_OFF);
unsigned char countP;       
//unsigned int countP;                                                        //16位二进制值,用于对PWM脉冲数目进行计数
unsigned int FT;                                                                //逻辑变量,用于高、低脉宽的互换
/*
#define TRUE  (1)
#define FALSE (0)
typedef int BOOL;
BOOL bool_flag = TRUE;
*/
                                                                                               
unsigned int SinTable[11]={0x30,0x4B,0x82,0XC8,0x118,0x15E,0x1D6,0x226,0X262,0x2BC};//定义一个正弦表格,表格中是占空比的值
                                        //    (60,  96,  104,  190, 230,  2bc,  3ac,  44c,   4c4, 578)

void PWMinitial()                                                                //PWM初始化
{
        PWMCON1=0x0777;                                                                //独立输出模式,PWMXH使能为PWM输出,PWMXL使能为PWM输出
        PWMCON2=0x0002;                             //强制输出同步
        PTPER=0x2E1;                        //频率为10K赫兹
        PTCON=0;                                //先关闭PWM时基,IDLE时工作,后分频为1:1,输入PWM时钟周期为1Tcy,工作在自由运行模式
        PDC1=SinTable[0];
        PDC2=SinTable[0];
        PDC3=SinTable[0];
//        DTCON1=0x000F;                        //死区时钟周期为1Tcy,死区时间值为15个Tcy,死区时间为2个u秒
//        IPC9bits.PWMIP=3;                        //设定PWM的中断优先级为3级
        IEC2bits.PWMIE=1;                        //允许PWM中断
        OVDCON=0x2A00;                        //PWM1H,PWM2H,PWM3H为PWM输出,PWM1L,PWM2L,PWM3L输出无效
        PTCONbits.PTEN=1;                        //打开PWM时基,开始工作
        IFS2bits.PWMIF=0;                        //清PWM中断标志
        return;
}

int main()
{
       
        countP=0;                                //从表格的第1个数据开始
        FT=0;
        INTCON1=0x0000;
        INTCON2=0x0000;                        //关闭所有中断
//        SRbits.IPL=2;                        //设定CPU的优先级为2级
        PWMinitial();
        while(1)
        {

        }
}

//PWM中断函数
void __attribute__((__interrupt__))_PWMInterrupt(void)
{

        PDC1=(SinTable[countP]<<1);                                //LS位不是有效位,因此左移一位让开
    PDC2=(SinTable[countP]<<1);
    PDC3=(SinTable[countP]<<1);
       
    countP++;
        if(countP>=10&&FT==0)                //半个周期结束,原来是PWM1H为PWM输出,现在要换成PWM1L为PWM输出
        {
                countP=0;
                FT=1;
                                               
                OVDCON=0x1500;                //PWM1L,PWM2L,PWM3L为PWM输出,PWM1H,PWM2H,PWM3H输出无效
        }               

        if(countP>=10&&FT==1)
        {
                countP=0;
                FT=0;
                                                                               
                OVDCON=0x2A00;                //PWM1H,PWM2H,PWM3H为PWM输出,PWM1L,PWM2L,PWM3L输出无效
        }                                //表格索引                       
        IFS2bits.PWMIF=0;                        //清PWM中断标志
}
0条回答

一周热门 更多>