logo资料库

逆变器控制程序源代码.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
逆变器控制程序源代码
逆变器控制程序源代码 #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();} } }
分享到:
收藏