STM32F4 读取双相编码器(附源码)

本文介绍了STM32F4读取AB相编码器的原理与代码。AB相编码器有两路脉冲信号,通过脉冲计数可测转动角度。STM32系列定时器自带编码器功能,能自动判断正反转。代码流程包括GPIO口初始化、定时器编码器模式初始化和读取定时器计数值,并给出了源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32F4 读取AB相编码器(附源码)

1. 原理

1.1 AB相编码器

在这里插入图片描述
AB相编码器,简而言之,就是有两路输出的脉冲信号,通过对脉冲计数,可以知道转动了多少角度。

读取编码器的数据也就是要让单片机对脉冲计数。

1.2 定时器的编码器模式

下面是我从STM32F4的中文数据手册中 “通用定时器” 一节摘取出来的片段。
STM32系列的定时器自带有编码器的功能,并且还能通过TIMx_CR1的DIR位自动判断正反转,可以自动的递增计数或递减计数。
详细的编码器模式可以见下文中的图片。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 代码

代码的流程有三步:
  • GPIO口初始化
  • 定时器编码器模式初始化
  • 读取定时器计数值
源代码如下:
void encoder_tim3_init(void)
{
	// GPIO口初始化
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;  // GPIO口的输入模式配置很重要,不正确的话会读不到数据
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);    
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM3);
	
	// 定时器编码器模式初始化
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	TIM_DeInit(TIM3);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	TIM_TimeBaseStructure.TIM_Period = 65535;
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 这里可以自己设置,或使用默认值
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising); // 这里配置了编码器模式
	
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICStructInit(&TIM_ICInitStructure);
	//TIM_ICInitStructure.TIM_ICFilter = 10; // 这里可以自己设置,或使用默认值
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_SetCounter(TIM3, 0);
	TIM_Cmd(TIM3, ENABLE);
}

// 读取定时器计数值
int read_encoder(void)
{
	int encoder_num;
	encoder_num = (int)((int16_t)(TIM3->CNT)); // 这里尤其需要注意数据类型
	TIM_SetCounter(TIM3, 0);
	return encoder_num;
}


int main(void)
{
	u32 t=0;
	uart_init(115200);
	encoder_tim3_init();
	delay_init(84);
	int encoder;
    while(1){
		encoder = read_encoder();
        printf("t:%d\r\n",encoder);
		delay_ms(1000);
		t++;
	}
}

在学习STM32F4编码器模式时,可以参考以下步骤和例程: 1. 首先,了解编码器模式返回值的含义。在正交编码器模式下,定时器数据寄存器TIMX->CNT中的值反映编码器所处的位置或角度,正负号表示编码器的正转或反转。 2. 确定所使用的编码器的线数。线数是指电机转一圈时编码器单独一相产生的脉冲数,常见的线数规格有130、260、390、780等。可以通过手动转动电机一圈,并使用串口读取定时器数据寄存器TIMX->CNT中的值,然后除以自己所设置的倍频,来确定线数的近似值。 3. 参考STM32F4的中文数据手册中的“通用定时器”一节,了解定时器自带的编码器功能和设置方法。定时器可以通过TIMx_CR1的DIR位自动判断正反转,并可以自动递增计数或递减计数。 4. 根据需要,选择合适的倍频设置。根据经验,二倍频设置具有较高的精度。可以参考其他人的经验或进行实验来确定最适合的倍频设置。 5. 根据以上步骤,编写相应的STM32F4编码器例程。可以参考官方文档或其他人的经验来编写代码,实现读取编码器位置信息并进行下一步操作的功能。 请注意,以上步骤和例程仅供参考,具体的编码器设置和例程可能会因具体的硬件和需求而有所不同。建议在编写代码之前,仔细阅读相关的官方文档和资料,确保正确理解和使用编码器功能。 #### 引用[.reference_title] - *1* *3* [STM32学习笔记——基于正点原子例程编码器模式小结](https://blog.csdn.net/secretboys/article/details/102726207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32F4 读取双相编码器(源码)](https://blog.csdn.net/handsome_for_kill/article/details/90573947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值