單片機(jī)用的是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; //清定時(shí)器2中斷標(biāo)志
TMR2IE=1; //定時(shí)器2中斷使能位
PEIE=1; //外設(shè)中斷使能
GIE=0; //全局中斷禁止
T2CON=0x18; //預(yù)分頻比為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() //增強(qiáng)型PWM初始化設(shè)置
{CCP2CON=0x8c; //設(shè)置增強(qiáng)型PWM工作于半橋模式;PWM設(shè)置為高電平有效
CCPTMRS0=0xF3; //設(shè)置PWM模式下CCP2以Timer2作為定時(shí)器
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;
}
}
用以上程序進(jìn)行單片機(jī)調(diào)試發(fā)現(xiàn)輸出波形在過(guò)零點(diǎn)有問(wèn)題
過(guò)零點(diǎn)的驅(qū)動(dòng)波形如下
用的是后分頻為2的中斷響應(yīng),不知道為什么工頻變換比高頻變換早不到一個(gè)周期,希望在此能得到師傅們的指點(diǎn),不勝感激