关于PIC18Fxx31系列的功率控制PWM模块和CCP模块的使用问题

2020-02-06 10:12发布

最近要使用PIC18F2331做一个逆变器,把蓄电池的110伏电转化为220伏,50Hz的交流电,功率为2000W。一共有两个模块可以用:功率PWM和CCP。功率PWM带有故障输入和死去插入功能,可是我觉得使用很受限制。

    逆变器使用SPWM的全桥控制,开关管是IGBT,不知大家有何建议。我网上找了很多也没有关于这方面的资料,郁闷中!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
cqgxh
2020-02-07 00:54
#include <pic.h>
const unsigned int Sin[100] = {100,100,101,103,105,107,109,112,116,120,124,128,133,139,144,150,157,163,170,178,185,193,202,210,219,229,238,248,258,268,279,289,300,312,323,334,346,358,370,382,394,407,419,432,445,457,470,483,496,509,521,534,547,560,572,585,598,610,623,635,647,659,671,683,694,705,717,728,738,749,759,769,779,788,798,807,815,824,832,839,847,854,860,867,873,878,884,889,893,897,901,905,908,910,912,914,916,917,917,917};

static unsigned int step;
unsigned long int longbuf;
unsigned int tempint;
unsigned char tempchar, datamul;
bit Fbit;

unsigned char adcnt;

void main (void)
{
//-------------------------------------var initlize.
        step = 49;
        Fbit = 1;
        datamul = 255;                                                //must be low 63.
//-------------------------------------initlize.
        PORTB = 0xFF;
        TRISB = 0x00;       

        TRISA0 = 1;
        TRISC2 = 0;   // 883的RC2

        TMR2 = 0;
        T2CON = 0x08;       
        PR2 = 251;                //100;   //频率修改    251-----51.10HZ   
        TMR2IF = 0;
        TMR2IE = 1;
       
        CCP1CON = 0x8F;
        PWM1CON = 0x8f;      //死区控制   84  ---0.8US      85   ----1US
        ECCPAS = 0x05;
        TMR2ON = 1;

        ADCON0 = 0xC1;
        ADCON1 = 0x04;
        ADIF = 0;
        ADIE = 0;

        PEIE = 1;
        GIE = 1;
       
//-------------------------------------main code.
        while(1)
        {
                NOP();

                if(adcnt > 32)
                {
                        adcnt = 0;
                        ADIF = 0;
                        GODONE = 1;
                        NOP();
                        NOP();
                        NOP();
//                        if(ADIF == 1)                       //  AD控制
//                                datamul = ADRES;               //  AD控制
                }

                adcnt ++;
        }
}

void interrupt ISR (void)
{
        if (TMR2IE && TMR2IF)
        {
                TMR2IF = 0;
//                 = 1;
                if (Fbit)
                {
                        step ++;
                        if(step == 100)
                        {
                                Fbit = 0;
                                //step --;
                        }
                }
                else
                {
                        step --;
                        if (step == 1)
                        {
                                Fbit = 1;
                        //        step ++;
                        }
                }

                longbuf = Sin[step -1];

                if (step > 50)
                {
                        longbuf = (longbuf - 509) * datamul;
                        tempint = longbuf >> 8;
                        tempint += 509;
                }       
                else
                {
                        longbuf = (509 -longbuf) * datamul;
                        tempint = longbuf >> 8;
                        tempint = 509 - tempint;
                }

                //longbuf =longbuf * datamul;
                //tempint = longbuf >> 8;                        //datamul <= 255;

                CCPR1L = tempint >> 2;
                tempchar = tempint;
                tempchar <<= 4;
                CCP1CON = (CCP1CON & 0xCF) | (tempchar & 0x30);

                RB4 = 0;
        }
}

一周热门 更多>