利用MT6826S磁编码器获得角度数据和速度数据

MT6826S磁编码器:高精度与强抗干扰的工业级解决方案 本文深入解析了MT6826S磁编码器作为工业级高精度旋转位置传感器的核心优势。文章详细阐述了其14位分辨率、强抗干扰设计(基于TMR和差分信号)以及SPI/ABZ双接口的灵活性,并提供了在BLDC电机FOC控制、机器人关节等场景的实战应用与硬件设计指南,是应对恶劣工业环境的可靠解决方案。 阅读详情
AI摘要

本文分享基于Arduino利用MT6826S磁编码器获取角度和速度数据的方法。该编码器连接直流无刷电机,支持SPI、ABZ通信,选用SPI通信。文中给出代码实现,包括初始化、读取角度、计算速度等功能,实测可获得以弧度表示的角度和速度数据。

网上有很基于PT32的,我这里借鉴他的代码,实现基于arduino下的,烧录到ESP32验证可行。

MT6826S编码器,是MagnTek 麦歌恩公司的一款磁编码器。

这是直接连接到了直流无刷电机上

支持SPI,ABZ通信,这里选择SPI通信。但是千万要注意,编码器的正反面丝印刚好相反,你接那边,就那边的丝印,否则刚好电源引脚是反的,接上ESP32后,发热,可能烧掉ESP32。其他4根线按丝印接上就行。

好,废话不多说,直接上代码:

#include <SPI.h>
#include <math.h>  // Include the math library to use PI

#define READANGLECOMMAND 0xA000
#define READCOMMAND 0x3000
#define WRITECOMMAND 0x6000     
#define TOEEPROMCOMMAND 0xC000
#define WRITEZEROCOMMAND 0x5000     

#define CS_PIN 5  // Define the Chip Select pin

uint16_t RBuf[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
unsigned int Angle = 0;
uint32_t AngleIn21bits = 0;
uint8_t Spi_TxData[4] = {0x83, 0xff, 0xff, 0xff};
uint8_t Spi_pRxData[4] = {0};

// Variables to store previous angle and time for speed calculation
float previousAngle = 0.0;
unsigned long previousTime = 0;

void setup() {
    Serial.begin(115200);           // Initialize UART communication
    SPI.begin();                  // Initialize SPI
    pinMode(CS_PIN, OUTPUT);      // Set the CS pin as output
    digitalWrite(CS_PIN, HIGH);   // Set CS pin high (idle)
}

uint8_t SPI_transfer(uint8_t data) {
    return SPI.transfer(data);
}

// Function to read the angle from the encoder in radians
float ReadAngle() {
    uint32_t register03 = 0, register04 = 0, register05 = 0;
    uint32_t angle = 0;
    uint8_t pTxData[3] = {0, 0, 0}, pRxData[3] = {0, 0, 0};    
    uint16_t reg_addr = 0;

    digitalWrite(CS_PIN, LOW);  // Set CS pin low to start communication

    // Read register 03
    reg_addr = 0x03;
    reg_addr = ((reg_addr & 0x0FFF) | READCOMMAND);
    pTxData[0] = (uint8_t)(reg_addr >> 8);
    pTxData[1] = (uint8_t)(reg_addr >> 0);
    SPI.transfer(pTxData[0]);
    SPI.transfer(pTxData[1]);
    register03 = SPI.transfer(0x00);

    // Read register 04
    reg_addr = 0x04;
    reg_addr = ((reg_addr & 0x0FFF) | READCOMMAND);
    pTxData[0] = (uint8_t)(reg_addr >> 8);
    pTxData[1] = (uint8_t)(reg_addr >> 0);
    SPI.transfer(pTxData[0]);
    SPI.transfer(pTxData[1]);
    register04 = SPI.transfer(0x00);

    // Read register 05
    reg_addr = 0x05;
    reg_addr = ((reg_addr & 0x0FFF) | READCOMMAND);
    pTxData[0] = (uint8_t)(reg_addr >> 8);
    pTxData[1] = (uint8_t)(reg_addr >> 0);
    SPI.transfer(pTxData[0]);
    SPI.transfer(pTxData[1]);
    register05 = SPI.transfer(0x00);

    digitalWrite(CS_PIN, HIGH);  // Set CS pin high to end communication

    angle = ((register03 << 16) | (register04 << 8) | (register05));
    angle >>= 3;  // Adjust the resolution to fit

    float angleInDegrees = angle * 360.0 / 2097152;  // Convert to degrees
    float angleInRadians = angleInDegrees * PI / 180.0;  // Convert degrees to radians
    return angleInRadians;
}

// Function to calculate speed (radians per second)
float CalculateSpeed(float currentAngle, unsigned long currentTime) {
    float angleDifference = currentAngle - previousAngle;
    unsigned long timeDifference = currentTime - previousTime;

    // Handle angle wrap-around for radians (2 * PI is the full rotation in radians)
    if (angleDifference < -PI) {
        angleDifference += 2 * PI;
    } else if (angleDifference > PI) {
        angleDifference -= 2 * PI;
    }

    // Calculate speed in radians per second
    float speed = (angleDifference * 1000.0) / timeDifference;  // timeDifference is in milliseconds, convert to seconds

    // Update previous values for the next calculation
    previousAngle = currentAngle;
    previousTime = currentTime;

    return speed;
}

void loop() {
    // Get the current time
    unsigned long currentTime = millis();

    // Read the current angle in radians
    float currentAngle = ReadAngle();

    // Calculate speed in radians per second
    float speed = CalculateSpeed(currentAngle, currentTime);

    // Print angle and speed
    Serial.print("Angle: ");
    Serial.print(currentAngle, 4);  // Print angle in radians
    Serial.print(" radians, Speed: ");
    Serial.print(speed, 4);  // Print speed in radians per second
    Serial.println(" radians/second");

    delay(200);  // Delay for 200 milliseconds between readings
}

实测,可以获得以弧度表示的角度数据,和速度数据。

磁编码器新标杆:MT6826S——高精度、强抗干扰的旋转位置传感器 摘要: MT6826S磁编码器凭借14-bit高分辨率、SPI/ABZ双接口和强抗干扰能力,成为电机控制、机器人关节等领域的优选方案。其采用TMR技术,灵敏度较传统方案提升10倍,支持-40℃~125℃工业级环境,兼容3.3V-5.5V供电。硬件设计需注意磁铁气隙(0.5~2.0mm)和PCB布局优化。相比竞品,MT6826S性价比突出,适用于国产化替代,助力工业4.0高精度位置检测需求。 阅读详情

相关推荐

15bit磁编码器 MT6826S 麦歌恩 &澎湃微 PT32L007F8P7K SPI通讯测试源代码分享

MT6826S PT32L007 磁编码器

weixin_44828904的博客 2167

磁编码器使用指南以及磁铁选型

磁编码器使用指南以及磁铁选型

PT32F030和MT6826S SPI通讯例程参考!

PT32F030 MT6826S SPI

weixin_44828904的博客 894

10位磁旋转编码器

旋转编码器简介:旋转编码器是用来测量转速的装置,光电式旋转编码器通过光电转换,可将输出轴的角位移、角速度等机械量转换成相应的电脉冲以数字量输出(REP)。它分为单路输出和双路输出两种。技术参数主要有每转脉冲数(几十个到几千个都有),和供电电压等。单路输出是指旋转编码器的输出是一组脉冲,而双路输出的旋转编码器输出两组A/B相位差90度的脉冲,通过这两组脉冲不仅可以测量转速,还可以判断旋转的方向。

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 676

MT6826S磁编码器SPI通信避坑指南:从数据手册到Arduino代码实现的完整解析

本文深入解析MT6826S磁编码器的SPI通信机制,从硬件接口设计到寄存器操作,再到工业级应用实践。详细介绍了角度数据获取、速度计算算法优化以及抗干扰措施,帮助开发者避免常见问题并提升系统稳定性。适用于工业自动化、机器人控制等高精度运动控制场景。

weixin_30832143的博客 147

MT6826S 磁编码器 SPI 读取实战:从数据手册到稳定 Arduino 代码

在电机控制、云台稳定和机械臂关节反馈中,获取准确的绝对角度是闭环控制的基础。磁编码器因其抗污染、易安装的特性,成为替代光电编码器的高性价比方案,而 SPI 接口则提供了高速、可靠的数字通信路径。理解 SPI 通信的时序原理、片选信号管理以及数据帧的位定义,是确保角度数据真实有效的关键。MT6826S 作为一颗 14 位磁编码器,凭借较高的分辨率与简洁的读取协议,在 Arduino、ESP32、STM32 等平台上均有良好适用性。本文从编码器选型逻辑出发,结合实际工程中遇到的时序与校验问题,提供一套完整的代码

weixin_29182481的博客 66

ESP32+MT6826S磁编码器实战:手把手教你读取电机角度与速度(附完整Arduino代码)

本文详细介绍了如何使用ESP32与MT6826S磁编码器实现电机角度与速度的高精度测量。从硬件连接到SPI通信配置,再到角度数据读取算法和速度计算优化,提供了完整的Arduino代码实现。特别适合机器人控制、工业自动化等需要精密位置反馈的应用场景。

weixin_30919429的博客 497

DIY智能小车/云台?用MT6826S磁编码器+ESP32实现高精度电机位置环(PID控制入门)

本文详细介绍了如何利用MT6826S磁编码器和ESP32实现高精度电机位置环控制,适用于DIY智能小车和云台项目。通过SPI接口读取角度数据,结合PID算法实现闭环控制,提升系统动态响应和稳态精度。文章包含硬件连接、寄存器配置、速度计算优化及PID调参等实用技巧,帮助开发者快速入门电机控制。

weixin_30642561的博客 388

基于ESP32与MT6826S磁编码器实现高精度角度与速度采集

本文详细介绍了基于ESP32与MT6826S磁编码器实现高精度角度与速度采集的完整方案。从硬件连接注意事项、SPI通信协议解析到角度数据处理与速度计算优化,提供了实用的技术细节和代码示例,帮助开发者快速实现精准数据采集,适用于无人机电调控制等应用场景。

weixin_33730836的博客 509

ESP32驱动MT6826S磁编码器:从接线防烧到实时速度计算(附完整Arduino库)

本文详细介绍了如何使用ESP32驱动MT6826S磁编码器,涵盖从安全接线到实时速度计算的全过程。重点解析了SPI接口的优化连接方案、软件架构设计及速度计算算法优化,帮助开发者避免常见硬件损坏风险并提升数据采集精度。附赠完整Arduino库实现,适用于机器人控制、无人机稳定等场景。

weixin_29189003的博客 481

MT6826传感器✨

纳芯微MT6826传感器以“精准感知+坚韧可靠”的双重基因,成为工业智能化升级的核心驱动力。

2501_93066786的博客 549

PT32F030与MT6826S SPI通讯实战:从硬件连接到数据交互全流程解析

本文详细解析了PT32F030与MT6826S通过SPI通讯的全流程,包括硬件连接、电路设计、SPI外设初始化配置以及数据交互协议实现。通过实战案例和代码示例,帮助开发者快速掌握PT32F030与MT6826S的SPI通讯技术,实现精准的角度和速度数据采集。

weixin_29189373的博客 420

STM32基本通识

STM32是意法半导体公司(STMicroelectronics)开发的32位微控制器。STM32系列微控制器由于其高性价比、多样化产品线和简便的库开发方式,在32位控制器市场中脱颖而出,广受工程师和市场的青睐。

落魄书生的职业学习生涯 11万+

基于ESP32与MT6826S磁编码器实现高精度电机运动状态监测

本文详细介绍了基于ESP32与MT6826S磁编码器实现高精度电机运动状态监测的硬件连接、SPI通信协议解析及数据处理技巧。通过优化角度和速度计算算法,结合三重滤波机制,显著提升监测精度与实时性,适用于工业级电机控制应用。

weixin_29186249的博客 236

MT6826S磁编码器与PT32F030的SPI通讯优化:提升数据传输效率的5个技巧

本文详细介绍了MT6826S磁编码器与PT32F030微控制器通过SPI接口进行高效数据传输的5个优化技巧。从SPI时钟配置、双缓冲DMA传输架构到数据包格式优化,这些方法能显著提升通讯效率,适用于需要高精度和快速响应的嵌入式系统开发。

agile9scrum的博客 753

为什么工业机器人都在换装MT6826S?深度解析磁编码器的5大落地优势

本文深度解析了MT6826S磁编码器在工业机器人中的5大落地优势,包括高精度、抗干扰、安装便利性等。通过TMR技术,MT6826S在信噪比、温度稳定性和功耗方面表现卓越,成为工业自动化升级的首选。

k0l1m2n3o的博客 1055

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 173
下一篇: 基于simplefoc库和ESP32实现双电机驱动
M创动工坊
博客等级 码龄19年 72粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M创动工坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值