当前位置:首页 > 单片机 > 单片机
[导读] 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数。这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数。阅读Arduino关于该编码器的介绍,该编码器还可以实现旋转的速度、加速度的计算。应该算是算法层级的吧,还没做到实际应用,暂时不深究,本篇仅仅对旋转编码器的原理以及STM32编码器接口模式的配置使用方法做个简介。

 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数。这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数。阅读Arduino关于该编码器的介绍,该编码器还可以实现旋转的速度、加速度的计算。应该算是算法层级的吧,还没做到实际应用,暂时不深究,本篇仅仅对旋转编码器的原理以及STM32编码器接口模式的配置使用方法做个简介。

正文

编码器分类:

按工作原理:光电式、磁电式和触点电刷式;

按码盘的刻孔方式:增量式和绝对式两类;

这是从网上看到一个简介,只接触过Arduino的编码器,其他暂未使用过。

Arduino的编码器属于增量式。它一共有5根线。分别为“CLK”、“DT”、“SW”、“+”、“GND”。

“+”、“GND”:勿用多说,VCC与GND,接至板子的VCC与GND即可。

“SW”:Arduino介绍说,当旋钮旋转完一圈时,该脚会放出一个电平跳变信号,相当于旋转编码器常说的“Z”信号,实际上我买的这个只是一个开关,即旋钮部分可以按下去(类似于汽车上的音量调节按钮),该接口会产生一个下降沿。然后由MCU去做相关处理。

“CLK”、“DT”:在该模块上显示的丝印名称为这两个,不明白为什么是这个丝印,应该实际对应于编码器常用的“A”、“B”信号吧,这两个信号的发生方式如下:

正旋:如上图当旋钮开始正向旋转时,“A”从低电平变为高电平,“B”保持不变;当旋钮旋转到预定位置时,“A”维持为高电平,“B”然后跟着从低电平跳变到高电平。也就是说,正旋时,“A”总是先与“B”开始电平变化。

反旋:与正旋相反,“B”总是先与“A”开始电平变化。

所以在此处,丝印将该两个接线印成“CLK”、“DT”就让我有点困惑。也未找到相关资料,先暂时放放,下次有实际应用,就知道为什么了。

根据如上正旋反旋规律,就已经可以根据编码器输出的信息判断出编码器的旋转方向以及计算出其旋转角度了,具体做法如下:

将“CLk”、“DT”分别连接至MCU的任意具有外部中断的IO口,处理方式为:

将该两个IO口配置为双边沿外部中断。

当其中某个IO口检测到上升沿或者下降沿时,在中断函数内检测另一个IO口的电平状态。以正旋为例,正旋时,“A”先上升沿引起中断,得到的“A”、“B”的电平状态为“10”,紧接着,“B”上升沿,检测到“A”、“B”电平状态为“11”。

若一直正转,则“A”、“B”的电平状态为“10 - 11 - 01 - 00 - 10 - ...”。

若一直反转,则“A”、“B”的电平状态为“01 - 11 - 10 - 00 - 01 - ...”

以此,即可判断出该编码器的旋转方向,同时在“A”、“B”同时跳变完成后,即可根据编码器的旋转方向对编码器的旋转计数进行增减。

以上为使用外部中断方式处理旋转编码器的输出信息,当然,本篇要用到STM32定时器的接口模式,所以也就不会用以上的方法进行判断。那么定时器的接口模式是如何对旋转编码器进行计数的呢?

其实原理一样,将旋转编码器的“CLK(A)”、“DT(B)”脚接入到TIMx的通道,将对应通道引脚配置为编码器接口模式,使能计数,然后STM32的值就会在硬件上按照上述规对计数器的值进行加减。

本实验接到的是STM32F103的“PB6(TIM4_CH1)”、“PB7(TIM4_CH2)”,具体配置如下:

配置IO口:

// GPIO// 使能对应的GPIO口时钟RCC_APB2PeriphClockCmd(Enc_GPIO_CLK, ENABLE);

GPIO_InitStructure.GPIO_Pin = Enc_CLK_GPIO_PIN | Enc_DAT_GPIO_PIN | Enc_SW_GPIO_PIN;// 该编码器模块已经做了外部上拉处理,配制成浮空输入即可GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(Enc_GPIO_PORT, &GPIO_InitStructure);

配置定时器基本单元:

// TIM4// PB6 ch1 A,PB7 ch2 // TIMxCLK = 36MHZRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

TIM_DeInit(TIM4);

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 0xFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0;

TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

配置对应寄存器为编码器接口模式以及配置相关的输入捕获配置:

TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);

TIM_ICStructInit(&TIM_ICInitStructure);

TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;TIM_ICInit(TIM2, &TIM_ICInitStructure);

清除相关中断,以及清除对应的计数器,并启动定时器:

// Clear all pending interruptsTIM_ClearFlag(TIM4, TIM_FLAG_Update);// 其实中断可以不用开,因为硬件自行对计数器进行加减。TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM4->CNT = 0;

TIM_Cmd(TIM4, ENABLE); //启动TIM4定时器

如若开了中断,中断处理函数为:

void TIM4_IRQHandler(void){

if(TIM4->SR&0x0001)//溢出中断{

LED_Toggle(1);

}

TIM4->SR&=~(1<<0);//清除中断标志位 }

主函数读取相应计数器值,并将其打印至串口:

int main(void) {// 读取计数器信息Enc0Pos = TIM_GetCounter(TIM4);// 取模2的原因是,两个引脚接到同一个定时器,每旋转一次会计数两次Enc0Pos /= 2;if(Enc0Pos != Enc_PinDATLast

{

Enc_PinDATLast = Enc0Pos; printf("Position = %d\n\r", Enc0Pos);

}

}

参考文献:

"Reading Rotary Encoders Contents".

"Get Native 32Bit resolution for your encoder on STM32F4".

"STM32定时器---正交编码器模式详解".

至此,记录完毕

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在这篇文章中,小编将对74LS148编码器的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: 74LS148 编码器

一直以来,编码器都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来编码器的相关介绍,详细内容请看下文。

关键字: 编码器 工业控制 机器人

编码器,作为一种广泛应用在信息处理、数据通信和自动化控制等领域的关键设备,其基本原理涉及信号转换与数据压缩的过程。编码器的主体功能是将物理量(如角度、位置、速度或线性位移)转换成对应的数字或电信号,以便于后续系统进行精确...

关键字: 编码器 自动化控制

Holtek新推出BS67F2432具备触控按键、高精准度HIRC与LCD驱动器Flash MCU。主要特色为内建高精准度4MHz HIRC振荡电路、8路触控按键及最大支持4COM×15SEG LCD驱动器。适用于触控接...

关键字: MCU LCD驱动器 定时器

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片,加速高端工控MCU和车用MCU应用的安全开发

关键字: MCU 编码器 电机驱动

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

一直以来,编码器都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来编码器的相关介绍,详细内容请看下文。

关键字: 74ls148 编码器

今天,小编将在这篇文章中为大家带来编码器的有关报道,通过阅读这篇文章,大家可以对编码器具备清晰的认识,主要内容如下。

关键字: 74ls148 74hc148 编码器
关闭
关闭