TA的每日心情 | 慵懒 2018-3-28 17:24 |
---|
签到天数: 276 天 连续签到: 1 天 [LV.8]以坛为家I
|
PG调速原理1:测速
PG电机有一个脉冲输出口(三根线,一个是+5V一个是GND,一个是脉冲输出)
电机转动时脉冲输出口就有信号输出;1PG的电机就是电机每转一转输出一个脉冲;
3PG的电机就是电机每转动一圈输出3个脉冲;
要测速时就用一个中断口接到电机的脉冲输出口上,就能测出相邻两个脉冲的时间;
这个时间就是电机的瞬时速度;
2:调速
调速就是把电机的瞬时速度同想要得到的速度相比较;进而改变可控硅的导通角(相当于调电压);
达到调速的目的
/******************************************************************测速*/
unsigned int pwm_buf;//想要得到的速度
unsigned int speed_pwm_buf;//可控硅导通角调整值
unsigned int pg_start;//保存上一次脉冲来时定时器的值
__interrupt void pg_int(void);/*PG反馈脉冲检测*/
#pragma intvect pg_int 0x02
__interrupt void pg_int(void)
{
unsigned int pg_time_buf;//保存瞬时速度;
unsigned int pg_stop;//保存本次脉冲来时定时器的值
unsigned int speed_temp_buf;//保存瞬时速度同想要得到速度的差值
unsigned char speed_pwm_k;//调整系数
EIR2=0;//清中断标志位
IO_WDTC=0X05;//清看门狗
pg_stop=IO_TCP.word;//读出定时器的值
if(pg_stop>=pg_start)//定时器没溢出
{
pg_time_buf=pg_stop-pg_start;
}
else//定时器已经溢出
{
pg_time_buf=50000;
pg_time_buf=(pg_time_buf-pg_start)+pg_stop;
}
pg_start=pg_stop;//交换本次脉冲来时定时器的值作为下次的值
speed_count++;
if(speed_count<=6)//多测几次;相当于滤波
{
return;
}
speed_count=0;
if(pg_time_buf==pwm_buf)//假如瞬时速度等于想要得到速度
{
speed_up_buf=0;//正偏差量清零
speed_down_buf=0;//负偏差量清零
return;
}
if(pg_time_buf>pwm_buf)//假如瞬时速度小于想要的速度
{
speed_temp_buf=pg_time_buf-pwm_buf;//得到瞬时速度同想要得到速度的差值
speed_up_buf++;//正偏差量增加
speed_down_buf=0;
}
if(pg_time_buf<pwm_buf)//假如瞬时速度大于想要的速度
{
speed_temp_buf=pwm_buf-pg_time_buf;//得到瞬时速度同想要得到速度的差值
speed_down_buf++;//负偏差量增加
speed_up_buf=0;
}
if(speed_temp_buf<=100)//如果瞬时速度同想要得到速度的差值比较小
{
speed_pwm_k=101-speed_temp_buf;//调整系数比较大
}
else//如果瞬时速度同想要得到速度的差值比较大
{
speed_pwm_k=1;//调整系数比较小
}
if(speed_up_buf>=speed_pwm_k)//如果是正偏差量就减小可控硅导通角(加速)
{
speed_pwm_buf-=1;
speed_up_buf=0;
}
if(speed_down_buf>=speed_pwm_k)//如果是负偏差量就加大可控硅导通角(减速)
{
speed_pwm_buf+=1;
speed_down_buf=0;
}
}//注意速度大小和测得的相邻脉冲时间大小成反比
///////////////////////////////////////////////////////
unsigned char pwm_pinter;
unsigned char speed_up_buf,speed_down_buf,speed_count;
extern void mode_turn(void);
extern void iic_read_task(void);
extern void iic_write_task(void);
extern void temp_test_task(void);
/*********************************************同步*/
__interrupt void zero_int(void);/*过零检测*/
#pragma intvect zero_int 0x01
__interrupt void zero_int(void)
{
EIR1=0;//清中断标志位
IO_WDTC=0X05;//清看门狗
NFJ_IO=0;//关断内风机
IO_CNTR.byte=0X28;//停止可控硅导通角计算定时器
IO_ILR3=0Xff;
pwm_pinter=1;//
if(fan_able_bit)//假如可以开风机
{
if(speed_pwm_buf<=80)//限定可控硅导通角最小值
{
speed_pwm_buf=80;//此时风机速度最高
}
if(speed_pwm_buf>220)//限定可控硅导通角最大值
{
speed_pwm_buf=220;//此时风机速度最低
}
IO_CNTR.byte=0xf7&IO_CNTR.byte;
IO_ILR3=0XFB;
IO_COMR=speed_pwm_buf;//给可控硅导通角计算定时器赋值;因为第一部分哪里随时在改变speed_pwm_buf的值所以可控硅导通角计算定时器随时在变
IO_CNTR.byte=0X29;
}
else
{
speed_pwm_buf=150;////可控硅导通角默认值
}
}
////////////////////////////////////////////////////////////
__interrupt void pwm_int(void);
#pragma intvect pwm_int 0x09
__interrupt void pwm_int(void)/*PG调速*/
{
IO_CNTR.byte=0X28;
if(pwm_pinter>1)//触发脉冲(下降沿)
{
pwm_pinter=0;
NFJ_IO=0;
IO_ILR3=0Xff;
}
else//调整的导通角时间到产生触发脉冲(上升沿)
{
pwm_pinter=2;
NFJ_IO=1;
IO_CNTR.byte=0xf7&IO_CNTR.byte;
IO_ILR3=0XFB;
IO_COMR=80;
IO_CNTR.byte=0X29;
}
}
/***********************************************把风机速度转换为时间周期*/
//pwm_buf=60*f/转数*PG数*分频比(f=8000000)
unsigned int pwm_buf;
#define hight_speed 7936//1260高风
#define mid_speed 9346//1070中风
#define low_speed 10869//920低风
#define low_low_speed 16666//600超低风
if(hight_bit)//
{
pwm_buf=7936;//1260
}
if(mid_bit)
{
pwm_buf=9524;//1050
}
if(low_bit)
{
pwm_buf=10869;//920
}
//////////////////////////////////////////////////////
实际空调程序中测速定时器和遥控接收定时器;主定时器和用意个Timer
显示用一个定时器Timer
PG触发脉冲定时器用一个Timer
最少要用3个Timer(没有PG调速就可只用两个)
|
评分
-
查看全部评分
|