6-8编码器接口测速

常用函数

1
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

定时器编码器接口配置

编码器接口测速

Encoder.c

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
#include "stm32f10x.h"                  // Device header void Encoder_Init(void){	//开启时钟	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3是APB1的外设	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使用TIM3的通道1,引脚是PA6	//配置GPIO	GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOA, &GPIO_InitStructure); 	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//ARR,这里最好设置大一些,防止溢出,这里给最大值	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC,这个值决定测周法的标准频率fc,根据信号频率分布范围调整	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);	//初始化输入捕获单元	TIM_ICInitTypeDef TIM_ICInitStructure;	TIM_ICStructInit(&TIM_ICInitStructure);	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道	TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性选择,代表不反向	TIM_ICInit(TIM3,&TIM_ICInitStructure);	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//选择通道	TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性选择,代表不反向	TIM_ICInit(TIM3,&TIM_ICInitStructure); 	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); 	TIM_Cmd(TIM3,ENABLE);} int16_t Encoder_Get(void){	int16_t Temp;	Temp = TIM_GetCounter(TIM3);	TIM_SetCounter(TIM3,0);	return Temp;}  

main.c

123456789101112131415161718192021222324252627282930
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "Timer.h"#include "Encoder.h"uint16_t Num;int16_t Speed;int main(void){	OLED_Init();	Timer_Init();	Encoder_Init(); 	OLED_ShowString(1,1,"CNT:"); 	while(1)	{		OLED_ShowSignedNum(1,5,Speed,5);	}} void TIM2_IRQHandler(void){	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)	{		Speed = Encoder_Get();		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);	}} 
🔍 ×