逆变器控制程序源代码
#include
#include
// 逆变器系统配置
__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTDIS);
//关闭看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护
//变量定义
//------------------------------------------------------------
//指示灯宏定义
#define L1_RED_ON
RB1=1;RB2=0;//L1 红灯亮
#define L1_RED_OFF
RB1=0;RB2=0;
#define L2_RED_ON
RB4=1;RB3=0;//L2 红灯亮
#define L2_RED_OFF
RB4=0;RB3=0;
#define L3_RED_ON
RB7=1;RB5=0;//L3 红灯亮
#define L3_RED_OFF
RB7=0;RB5=0;
#define L1_GREE_ON
RB2=1;RB1=0;//L1 绿灯亮
#define L1_GREE_OFF RB2=0;RB1=0;
#define L2_GREE_ON
RB3=1;RB4=0;//L2 绿灯亮
#define L2_GREE_OFF RB3=0;RB4=0;
#define L3_GREE_ON
RB5=1;RB7=0;//L3 绿灯亮
#define L3_GREE_OFF RB5=0;RB7=0;
//-----------------------------------------------------------
//模拟输入通道宏定义
#define AN0 CHS0=CHS1=HS2=0;
#define AN1 CHS=0;CHS1=CHS2=1;
#define AN2 CHS0=CHS2=1;CHS1=1;
//-----------------------------------------------------------
bit ccp1,k,ccp2;
unsigned char mode;
//-----------------------------------------------------------
//软件延时子程序*/
void
{
DELAY()
unsigned int i;
for(i=10000;i>0;i--);
}
//-----------------------------------------------------------
void adc_init()
{
//ad 时钟选择
ADCS1=1;//FOSC/32
ADCS0=0;
//
PCFG0=0;
PCFG1=0;
PCFG2=0;//RA0=AN0,RA1=AN1,RA2=AN2,VREF=VDD-VSS
ADON=1;//打开 ad 模块
ADIF=0;//清除 ad 中断标志
ADIE=1;//打开 ad 模块中断
PEIE=1;//打开外围模块中断
GIE=1;//打开总中断
}
//-----------------------------------------------------------
void port_init()//端口初始化
{
//端口 b 设置
TRISB0=0;TRISB1=0;TRISB2=0;TRISB3=0;TRISB4=0;TRISB5=0;
TRISB6=1;//输入
TRISB7=0;//RB 端口方向设置
PORTB=0;//输出 0
RBPU=0;//使能内部弱上拉
INTE=0;//禁止 RB0 中断
RBIF=0;
RBIE=1;//允许 RB 端口电平变化中断
//端口 c 设置
TRISC=0X00;//PORTC are outputs
PORTC=0;//输出为 0
RC1=RC2=1;
//timer0 init
T0CS=0;//选择内部指令时钟
T0IF=0;
//T0IE=1;//在第一次 ccp1 比较后打开中断使能
//timer1
TMR1CS=0;//定时器模式
}
//----------------------------------------------------------
void init_start()//开始
{
L1_RED_ON;
L2_RED_ON;
L3_RED_ON;
DELAY();DELAY();DELAY();
L1_GREE_ON;
L2_GREE_ON;
L3_GREE_ON;
DELAY();DELAY();DELAY();
L1_GREE_OFF;
L2_GREE_OFF;
L3_GREE_OFF;
L1_GREE_ON;
}
//----------------
void CCP2_pwm()//ccp2 pwm 初始化,CCP1 比较初始化
{
TMR2ON=0;
//复位 ccp
//CCP2M3=0;CCP2M2=0;CCP2M1=0;CCP2M0=0;
CCP1M3=0;CCP1M2=0;CCP1M1=0;CCP1M0=0;
GIE=0;PEIE=0;//禁止总中断和外围中断
CCP1IF=0;
CCP1M3=1;CCP1M2=0;CCP1M1=0;CCP1M0=1;//比较模式
CCPR1H=0x17;
CCPR1L=0xe8;//每隔 6 个指令周期发生比较操作
TMR1L=TMR1H=0;
//--------
CCP2IF=0;
CCPR2L=0X6;//设置 80%的脉宽输出
CCP2X=CCP2Y=0;
CCP2M3=CCP2M2=1;//PWM 模式
PR2=0Xff;//设置 PWM 的工作周期,20mhz,PWM 周期=(PR2+1)*4*TOSC*TIMER2 预分频比=19.531khz
T2CKPS1=T2CKPS0=0;//timer2 预分频器 1
TOUTPS3=TOUTPS2=TOUTPS1=TOUTPS0=0;//后分频器 1
//-------------------
CCP1IE=1;
TMR2ON=1;
GIE=1;
}
//---------------
void CCP1_pwm()//ccp1 pwm 初始化,CCP2 比较初始化
{
TMR2ON=0;
//复位 ccp
CCP2M3=0;CCP2M2=0;CCP2M1=0;CCP2M0=0;
//CCP1M3=0;CCP1M2=0;CCP1M1=0;CCP1M0=0;
GIE=0;PEIE=0;//禁止总中断和外围中断
//-------------------设置 CCP2 比较模式
CCP2IF=0;
CCP2M3=1;CCP2M2=0;CCP2M1=0;CCP2M0=1;//比较模式
CCPR2H=0x17;
CCPR2L=0xe8;//每隔 6 个指令周期发生比较操作
TMR1L=TMR1H=0;
//-------
CCP1IF=0;
CCPR1L=0X6;//设置 80%的脉宽输出
CCP1X=CCP1Y=0;
CCP1M3=CCP1M2=1;//PWM 模式
PR2=0Xff;//设置 PWM 的工作周期,20mhz,PWM 周期=(PR2+1)*4*TOSC*TIMER2 预分频比=19.531khz
T2CKPS1=T2CKPS0=0;//timer2 预分频器 1
TOUTPS3=TOUTPS2=TOUTPS1=TOUTPS0=0;//后分频器 1
//-------------------
CCP2IE=1;
TMR2ON=1;
GIE=1;
}
//------------------
void interrupt key_ccp_timer()
{
if(RBIF){RBIF=0;if(!RB6)k=1;}
if(CCP1IF){RC2=1;TMR1L=TMR1H=0;CCP1IF=0;mode++;if(mode==32){mode=0;ccp1=1;L1_GREE_ON;}}
if(CCP2IF){RC1=1;TMR1L=TMR1H=0;CCP2IF=0;mode++;if(mode==32){mode=0;ccp2=1;L1_RED_ON;}}
if(T0IF){T0IF=0;}
if(ADIF){ADIF=0;}
}
//------------------------------------------------------------------------
void main(void)
{
port_init();
init_start();
adc_init();
while(1)
{
if(k){DELAY();if(k&RB6)k=0;ccp2=1;}
if(ccp2){ccp1=0;CCP2_pwm();}
if(ccp1){ccp2=0;CCP1_pwm();}
}
}