SimpleFOC之ESP32(八)—— ABZ编码器电机



SimpleFOC教程目录:请点击

一、增量式编码器介绍

  • ABZ或者ABI,叫法不同但都是指 增量式编码器;
  • ABZ编码器最初是光电式的,近几年随着磁编码器的兴起,磁编码器上也增加了ABZ信号的输出;
  • A、B两相相差90度,可通过比较A相在前还是B相在前,以判断编码器的正转与反转,通过零位脉冲,可获得编码器的零位参考位。
    在这里插入图片描述
  • 一般采用四倍频技术,比如500线的编码器,转一圈可以获得2000个脉冲信号,
    在这里插入图片描述

二、ESP32drive控制霍尔电机

2.1、原理图

在这里插入图片描述

2.2、读编码器获取角度

2.2.1、硬件准备

序号名称数量
1USB转串口1
2ESP32drive1
3带增量编码器电机1
412V电源1
5杜邦线若干

在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

2.2.2、硬件连接

在这里插入图片描述

2.2.3、代码演示

  • 2.2.3.1、打开示例
    在这里插入图片描述
  • 2.2.3.2、修改代码
    在这里插入图片描述

2.2.4、观察角度输出

  • 如果编码器的CPR设置正确,转动电机一圈,角度输出刚好是6.28 rad,
    在这里插入图片描述

2.3、控制电机

2.3.1、硬件连接

在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

2.3.2、代码演示

  • 打开示例
    在这里插入图片描述
  • 修改代码
    在这里插入图片描述
    在这里插入图片描述

2.3.3、观察电机运行

  • 性能和SPI接口差不多,
  • AS5047P和TLE5012B都经过了测试,TLE5012B的最大转速没有AS5047P的高,大概是因为TLE5012B的CPR比AS5047P大,导致进入中断的频率高,影响了单片机的处理速度。
    在这里插入图片描述

三、ESP32drive-D控制电机

3.1、原理图

在这里插入图片描述

3.2、硬件连接

序号名称数量
1USB转串口1
2ESP32drive-D1
3带编码器电机2
412V电源1
5杜邦线若干

在这里插入图片描述
在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

3.3、控制单个电机

  • 代码在上面的ESP32drive的基础上修改,只需改动驱动引脚配置,
    在这里插入图片描述

3.4、控制双电机

3.4.1、打开示例

在这里插入图片描述

3.4.2、修改代码

在这里插入图片描述

3.4.3、观察电机运行

在这里插入图片描述

3.4.4、双电机控制出现的问题

  • 电机初始化一切正常,发送指令,电机转动也正常,但会逐渐失控,表现为转速越来越快,或者突然堵转。

问题总结分析

  • 单电机控制都正常,双电机控制不行,
  • 霍尔电机和ABZ编码器的处理方式都是利用引脚中断,在信号没有硬件和软件滤波的情况下,出现问题是正常的。
  • 目前只能学习演示,等待创作者升级。



(完)


欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:优快云)


请继续阅读相关文章:
SimpleFOC之ESP32(一)—— 搭建开发环境
SimpleFOC之ESP32(二)—— 开环控制
SimpleFOC之ESP32(三)—— 闭环控制
SimpleFOC之ESP32(四)—— 电流闭环控制Inline
SimpleFOC之ESP32(五)—— 电流闭环控制Lowside
SimpleFOC之ESP32(六)—— 双电机控制
SimpleFOC之ESP32(七)—— 霍尔电机
SimpleFOC之ESP32(八)—— ABZ编码器电机
SimpleFOC之ESP32(九)—— WIFI、UDP和TCP
SimpleFOC之ESP32(十)—— ESP-NOW和力矩反馈

<think> 首先,用户的问题是:“我想查找使用esp32进行光电编码器测速的相关信息 请问esp32实现光电编码器测速的方法和技术”。基于提供的引用,我需要参考[^1]和[^2]。 关键点从引用中提取: - [^1]:光电编码器的工作原理:通过光电转换将机械位移转换成脉冲。它由光源、光码盘和光敏元件组成。光码盘上有长方形孔,随电机旋转,输出脉冲信号。计算每秒脉冲数反映转速。AB相用于判断旋转方向,相位差90度。 - [^2]:比较光电编码器和霍尔编码器。光电编码器在恶劣环境下可能无法使用,体积大,精度不高(因为码盘不能太细),但不受磁场影响。霍尔编码器可能受磁场影响,但可以用磁屏蔽。 用户需求是使用ESP32进行光电编码器测速的方法和技术。所以,我需要专注于如何用ESP32实现这一点。 ESP32是一个微控制器,常用于嵌入式系统。用户提到ESP32-Arduino,所以我应该基于Arduino框架提供代码示例。 系统级指令: - 所有行内数学表达式用$...$,例如 $x^2$。 - 独立公式用$$...$$单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,例如[^1]。 - 回答结构清晰,逐步解决问题。 - 确保真实可靠。 结构回复: 1. **介绍光电编码器测速原理**:简要解释基于引用[^1]。 2. **ESP32实现方法**:讨论如何使用ESP32读取编码器信号(比如AB相),计算转速。 3. **代码示例**:提供Arduino代码,展示如何连接编码器和读取脉冲。 4. **技术细节**:讨论中断处理、计数方法、方向判断等。 5. **优化和注意事项**:基于引用[^2],提到环境因素如磁场影响。 6. **生成相关问题**:结束时添加相关问题。 确保回答可靠:我从引用中提取信息,并结合一般知识(例如ESP32编程)。如果引用不足,补充常识。 添加引用标识:在相关段落末尾加[^1]或[^2]。 数学表达式:如果涉及计算转速,可能有公式。 转速计算:如果每秒脉冲数为P,每个脉冲对应位移,那么转速$v = \frac{P}{k}$,其中k是常数(如每圈脉冲数)。 在独立公式中使用$$...$$。 步骤: 1. 解释原理:光电编码器输出脉冲,ESP32捕获脉冲计数。 2. 连接方式:描述如何将编码器的A相和B相连接到ESP32的GPIO引脚。 3. 编程方法:使用中断检测脉冲边沿,计数器增减判断方向。 4. 计算转速:每秒读取计数器值或使用定时器。 5. 代码示例:提供简单Arduino代码。 6. 注意事项:讨论精度、环境影响等。 相关问题:结束时生成几个问题,如“如何提高测速精度?”或“在恶劣环境下的替代方案?” 最终回复结构: - 开头:直接回答问题。 - 主体:分步骤解释方法。 - 结尾:相关问题。 </think> ### ESP32实现光电编码器测速的方法和技术 基于您提供的引用资料[^1][^2],光电编码器是一种通过光电转换将旋转位移转换为脉冲信号的传感器(如AB相输出),常用于电机转速测量。在ESP32平台上,结合Arduino框架,实现测速的核心是捕获编码器脉冲信号、计数脉冲并计算转速。下面我将逐步解释方法和技术,确保结构清晰,便于您理解和实施。整个过程分为工作原理、硬件连接、软件编程、转速计算和优化注意事项几个部分。 #### 1. 光电编码器测速工作原理 光电编码器的工作原理基于光码盘随电机旋转时,光敏元件检测孔洞变化输出脉冲。AB相输出相位差90度的信号,用于判断旋转方向(例如A相领先B相表示正转,反之反转)。计算单位时间内的脉冲数即可推导转速。 转速公式为: $$v = \frac{P}{N \times t}$$ 其中: - $v$ 是转速(单位:转/秒或RPM), - $P$ 是时间 $t$ 内捕获的脉冲总数, - $N$ 是编码器的分辨率(每转脉冲数,PPR), - $t$ 是采样时间(单位:秒)。 例如,如果编码器PPR=1000,t=1秒内捕获2000脉冲,则 $v = \frac{2000}{1000 \times 1} = 2$ 转/秒[^1]。 方向判断通过AB相信号的相位关系实现:当A相上升沿时,检查B相电平(高为正转,低为反转)。 #### 2. ESP32硬件连接 将光电编码器连接到ESP32时,需处理AB相信号: - **引脚连接**: - 编码器A相输出接ESP32的GPIO引脚(支持中断的引脚,如GPIO4)。 - 编码器B相输出接另一个GPIO引脚(如GPIO5)。 - 编码器电源(VCC和GND)接ESP32的3.3V和GND(确保电压匹配,ESP32通常为3.3V逻辑)。 - **硬件注意事项**: - 使用上拉电阻(10kΩ)确保信号稳定,避免噪声干扰(光电编码器易受环境光影响)。 - 如果编码器输出电平不兼容(如5V),需添加电平转换电路(例如分压电阻)。 - 参考引用[^2],光电编码器在恶劣环境(如灰尘、湿度)下可靠性较低,安装时应避免强光直射和机械振动。 #### 3. 软件编程方法(基于Arduino框架) ESP32使用Arduino IDE编程,核心是利用中断捕获脉冲边沿变化,并计数脉冲。以下是关键步骤: - **初始化设置**: 配置GPIO引脚为输入模式,并使能中断。选择支持中断的引脚(如ESP32多数GPIO支持外部中断)。 - **中断处理**: 使用`attachInterrupt()`函数检测A相信号边沿(上升沿或下降沿),在中断服务程序(ISR)中计数脉冲并判断方向(基于B相信号)。 例如,A相上升沿时读取B相电平:B=高电平表示正转(计数+1),B=低电平表示反转(计数-1)。 - **计数器和定时器**: 使用ESP32的硬件计数器(如`pcnt`外设)或软件变量存储脉冲计数。结合定时器中断(例如`hw_timer_init()`)定期采样计数并计算转速。 - **转速计算**: 在定时器中断中读取脉冲计数,应用转速公式计算。输出转速可转换为RPM(转/每分钟)或其他单位。 以下是一个简化Arduino代码示例,实现基本测速功能: ```cpp // 定义引脚 #define ENCODER_A_PIN 4 // A相引脚 #define ENCODER_B_PIN 5 // B相引脚 volatile long pulseCount = 0; // 中断中更新的脉冲计数变量 int encoderPPR = 1000; // 编码器分辨率,根据实际值修改(PPR) unsigned long lastTime = 0; // 上次采样时间 float currentRPM = 0; // 计算的当前转速(RPM) // 中断服务函数:处理A相边沿变化 void IRAM_ATTR handleEncoder() { int aState = digitalRead(ENCODER_A_PIN); int bState = digitalRead(ENCODER_B_PIN); if (aState == HIGH) { if (bState == HIGH) { pulseCount++; // 正转 } else { pulseCount--; // 反转 } } } void setup() { Serial.begin(115200); pinMode(ENCODER_A_PIN, INPUT_PULLUP); // 启用上拉电阻 pinMode(ENCODER_B_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(ENCODER_A_PIN), handleEncoder, RISING); // 检测A相上升沿中断 lastTime = millis(); // 初始化时间 } void loop() { unsigned long currentTime = millis(); unsigned long elapsedTime = currentTime - lastTime; // 采样间隔(毫秒) if (elapsedTime >= 1000) { // 每秒采样一次 noInterrupts(); // 禁用中断避免数据竞争 long currentPulse = pulseCount; pulseCount = 0; // 重置计数 interrupts(); // 启用中断 // 计算转速(转为RPM):v = (P / (N * t)) * 60,其中t以秒为单位 float timeSec = elapsedTime / 1000.0; currentRPM = (currentPulse / (encoderPPR * timeSec)) * 60.0; Serial.print("当前转速: "); Serial.print(currentRPM); Serial.println(" RPM"); lastTime = currentTime; // 更新时间 } } ``` 说明: - 此代码使用A相上升沿中断计数,采样间隔1秒计算转速。您可根据需要调整采样时间(如更短的间隔以提高响应速度)。 - `volatile`关键字确保中断中变量安全访问。 - 实际应用中,优化中断处理避免延迟(ISR应尽量简短)。 #### 4. 技术细节和优化注意事项 - **精度提升**: - 增加采样频率:使用ESP32的硬件定时器(如`hw_timer_t`)实现微秒级采样,减少计算误差。 - 滤波处理:添加软件滤波器(如移动平均)减少噪声干扰(光电编码器易受环境光变化影响)[^2]。 - 高分辨率计数:利用ESP32的`PCNT`(脉冲计数外设)替代软件计数,支持更高频率(可达80MHz),避免遗漏脉冲。 - **方向判断优化**: 基于AB相相位差90度,可检测更多边沿(如上升和下降沿)提高分辨率(4倍频计数),公式为: $$P_{\text{effective}} = P \times 4$$ 其中 $P_{\text{effective}}$ 是有效脉冲数,提高测速精度[^1]。 - **环境影响**: 光电编码器在磁场环境下稳定(不受磁场干扰),但在灰尘、潮湿或强光环境下可能出现误触发。建议添加光学屏蔽或使用防水外壳。作为替代,霍尔编码器更适合恶劣环境,但需磁屏蔽处理[^2]。 - **ESP32特定优势**: ESP32双核处理能力允许实时任务(如中断处理)在核心0运行,主循环在核心1运行,提升系统响应。同时,ESP32的低功耗模式可用于电池供电场景。 #### 5. 常见问题解决 - **信号抖动**:如果测速不稳定,检查硬件接线(缩短线缆长度),并添加RC滤波电路。 - **转速误差**:确保编码器PPR值与代码一致,校准采样时间。 - **代码性能**:避免在ISR中进行耗时操作(如串口打印),改用标志位在主循环处理。 - **扩展功能**:结合Wi-Fi/蓝牙(ESP32内置)实现远程监控,例如将转速数据发送到手机App。 通过以上方法,您可在ESP32上高效实现光电编码器测速。实际项目中,建议根据编码器规格(PPR值)和环境测试调整参数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值