單片機用的是PIC16F1936,外接20M晶振。程序如下:
#include
__CONFIG (FOSC_HS&WDTE_OFF&PWRTE_OFF&MCLRE_ON&CP_OFF&BOREN_ON&CLKOUTEN_OFF&WRT_OFF& PLLEN_OFF&LVP_OFF&BORV_25);
#define uchar unsigned char
#define uint unsigned int
const uchar sin_table[100]={16 , 31 ,47 ,62 ,77 ,92 ,106 ,120 ,134 ,147,159 ,171 ,182 ,193 ,202 ,211 ,219 ,226 ,232 ,238,242 ,246 ,248 ,250 ,250 ,250 ,248 ,246 ,242 ,238,232 ,226 ,219 ,211 ,202 ,193 ,182 ,171 ,159 ,147,134 ,120 ,106 ,92 ,77 ,62 ,47 ,31 ,16 ,0,16 , 31 ,47 ,62 ,77 ,92 ,106 ,120 ,134 ,147,159 ,171 ,182 ,193 ,202 ,211 ,219 ,226 ,232 ,238,242 ,246 ,248 ,250 ,250 ,250 ,248 ,246 ,242 ,238,232 ,226 ,219 ,211 ,202 ,193 ,182 ,171 ,159 ,147,134 ,120 ,106 ,92 ,77 ,62 ,47 ,31 ,16 ,0};
uchar num_INT;
Init_IO();
Init_Timer2_clk();
Init_CCP1();/
*The main function of Sine wave inverter*/
void main()
{num_INT=0;
Init_IO();
Init_Timer2_clk();
Init_CCP1();
TMR2ON=1;
TRISB=0xC3;
while(1);}
Init_Timer2_clk()
{TMR2IF=0; //清定時器2中斷標志
TMR2IE=1; //定時器2中斷使能位
PEIE=1; //外設(shè)中斷使能
GIE=0; //全局中斷禁止
T2CON=0x18; //預分頻比為0,后分頻比為2
PR2=0xF9; //周期寄存器設(shè)置 249
TMR2=0x00;GIE=1;}
Init_IO()
{P2BSEL=1; //確定P2B位于RC0
CCP2SEL=1; //確定P2A位于RC1
ANSELB=0X03;
TRISB=0x03;}
Init_CCP1() //增強型PWM初始化設(shè)置
{CCP2CON=0x8c; //設(shè)置增強型PWM工作于半橋模式;PWM設(shè)置為高電平有效
CCPTMRS0=0xF3; //設(shè)置PWM模式下CCP2以Timer2作為定時器
PWM2CON=0X05; //死區(qū)設(shè)置為1us
STR2D=0;
STR2C=0;
STR2B=1;
STR2A=1;
CCPR2L=0;}
void interrupt TMR2INT()
{
if(TMR2IE&TMR2IF)
{
TMR2IF=0;
num_INT++;
if(num_INT<=50)
CCPR2L=sin_table[num_INT-1];
else
CCPR2L=250-sin_table[num_INT-1];
if(num_INT==51)
{
RB4=0;
NOP();NOP();NOP();NOP();
RB2=1;
}
if(num_INT==1)
{
RB2=0;
NOP();NOP();NOP();NOP();
RB4=1;
}
if(num_INT==100)
num_INT=0;
}
}
用以上程序進行單片機調(diào)試發(fā)現(xiàn)輸出波形在過零點有問題
過零點的驅(qū)動波形如下
用的是后分頻為2的中斷響應(yīng),不知道為什么工頻變換比高頻變換早不到一個周期,希望在此能得到師傅們的指點,不勝感激