|
AC230V交流電機(jī)調(diào)速原理圖和程序,供大家參考和學(xué)習(xí),嚴(yán)禁用于商業(yè)用途。
#pragma vector ISR_EXINT @0x04
//外部中斷--雙邊沿
void ISR_EXINT(void)
{
_intf=0; //清中斷標(biāo)志位
out=0; //過零關(guān)閉
f_time=1;
if(frequency_count>=190)
f_mode=1; //50HZ
else
f_mode=0; //60hz
frequency_count=0;
}
//定時(shí)器中斷--100us
#pragma vector ISR_STMINT @0x10
//定時(shí)器中斷--50us
void ISR_STMINT(void) //0.05MS
{
_stma0f = 0; //清中斷標(biāo)志位
if(frequency_count<250)
frequency_count++; //200=50hz,166.6=60hz
if(f_3) //初始=0,上電延時(shí)15MS進(jìn)入
{
if(f_time) //接收到外部中斷后開始計(jì)時(shí)
cnt_100us++;
if((cnt_100us>=angle) &&(!f_temp)) //angle + 溫度保護(hù)
out=1;
if(cnt_100us>=(angle+20)) //20=1ms
{
out=0;
cnt_100us=0;
f_time=0;
}
}
else
{
cnt_100ms++;
if(cnt_100ms>=250) //150
{
f_3=1;
cnt_100ms=0;
}
}
}
//時(shí)基中斷服務(wù)函數(shù)
#pragma vector ISR_TB0INT @0x08
//用作定時(shí)中斷
void ISR_TB0INT(void)
{
_tb0f = 0; //清中斷標(biāo)志位
if(f_3)
{
if(!f_ruanqi) //軟啟動(dòng)標(biāo)記,f_ruanqi=1,軟啟動(dòng)OK
{
cnt_50ms++;
if(cnt_50ms>=RUAN_QI) //ruanqi=40常數(shù),軟啟動(dòng)速率,數(shù)值越大,啟動(dòng)越慢
{
ruanqi_data--;
cnt_50ms=0;
}
}
//電流電壓反饋值
ad_cur=0;
_sadc0=0x32; //an3
_sadc1=0x04; //fad=fsys/16;
_sadc2=0x00; //參考電壓VDD
_start=0;
_start=1;
_start=0; //啟動(dòng)一次ADC
while(_adbz); //等待ADC結(jié)束
ad_cur=_sadoh;
ad_cur<<=8;
ad_cur|=_sadol; //讀取并返回?cái)?shù)據(jù)
if(!f_1) //初始為0,
{
ad_zong+=ad_cur;
ad_ci++;
if(ad_ci>=16) //16次后標(biāo)記f_1=1;
{
ad_ci=0;
f_1=1;
}
}
cnt_100++;
if(cnt_100>=100) //數(shù)字越大,補(bǔ)償越慢,開始是100,補(bǔ)償速率
{
cnt_100=0;
if(r>l) //0<=r<=6補(bǔ)償目標(biāo)值
l++;
if(r<l)
l--;
}
}
}
|
|