EC11旋转编码器&脉冲个数计数及转向检测编程

旋转编码器是用来测量转速并配合PWM技术可以实现快速调速的装置,其中,光电式旋转编码器通过光电转换,可输出轴的角位移、角速度等机械量转换成相应的电脉冲以数字量输出。
旋转编码器与电位器的主要区别在于:电位器的原理是通过旋转改变阻值输出,因为电位器内部有电阻片,电阻片有角度限制,所以旋转角度不足360度;而旋转编码器的原理是通过旋转改变脉冲输出,因为编码器内部是触点,通过接通与断开改变脉冲,所以可以360度无限旋转。
在购买时我们通常会看到标注有EC11或EC12,EC12与EC11并没有太大区别,只是在尺寸上略有区别,如EC11的方形底座边长是11.7mm; EC12的方形底座边长是12.5mm;EC16的方形底座边长是16mm。
旋转编码器也分为增量式与绝对式,增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。
我们接下来讨论的主要的EC11旋转编码器(增量式)。
如果只是要采集脉冲的个数或者检测旋转的正反向,可以不用捕获波形,计上升沿或下降沿的个数即可。
在这里插入图片描述
可通过示波器查看旋转时两只脚输出的脉冲的波形,可观察到当旋钮向一个方向旋转时,一个脚产生下降沿,另一个脚处于高电平;一个脚产生下降沿,另一个脚处于低电平(或一个脚产生上升沿,另一个脚处于高电平;一个脚产生上升沿,另一个脚处于低电平)
该程序的大概思路是:设置定时器二的两个通道进行脉冲的捕获;设置定时器五进行定时采集;通过串口一将采集到的脉冲个数与转向传到电脑(可通过串口助手进行查看)。
程序如下:
   https://download.csdn.net/download/Jessaly/12129557

如有问题或文章有任何纰漏,欢迎留言交流!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
当然可以!下面是一个简单的示例程序,使用 STM32F103C8T6 微控制器来读取 EC11 旋转编码器旋转并将计数结果输出。 首先,您需要确保您的开发环境中已经正确配置了 STM32F103C8T6 的开发板和相关库。 然后,您可以使用以下代码作为起点: ```c #include "stm32f10x.h" // 定义旋转编码器引脚 #define ENC_A_PIN GPIO_Pin_0 #define ENC_B_PIN GPIO_Pin_1 // 定义计数器变量 volatile int32_t counter = 0; // 初始化旋转编码器引脚 void Encoder_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置旋转编码器引脚为输入模式 GPIO_InitStructure.GPIO_Pin = ENC_A_PIN | ENC_B_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // 读取旋转编码器状态并更新计数器 void Encoder_Update(void) { static uint8_t enc_prev_state = 0; uint8_t enc_state = (GPIO_ReadInputDataBit(GPIOA, ENC_A_PIN) << 1) | GPIO_ReadInputDataBit(GPIOA, ENC_B_PIN); // 根据旋转编码器的状态变化来更新计数器 if (enc_state == 0x00 && enc_prev_state == 0x01) counter++; else if (enc_state == 0x00 && enc_prev_state == 0x02) counter--; else if (enc_state == 0x03 && enc_prev_state == 0x02) counter++; else if (enc_state == 0x03 && enc_prev_state == 0x01) counter--; enc_prev_state = enc_state; } int main(void) { // 初始化旋转编码器 Encoder_Init(); while (1) { // 在这里添加您希望执行的其他任务 // 更新旋转编码器状态 Encoder_Update(); // 在这里添加您希望输出计数结果的代码 } } ``` 该示例程序包含了初始化旋转编码器引脚的函数 `Encoder_Init()`,以及读取旋转编码器状态并更新计数器的函数 `Encoder_Update()`。您可以在 `main` 函数中添加其他任务,并在适当的地方输出计数结果。 请注意,该示例程序仅提供了 EC11 旋转编码器的基本计数功能,如果您需要更复杂的功能,例如检测按下按钮等,您可能需要根据实际需求进行更多的代码编写和配置。 希望这可以帮助到您!如果您有任何进一步的问题,请随时提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值