最近在调试编码器,用的貌似是官方给出的例程,但是在做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;
}
}
『本文转载自网络,64体育的版权归原作者所有,如有侵权请联系删除』