我有一个问题,STM32编码器模式最高输入频率是多少??望解释!!!!!!!!
最近自己要用STM32的编码器功能,A、B相输入,感觉单相输入最小完整周期都不到2ms,
我用STM32的TIM5的两个通道(TIM5_CH1、TIM5_CH2)翻转输出相差90°的两个脉冲模拟A、B相,TIM4做编码器输入,TIM4计数中断后关闭TIM5(即关闭TIM5_CH1、TIM5_CH2的输出),但发现TIM5输出频率太高(T5<2ms)时,用逻辑分析仪测得的TIM5_CH1、TIM5_CH2输出脉冲数不对,增大时计数才是对的(但每次都多一个脉冲)
一下是我的源代码:
//TIM4 编码器输入,TIM4_CH1作A相,TIM4_CH2作B相
//period_tim4: TIM4周期计数值
//period_tim5:TIM5 PWM输出周期
//duty_tim5_CH1:TIM5 CH1反转输出点,A相
//duty_tim5_CH2:TIM5 CH2反转输出点,B相
void TIM4_ENCODER_PB6_PB7_TIM5_CH1_PA0_CH2_PA1(uint16_t period_tim4,
uint16_t period_tim5, uint16_t duty_tim5_CH1, uint16_t duty_tim5_CH2)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM5, ENABLE);
//TIM4 PB6 A相 PB7 B相 58/59脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//TIM5 PA0 CH1 PA1 CH2 14/15脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// Enable the TIM4 Update Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//初始化TIM4
TIM_TimeBaseStructure.TIM_Period = period_tim4; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置用来作为TIMx时钟频率除数的预分频值,72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
//初始化TIM5
TIM_TimeBaseStructure.TIM_Period = period_tim5; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = (9 - 1); //设置用来作为TIMx时钟频率除数的预分频值,72MHz/(9 - 1 + 1)=8MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
/* Output Compare Toggle Mode configuration: Channel1/2 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //管脚输出模式:翻转
TIM_OCInitStructure.TIM_Pulse = duty_tim5_CH1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能TIM5_CH1通道
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出为负逻辑
TIM_OC1Init(TIM5, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //管脚输出模式:翻转
TIM_OCInitStructure.TIM_Pulse = duty_tim5_CH2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM5, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
// Clear all pending interrupts
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_SetCounter(TIM4, 0);
TIM_Cmd(TIM4, ENABLE);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_SetCounter(TIM5, 0);
TIM_Cmd(TIM5, ENABLE);
}
TIM4_ENCODER_PB6_PB7_TIM5_CH1_PA0_CH2_PA1(20, 48*200, 12*200, 36*200);
实际效果:
period_tim5 = 48 * 170时逻辑分析仪监测:
|