单片机用的是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; //外设中断使能
GIE=0; //全局中断禁止
T2CON=0x18; //预分频比为0,后分频比为2
PR2=0xF9; //周期寄存器设置 249
TMR2=0x00;GIE=1;}
Init_IO()
{P2BSEL=1; //确定P2B位于RC0
CCP2SEL=1; //确定P2A位于RC1
ANSELB=0X03;
TRISB=0x03;}
Init_CCP1() //增强型PWM初始化设置
{CCP2CON=0x8c; //设置增强型PWM工作于半桥模式;PWM设置为高电平有效
CCPTMRS0=0xF3; //设置PWM模式下CCP2以Timer2作为定时器
PWM2CON=0X05; //死区设置为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;
}
}
用以上程序进行单片机调试发现输出波形在过零点有问题
过零点的驱动波形如下
用的是后分频为2的中断响应,不知道为什么工频变换比高频变换早不到一个周期,希望在此能得到师傅们的指点,不胜感激