查看: 3144|回复: 1

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

[复制链接]
  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-6 14:04:43 | 显示全部楼层 |阅读模式
    分享到:
              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 三周年铜板双倍!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-10 17:05:05 | 显示全部楼层
    感谢分享。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 10:27 , Processed in 0.140690 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.