手上的旋转编码器是30位的,网上搜到的大都说30位15脉冲,我从网上也找来一个示例下载后运行,果然是只能输出15个脉冲,觉得不解,那其他的15位不就浪费了?而且每旋转2位才输出一个脉冲,那个无输出的位就显得很不合理。直到在B站看了一个UP(机电匠)的介绍视频,请教过后才找到解决这个问题的想法。

旋转编码器
网上找来的示例,能实现15脉冲输出,且支持正反转计数。在此基础上,通过B站UP提示的 对A脚的上升沿和下降沿都需要检测 我对示例进行了调整,示例中其实只对下降沿做了判断,上升沿并没有处理。源程序没有使用中断,我也不会使用。就想着,如果AB脚被上拉了,如何还有上升沿?是拉低后恢复上拉时候产生的上升沿吗? 示例来源:https://www.basemu.com/how-to-use-rotary-encoder-arduino.html B 站来源:https://www.bilibili.com/video/BV1uv411q7Wy
源程序并没有串口输出值,而是调节LED亮度,我将其改为直接输出值。强烈建议查看以上2个来源。 Arduino 测试例程: /* 采样编码器 200Hz 使用 millis() 函数 */ int Value = 0; // 编码器输出值 int Step = 5; // 定义每次旋转的步进值 unsigned long currentTime; unsigned long loopTime; const int pin_A = 2; const int pin_B = 3; unsigned char encoder_A; unsigned char encoder_B; unsigned char encoder_A_prev=0; void setup() { Serial.begin(115200); pinMode(pin_A, INPUT_PULLUP); //设置上拉输入,是否就不用外部上拉? pinMode(pin_B, INPUT_PULLUP); currentTime = millis(); loopTime = currentTime; } void loop() { // 获取经过的时间 currentTime = millis(); if(currentTime >= (loopTime + 5)){ // 5ms = 200Hz encoder_A = digitalRead(pin_A); // 读取编码器值 encoder_B = digitalRead(pin_B); // A脚 高电平转低电平,下降沿 if((!encoder_A) && (encoder_A_prev)){ // A从高到低 if(encoder_B) { // B 高电平,顺时针 // 增加,不要超过255 if(Value + Step <= 255) Value += Step; } else { // B 低电平,逆时针 // 降低,不要低于0 if(Value - Step >= 0) Value -= Step; } } // A脚 低电平转高电平,上升沿 if((encoder_A) && (!encoder_A_prev)){ if(!encoder_B) { // 增加,不要超过255 if(Value + Step <= 255) Value += Step; } else { // 降低,不要低于0 if(Value - Step >= 0) Value -= Step; } } // 存储A脚状态 encoder_A_prev = encoder_A; // 输出 Serial.println(Value); // 更新循环时间 loopTime = currentTime; } // 其他补充的代码,可以从这里开始 }