我也是啊!!
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
这个函数 配置成TIM_ICPolarity_Rising TIM_ICPolarity_Falling 都不行。只有TIM_ICPolarity_BothEdge 编码器才有数值,而且是递减的!!
感觉是清的时机不对,第一:SR寄存器的CC1IF-CC4IF位是计数器CNT到达CCR1-CCCR4寄存器的值会置1,还有你说的SR寄存器是读清零,我在手册中没有找到。
第二:首先你清零的时候你自己还不确定SR寄存器的值,有可能是你清零之后CNT达到arr的值,并置1,你可以考虑把CR1的OPM位置1,单脉冲模式,或者等一下while(!(tim1-sr1));当采取这种方式的时候,建议先清除CNT的是能位,(CR1=0),然后在读SR
编码器计算设定:
1、所需分辨率:测量轮:周长200mm,精度0.1mm 分辨率R=周长/精度=2000P/R
2、所需响应频率:速度=1000rpm,所需分辨率3600I/U(分辨率)响应频率Fmax=(速度*分辨率)/60=600KHZ
3、最大响应频率:(最大响应转速rpm)/60*(脉冲数/转)=输出频率HZ
4、最大响应转速:(最大响应频率HZ )/(脉冲数/转)*60=轴的转速rpm
一般是程序问题,你可以从以下几点进行检查:
首先当然是tim的初始化,是否设置正确;GPIO是否设置为复用输出;Tim3和GPIO的时钟是否使能。引脚的主功能是否被初始化了时钟(这一点为方便理解,给你举个例子,假如这个引脚有UART1的功能,这个引脚的复用功能是TIM3,那么你就不能初始化UART1的时钟,否则会造成TIM3复用失败)。
如果存在硬件的输入输出端,那么就可以通过电路的连接实现你所需要的功能,如 TIM2的输出端连接到TIM3的输入端,TIM3的输出端连接到TIM4的输入端,等等;
或者在中断例程里实现,如在TIM2的中断例程里判断并触发TIM3工作,在TIM3的中断例程里判断并触发TIM4工作;
....前面省略了
TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);
/* 通道1工作模式 */
TIM_OCStructInit(TIM_OCInitStructure); //其它默认值
//110:PWM模式1- 在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM_OCPolarity_Low;//输出极性0:高电平有效
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出
TIM_OCInitStructure.TIM_Pulse = 50*(SYSTEM_CLOCK/1000000); //50us高电平
//1通道pwm
TIM_OC3Init(TIM3, TIM_OCInitStructure);
TIM_OC3FastConfig(TIM3, TIM_OCFast_Enable);
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); //通道预装载使能
/* //12模拟输入捕获上升下降沿*/
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//TIM_ICSelection_IndirectTI;//
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x08;
TIM_ICInit(TIM3, TIM_ICInitStructure); TIM_ClearFlag(TIM3,TIM_FLAG_Update|TIM_FLAG_CC1|TIM_FLAG_CC2|TIM_FLAG_CC3|TIM_FLAG_CC4);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC4, ENABLE);
TIM_Cmd(TIM3, ENABLE);
再加中断配置,不保证一定行大概意思就是这样了
本文标签:stm32编码器tim3