|
AC230V交流电机调速原理图和程序,供大家参考和学习,严禁用于商业用途。
#pragma vector ISR_EXINT @0x04
//外部中断--双边沿
void ISR_EXINT(void)
{
_intf=0; //清中断标志位
out=0; //过零关闭
f_time=1;
if(frequency_count>=190)
f_mode=1; //50HZ
else
f_mode=0; //60hz
frequency_count=0;
}
//定时器中断--100us
#pragma vector ISR_STMINT @0x10
//定时器中断--50us
void ISR_STMINT(void) //0.05MS
{
_stma0f = 0; //清中断标志位
if(frequency_count<250)
frequency_count++; //200=50hz,166.6=60hz
if(f_3) //初始=0,上电延时15MS进入
{
if(f_time) //接收到外部中断后开始计时
cnt_100us++;
if((cnt_100us>=angle) &&(!f_temp)) //angle + 温度保护
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;
}
}
}
//时基中断服务函数
#pragma vector ISR_TB0INT @0x08
//用作定时中断
void ISR_TB0INT(void)
{
_tb0f = 0; //清中断标志位
if(f_3)
{
if(!f_ruanqi) //软启动标记,f_ruanqi=1,软启动OK
{
cnt_50ms++;
if(cnt_50ms>=RUAN_QI) //ruanqi=40常数,软启动速率,数值越大,启动越慢
{
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; //启动一次ADC
while(_adbz); //等待ADC结束
ad_cur=_sadoh;
ad_cur<<=8;
ad_cur|=_sadol; //读取并返回数据
if(!f_1) //初始为0,
{
ad_zong+=ad_cur;
ad_ci++;
if(ad_ci>=16) //16次后标记f_1=1;
{
ad_ci=0;
f_1=1;
}
}
cnt_100++;
if(cnt_100>=100) //数字越大,补偿越慢,开始是100,补偿速率
{
cnt_100=0;
if(r>l) //0<=r<=6补偿目标值
l++;
if(r<l)
l--;
}
}
}
|
|