306浏览
查看: 306|回复: 9

[项目] 【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器

[复制链接]
本帖最后由 驴友花雕 于 2024-10-2 06:51 编辑

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图3

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图1

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图2

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:05:33

【花雕学编程】Arduino动手做(232)--ESP32S3-CAM旋转编码器2

EC11旋转编码器
也叫开关编码器、旋转编码器,EC11系列编码器有直插编码器、贴片式编码器、沉板式编码器、侧插式编码器,EC11A为直插式编码器。因广泛用于车载DVD、车载导航、汽车影音上,也经常被人称为汽车编码器。EC11编码器在各类仪器设备中用于频率、音量、速度、温度、电压、菜单选择、光线强弱等参数的控制。此款编码器有做20脉冲20定位点、15脉冲30定位点两种。调节轴有金属柄和塑胶柄,轴长区间9-30mm,调节轴有全柄、半柄、螺纹柄等类型供您选择。EC11系列编码器主要用于汽车电子、多媒体音响、仪器仪表、家用电器、智能家居、计算机周边、医疗器械等领域。主要用于频率调节、亮度调节、温度调节、音量调节的参数控制等。

技术参数
使用温度范围:-30℃ to+80℃
保存温度范围: -40℃ to+85℃
额定电压:DC 5V(最高12V)
全回转角度:360度(无止档点)
回转寿命:30000+200 Cycles
接触电阻:≤100mΩ
绝缘阻抗:100MΩ 以上
振荡:≤10mS 按压(开关SW)
寿命:20,000±200次.(0.5行程)
          15,000±200次.(1.5行程)

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:06:51

【花雕学编程】Arduino动手做(232)--ESP32S3-CAM旋转编码器2

工作原理
增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表明位移的巨细。编码器是把角位移或直线位移转换成电信号的一种设备。依照读出办法编码器能够分为机械式和非机械式两种:机械式选用电刷输出,一电刷触摸导电区或绝缘区来表明代码的状况是“1”仍是“0”;非机械式的承受灵敏元件是光敏元件或磁敏元件,选用光敏元件时以透光区和不透光区来表明代码的状况是“1”仍是“0”。旋转增量式编码器以转变时输出脉冲,通过计数设备来晓得其方位,当编码器不动或停电时,依托计数设备的内部回忆来记住方位。这样,当停电后,编码器不能有任何的移动,当来电作业时,编码器输出脉冲进程中,也不能有搅扰而丢掉脉冲,否则,计数设备回忆的零点就会偏移,并且这种偏移的量是无从晓得的,只要过错的出产成果呈现后才晓得。目前常用的增量式编码器全部为机械式编码器,好用且成本低,高端的一般为非机械光电式的。

旋转编码器
可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从 0 开始计数。增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。在 Eltra 编码器中角位移的转换采用了光电扫描原理。读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上。接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:08:04

【花雕学编程】Arduino动手做(232)--ESP32S3-CAM旋转编码器2

我手头的旋转编码器模块有5个引脚,分别是VCC, GND, SW, CLK, DT。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。两个引脚那一端为普通的按键,也就是圆柄按下去的那个按键,当做普通按键使用即可。右边三个引脚中间的为GND,两边为两路脉冲信号CLK和DT。旋转编码器的操作是旋转和按压转轴,在按下转轴的时候SW引脚的电平会变化,旋转的时候每转动一步CLK和DT的电平是有规律的变化。

引脚接线
ESP32-S3-CAM         旋转传感器模块
D1                              CLK(Clock 时钟)
D2                              DT (Data 数据)
D42                              SW   (按钮开关)   
5V                              +VCC   
GND                           GND  

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图2

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:45:22

【花雕学编程】Arduino动手做(232)--ESP32S3-CAM编码计数器

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
   OV2640/5640摄像头模组
  {花雕动手做}项目之三十四:ESP32-S3 CAM旋转增量编码器模块带防抖的中断计数器

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.    实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
  4.    OV2640/5640摄像头模组
  5.   {花雕动手做}项目之三十四:ESP32-S3 CAM旋转增量编码器模块带防抖的中断计数器
  6. */
  7. // 定义引脚
  8. int CLK = 1; // 编码器CLK引脚
  9. int DT = 2;  // 编码器DT引脚
  10. int count = 0; // 计数器
  11. int lastCLK = 0; // 上一次CLK的状态
  12. volatile bool updateFlag = false; // 标志位,指示计数器是否更新
  13. unsigned long lastDebounceTime = 0; // 上一次去抖动时间
  14. unsigned long debounceDelay = 5; // 去抖动延迟时间(毫秒)
  15. // 函数原型声明
  16. void IRAM_ATTR ClockChanged();
  17. void setup() {
  18.   // 设置引脚模式
  19.   pinMode(CLK, INPUT); // 设置CLK为输入模式
  20.   pinMode(DT, INPUT); // 设置DT为输入模式
  21.   
  22.   // 附加中断服务程序
  23.   attachInterrupt(digitalPinToInterrupt(CLK), ClockChanged, CHANGE); // 当CLK引脚状态变化时调用ClockChanged函数
  24.   
  25.   // 初始化串口通信
  26.   Serial.begin(115200); // 设置串口波特率为115200
  27.   Serial.println("编码器准备就绪");
  28. }
  29. void loop() {
  30.   // 检查标志位
  31.   if (updateFlag) {
  32.     noInterrupts(); // 禁用中断
  33.     updateFlag = false; // 重置标志位
  34.     interrupts(); // 启用中断
  35.     Serial.print("count: "); // 打印计数器值
  36.     Serial.println(count);
  37.   }
  38. }
  39. // 中断服务程序
  40. void IRAM_ATTR ClockChanged() {
  41.   unsigned long currentTime = millis();
  42.   // 检查是否超过去抖动延迟时间
  43.   if ((currentTime - lastDebounceTime) > debounceDelay) {
  44.     int clkValue = digitalRead(CLK); // 读取当前CLK引脚状态
  45.     int dtValue = digitalRead(DT); // 读取当前DT引脚状态
  46.    
  47.     // 检查CLK状态是否变化
  48.     if (clkValue != lastCLK) {
  49.       lastCLK = clkValue; // 更新lastCLK状态
  50.       // 根据CLK和DT状态变化更新计数器
  51.       count += (clkValue == dtValue) ? 1 : -1;
  52.       updateFlag = true; // 设置标志位,指示计数器已更新
  53.     }
  54.     lastDebounceTime = currentTime; // 更新去抖动时间
  55.   }
  56. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:47:44

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器

代码解读
1、引脚定义和变量声明:
CLK 和 DT 分别定义为编码器的时钟引脚和数据引脚。
count 用于记录编码器的计数值。
lastCLK 用于存储上一次读取的CLK引脚状态。
updateFlag 是一个标志位,用于指示计数器是否更新。
lastDebounceTime 和 debounceDelay 用于去抖动处理,防止由于抖动导致的重复计数。

2、函数原型声明:
void IRAM_ATTR ClockChanged(); 声明了中断服务程序的原型,确保在setup函数中调用时能够找到该函数。

3、setup函数:
设置CLK和DT引脚为输入模式。
使用attachInterrupt函数将ClockChanged函数附加到CLK引脚的状态变化中断上。
初始化串口通信,设置波特率为115200,并打印“编码器准备就绪”以确认初始化成功。

4、loop函数:
检查updateFlag标志位,如果为true,表示计数器已更新。
禁用中断,重置updateFlag标志位,启用中断,确保在访问共享变量时的数据一致性。
打印当前计数器值。

5、中断服务程序 ClockChanged:
读取当前时间currentTime。
检查当前时间与上一次去抖动时间lastDebounceTime的差值是否超过去抖动延迟时间debounceDelay。
读取当前CLK和DT引脚的状态。
如果CLK状态发生变化,更新lastCLK状态。
根据CLK和DT状态的变化更新计数器值,并设置updateFlag标志位。
更新去抖动时间lastDebounceTime。

6、关键点总结
去抖动处理:通过检查时间间隔来防止由于抖动导致的重复计数。
中断处理:使用中断服务程序实时响应编码器的状态变化,确保计数器的准确性。
标志位机制:在中断服务程序中设置标志位,在主循环中处理计数器更新,避免在中断中进行阻塞操作。
串口通信:通过串口打印计数器值,便于调试和监控编码器的工作状态。
数据一致性:在访问共享变量时禁用中断,确保数据一致性。


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:50:39

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器

实验串口返回情况

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 06:55:29

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器

实验场景图

【花雕学编程】Arduino动手做(232)---ESP32S3-CAM编码计数器图1
回复

使用道具 举报

kk——k  学徒

发表于 2024-10-2 20:02:30

这个好用回头我也搞一个来试一试,,,
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-2 20:49:32

kk——k 发表于 2024-10-2 20:02
这个好用回头我也搞一个来试一试,,,

谢谢鼓励哦,用起来还不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail