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 群已满根据提示添加新群 (入群申请写:CSDN)


请继续阅读相关文章:
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和力矩反馈

  • 12
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ABZ编码器的读取通常需要使用控制器的中断或计时器功能来实现。以下是一个基于Arduino平台的ABZ编码器代码示例: ```c++ const int encoderA = 2; // 编码器A信号输入引脚 const int encoderB = 3; // 编码器B信号输入引脚 const int encoderZ = 4; // 编码器Z信号输入引脚 volatile long encoderCount = 0; // 编码器计数器 volatile bool encoderASet = false; // 编码器A信号状态 volatile bool encoderBSet = false; // 编码器B信号状态 volatile bool encoderZSet = false; // 编码器Z信号状态 void setup() { pinMode(encoderA, INPUT_PULLUP); pinMode(encoderB, INPUT_PULLUP); pinMode(encoderZ, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(encoderA), doEncoderA, CHANGE); attachInterrupt(digitalPinToInterrupt(encoderB), doEncoderB, CHANGE); attachInterrupt(digitalPinToInterrupt(encoderZ), doEncoderZ, FALLING); Serial.begin(9600); } void loop() { // do something } void doEncoderA() { encoderASet = digitalRead(encoderA); encoderBSet = digitalRead(encoderB); if (encoderASet == HIGH) { if (encoderBSet == LOW) { encoderCount--; } else { encoderCount++; } } else { if (encoderBSet == LOW) { encoderCount++; } else { encoderCount--; } } } void doEncoderB() { encoderASet = digitalRead(encoderA); encoderBSet = digitalRead(encoderB); if (encoderBSet == HIGH) { if (encoderASet == LOW) { encoderCount++; } else { encoderCount--; } } else { if (encoderASet == LOW) { encoderCount--; } else { encoderCount++; } } } void doEncoderZ() { encoderCount = 0; encoderZSet = true; } ``` 这段代码使用了Arduino的attachInterrupt函数将编码器的A、B、Z信号连接到对应的中断服务程序上。在中断服务程序中,根据A、B信号的相位变化,更新编码器的计数器。当检测到Z信号时,清空计数器,实现从零点位置开始的角度测量。 需要注意的是,ABZ编码器的读取方法可能因具体编码器型号和控制器硬件不同而有所差别。在使用前需要仔细阅读编码器和控制器的说明书,以确保正确连接和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值