1回答

0收藏

这段交流电机调速程序很不错 也是压箱货

STMCU STMCU 3754 人阅读 | 1 人回复 | 2015-08-06

          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调速就可只用两个)

评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

党国特派员

发表于 2015-8-10 17:05:05 | 只看该作者

感谢分享。。。
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条