?? www.c.c
字號:
//------------------------------------------------------------
// spwm信號調(diào)制
//------------------------------------------------------------
#include <pic16f7x.h>
#include<pic.h>
//系統(tǒng)配置
__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTEN);
//打開看門狗,選擇高速晶振,上電延時復(fù)位,掉電復(fù)位使能,代碼保護(hù)
//------------------------------------------------------------
//指示燈宏定義
#define L1_RED_ON RB1=1;RB2=0;//L1紅燈亮
#define L1_OFF RB1=0;RB2=0;
#define L2_RED_ON RB4=1;RB3=0;//L2紅燈亮
#define L2_OFF RB4=0;RB3=0;
#define L3_RED_ON RB7=1;RB5=0;//L3紅燈亮
#define L3_OFF RB7=0;RB5=0;
#define L1_GREE_ON RB2=1;RB1=0;//L1綠燈亮
#define L2_GREE_ON RB3=1;RB4=0;//L2綠燈亮
#define L3_GREE_ON RB5=1;RB7=0;//L3綠燈亮
//-----------------------------------------------------------
//模擬輸入通道宏定義
#define AN0 CHS2=0;CHS1=0;CHS0=0;
#define AN1 CHS2=0;CHS1=0;CHS0=1;
#define AN2 CHS2=0;CHS1=1;CHS0=0;
//-----------------------------------------------------------
//-----------------------------------------------------------
void adc_init()
{
//ad時鐘選擇
ADCS1=1;//FOSC/32
ADCS0=0;
/*IF CPU IS PIC16F7X7
VCFG1=0;
VCFG0=0;//vref=vdd-vss
*/
PCFG0=0;
PCFG1=0;
PCFG2=0;//VREF=VDD-VSS
ADON=1;//打開ad模塊
ADIF=0;//清除ad中斷標(biāo)志
ADIE=0;//打開ad模塊中斷
}
//-----------------------------------------------------------
void port_init()//端口初始化
{
//端口b設(shè)置
TRISB0=0;TRISB1=0;TRISB2=0;TRISB3=0;TRISB4=0;TRISB5=0;
TRISB6=1;//輸入
TRISB7=0;//RB端口方向設(shè)置
PORTB=0;//輸出0
RBPU=0;//使能內(nèi)部弱上拉
INTE=0;//禁止RB0中斷
RBIF=0;
RBIE=1;//允許RB端口電平變化中斷
//端口c設(shè)置
TRISC=0X00;//PORTC are outputs
PORTC=0;//輸出為0
RC1=RC2=0;
RC3=1;RC4=0;
//timer0 init
T0CS=0;//選擇內(nèi)部指令時鐘
T0IF=0;
//T0IE=1;//在第一次ccp1比較后打開中斷使能
//timer1
TMR1CS=0;//定時器模式
}
//----------------------------------------------------------
//----------------------------------------------------------
//軟件延時子程序*/
void DELAY()
{
unsigned int i;
for(i=2000;i>0;i--);
}
//----------------------------------------------------------
void init_start()//開始
{
L1_RED_ON;L2_RED_ON;L3_RED_ON;
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
L2_OFF;L3_OFF;L1_OFF;
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
L1_GREE_ON;L2_GREE_ON;L3_GREE_ON;
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
L2_OFF;L3_OFF;L1_OFF;
}
//----------------------------------------------------------
bit k,power;//關(guān)機(jī)及按鍵標(biāo)志
bank1 unsigned char tm_sum;//系統(tǒng)實際變量
bank1 unsigned char ad_res_1,ad_res_0,ad_res_2; //ad轉(zhuǎn)換結(jié)果寄存器
bank1 float sin_am,sin_l,sin_d;//浮點數(shù),幅值變量,臨時變量,臨時變量
bit sin_up;//sin函數(shù)正負(fù)半周標(biāo)志
bit tmr_s,tmr_d,crut_ie;//定時標(biāo)志,定時標(biāo)志變化標(biāo)志,電流延時保護(hù)允許
unsigned char crut_tmr;//電流延時時間變量
unsigned char power_s;//電源動作延時變量
bit power_ie;//電源允許動作標(biāo)志
bit power_up;//初次開機(jī)標(biāo)志
unsigned char power_up_s;//初次開機(jī)延時標(biāo)志
bit crut_if;volue_if;
//-----------AD1通道轉(zhuǎn)換--------------------
void ad_0()
{
AN0;//選擇通道0
DELAY();//延時,采樣電容充電
ADGO=1;//開器AD
while(ADGO);//等待ad結(jié)束
ad_res_0=ADRES;//結(jié)果轉(zhuǎn)存到變量AD_RES_0
}
//-----------AD1通道轉(zhuǎn)換--------------------
void ad_1()
{
AN1; DELAY();
ADGO=1;while(ADGO);
ad_res_1=ADRES;
if(ad_res_1>132){sin_am-=0.005;if((ad_res_1-132)>10)sin_am-=0.04; }
else
if((ad_res_1<=132)&&(ad_res_1>=130))sin_am+=0;
else
if(ad_res_1<130) {sin_am+=0.005;if((130-ad_res_1) >10)sin_am+=0.04;}
if(sin_am>1.6)sin_am=1.6;
}
//------------AD2通道轉(zhuǎn)換-------------------
void ad_2()
{
AN2; DELAY();
ADGO=1;while(ADGO);
ad_res_2=ADRES;
}
//-------------------------------------------
const unsigned char sin_[]={40,50,73,85,100,113,127,141,157,170,180,189,196,200,203,
204,//正半周
204,//負(fù)半周
203,200,195,188,179,169,157,144,129,113,96,78,59,39,15};
unsigned char sin_num;//SIN函數(shù)表查表變量
//-------------------------------------------------------------------------------
void CCP_start()
{
CCPR2L=0X0;//設(shè)置CCP2,0%的脈寬輸出
CCPR1L=0X0;//設(shè)置CCP1,0%的脈寬輸出
TRISC=0X00;//PORTC are outputs
PR2=0Xff;//設(shè)置PWM的工作周期,16Mhz,PWM周期15.562khz
CCP1M3=1;CCP1M2=1;//CCP1模塊PWM模式
CCP2M3=1;CCP2M2=1;//CCP2模塊PWM模式
sin_up=1;//正負(fù)半周SIN函數(shù)
sin_num=0;//脈寬周期調(diào)整計數(shù)器
sin_am=0;//sin函數(shù)的幅值
sin_am=0.3000;//sin函數(shù)的幅值
crut_ie=1;//電流慢保護(hù)允許
}
//-------------中斷服務(wù)程序------------------------------------
void interrupt key_ccp_timer()
{
if(TMR2IF&TMR2IE){TMR2IF=0;//定時器2中斷服務(wù)函數(shù)
if(sin_num==31){sin_num=0;sin_up=!sin_up;}
sin_d=sin_[sin_num];
sin_l=sin_am*sin_d;if(sin_l>=255)sin_l=255;//限幅
if(sin_up)
{CCPR2L=(unsigned char)sin_l;CCPR1L=0;}//換向
else
{CCPR1L=(unsigned char)sin_l;CCPR2L=0;}//換向
sin_num++;
}
CLRWDT();//清除看門狗
if(RBIF&&RBIE){RBIF=0;if((!RB6)&&power_ie)k=1;}//端口b中斷服務(wù)函數(shù)
if(TMR1IF&TMR1IE){TMR1IF=0;tm_sum++;if(tm_sum==31){tm_sum=0;tmr_s=!tmr_s;tmr_d=1;}}
//定時器1中斷服務(wù)函數(shù)
}
//************************************************************************************
main()
{
CLRWDT(); //清除看門狗
port_init();//端口初始化
init_start();//開機(jī)狀態(tài)
adc_init();//ad通道初始化
//-----
RC4=0;//繼電器關(guān)閉
RC3=1;//關(guān)閉脈沖封鎖
//-----
TMR1CS=0;//同步模式
T1SYNC=0;//內(nèi)部指令周期
TMR1H=0XFD;
TMR1L=0X10;//定時器1初值
TMR1IE=1;//定時器1中斷使能
//-----
TRISC=0X00;//端口C輸出
TRISC1=TRISC2=1;//RC1,RC2輸入模式
PEIE=1;//外圍模塊中斷使能
TMR2IE=1;//打開定時器2中斷使能
GIE=1;//開全局中斷
TMR2ON=1;//打開定時器2
TOUTPS3=0;TOUTPS2=1;TOUTPS1=0;TOUTPS0=0;//定時器2后分頻器5分頻
TMR1ON=1;//打開定時器1
power_ie=1;//允許開機(jī)
while(1)
{
CLRWDT();//清除看門狗
if(k){
DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();//延時
DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();//延時
if(k&&RB6){k=0;power=!power;}//開關(guān)機(jī)標(biāo)志
if(power)//開機(jī)
{
power_ie=0;//開關(guān)間隔開始計時
RC3=0;//打開脈沖封鎖
RC4=1;//打開繼電器
L3_RED_ON;//打開L3綠燈
CCP_start();//開始SPWM
}
if(!power)//關(guān)機(jī)
{
power_ie=0;//開關(guān)間隔開開始計時
crut_if=0;//電流保護(hù)標(biāo)志清零
volue_if=0;//電池電壓保護(hù)標(biāo)志清零
L1_OFF;//關(guān)燈
L2_OFF;
L3_OFF;
RC3=1;//關(guān)閉脈沖封鎖
CCP2CON=0;CCP1CON=0;//復(fù)位CCP模塊
RC2=RC1=0;//置端口固定電平
L3_OFF;//關(guān)閉L3綠燈
RC4=0;//關(guān)閉繼電器
}
}
//-----輸出電流檢測
if(power_up)
{
if(ad_res_0>=204)//電流高于4v,快保護(hù)
{
crut_if=1;crut_tmr=0;crut_ie=0;
L2_GREE_ON;RC3=1;RC4=0;L3_GREE_ON;
}
if((ad_res_0>=102)&&(ad_res_0<204))//高于2v電流慢保護(hù)
{
L2_GREE_ON;
if(tmr_s&&tmr_d&&crut_ie)//時基,時基變化標(biāo)志,保護(hù)允許
{
tmr_d=0;crut_tmr++;
if(crut_tmr==10)
{
crut_tmr=0;crut_ie=0;crut_if=1;//保護(hù)
L2_GREE_ON;RC3=1;RC4=0;L3_GREE_ON;
}
}
}
if(ad_res_0<102){crut_tmr=0;L2_OFF;if(crut_if)L2_GREE_ON;}//電流正常低于2v
//-----電池電壓檢測
if(ad_res_2>=102){L1_OFF;if(volue_if)L1_GREE_ON;}
//電池電壓大于2v,L1紅燈滅
if((ad_res_2<102)&&(ad_res_2>=91)){L1_GREE_ON;}//電池低于2v大于1.8v
if(ad_res_2<92){volue_if=1;L1_GREE_ON;RC3=1;RC4=0;L3_GREE_ON;} //電池低于1.8v
}
//-----模擬采集
if(power)ad_1();//在開機(jī)狀態(tài)下檢測反饋電壓
ad_2();//采集電池電壓
ad_0();//采集電流
if(power_ie==0)//開關(guān)機(jī)時間間隔
{
if(tmr_s&&tmr_d){tmr_d=0;power_s++;}
if(power_s==10){power_s=0;power_ie=1;}
}
if(power_up==0)//上電延時1秒檢測電池電壓
{
if(tmr_s&&tmr_d){tmr_d=0;power_up_s++;}
if(power_up_s==1){power_up_s=0;power_up=1;}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -