stm32官方编码器例程pid实现-u球体育app下载

单片机 > 单片机程序设计 > 详情

stm32官方编码器例程pid实现

发布时间:2024-11-13 发布时间:
|

最近在调试编码器,用的貌似是官方给出的例程,但是在做pid的时候遇到困难,不知道该如何在此基础上实现pid,有大神指教吗?

 #define encoder_timer   tim3  // encoder unit connected to tim3
    #define encoder_tim_period (u16)32   //line of encoder
    #define counter_reset   (u16)0
    #define icx_filter      (u8) 6 // 6 670nsec
    static volatile u16 hencoder_timer_overflow; 
    static u8 duty_tim3 = 0;
    extern u16 hencoder_timer_overflag;
  u16 rotor_speed=0;
    u8 period_tim3 = 0,collecflag_tim3;
    
    void enc_init(void)
    {
        tim_timebaseinittypedef  tim_timebasestructure;
        tim_icinittypedef tim_icinitstructure;
        nvic_inittypedef nvic_initstructure;
        //tim3 clock enable
        rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable);
        
        //priority of tim3
        nvic_initstructure.nvic_irqchannel = tim3_irqn;          
        nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x00; 
        nvic_initstructure.nvic_irqchannelsubpriority = 0x02; 
        nvic_initstructure.nvic_irqchannelcmd = enable;
        nvic_init(&nvic_initstructure);
        
        gpio_pinafconfig(gpiob,gpio_pinsource4,gpio_af_tim3);
        gpio_pinafconfig(gpiob,gpio_pinsource5,gpio_af_tim3);
        
         
        tim_deinit(encoder_timer);
        tim_timebasestructinit(&tim_timebasestructure);
        
        tim_timebasestructure.tim_prescaler = 0x00;
        tim_timebasestructure.tim_countermode = tim_countermode_up;
        tim_timebasestructure.tim_period = (4*encoder_tim_period)-1;            //éèöãpwmöüæú
        tim_timebasestructure.tim_clockdivision = tim_ckd_div1;
        tim_timebaseinit(encoder_timer, &tim_timebasestructure);
        //±àâëæ÷½ó¿úä£ê½³õê¼»¯    ´ëº¯êýëµã÷ö»óð¶¨ê±æ÷µächanel1 and chanel2 ¾ßóð±àâëæ÷¹¦äü£¬æäëûí¨µà¯³é±àâëæ÷¹¦äü
         tim_encoderinterfaceconfig(encoder_timer, tim_encodermode_ti12,tim_icpolarity_rising, tim_icpolarity_rising);
        
//        tim_icinitstructure.tim_channel=tim_channel_2;
//        tim_icinitstructure.tim_icselection=tim_icselection_directti;
        
        tim_icinitstructure.tim_icpolarity = tim_icpolarity_rising;     
    tim_icinitstructure.tim_icprescaler = tim_icpsc_div1;  
        tim_icstructinit(&tim_icinitstructure);
        tim_icinitstructure.tim_icfilter = icx_filter;//â벨걼äèçºî¼æëãµãà´£¿£¿
        tim_icinit(encoder_timer, &tim_icinitstructure);
        
//    tim_selectinputtrigger(encoder_timer, tim_ts_ti2fp2); //ñ¡ôñê±öó´¥·¢ô´      
//        tim_selectslavemode(encoder_timer, tim_slavemode_reset);//´óä£ê½ñ¡ôñ
//        tim_selectmasterslavemode(encoder_timer, tim_masterslavemode_enable); //ö÷´óä£ê½ñ¡ôñ
        
         // clear all pending interrupts
        tim_clearflag(encoder_timer,tim_it_cc1|tim_flag_update);
        tim_itconfig(encoder_timer,tim_it_cc1|tim_it_update, enable);
        //reset counter
        encoder_timer->cnt = counter_reset;
        
        tim_cmd(encoder_timer, enable);  
    }
    
        s16 enc_get_rotorspeed(void)
{
    static  u16   lastcount = 0;
    u16  curcount = encoder_timer->cnt;//
      rotor_speed=(128*hencoder_timer_overflag curcount-lastcount)/64;
      printf("hencoder_timer_overflag=%d\r\n",hencoder_timer_overflag);
      lastcount = curcount;
      return (u16) rotor_speed;
}

void tim3_irqhandler(void)
{
    if(tim_getitstatus(tim3,tim_it_update)==set) //òç³ööð¶ï
    {
        tim_clearitpendingbit(tim3,tim_it_update);  //çå³ýöð¶ï±êö¾î»
        hencoder_timer_overflag ;
    }    
    else if(tim_getitstatus(tim3,tim_it_cc1)==set)    
    {
        duty_tim3=tim_getcapture1(tim3);
        if(tim_getcapture2(tim3)>64)
            period_tim3=tim_getcapture2(tim3);
        collecflag_tim3=0;
    }
}


『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
使用ni开发系统和amr系统实现自动化仪表读数系统的设计
网站地图