Multi Turn Sensor 개발 관련

김종일·2024년 3월 14일

1. Arduino + AS5600 I2C로 연결하여 각 함수 기능 확인(PlatformIO)

https://github.com/RobTillaart/AS5600
"P"를 Click하면, Zero Position Setting(Max 3회까지)
"C"를 Click하면, Zero Configuration Setting(1회만)

#include <Arduino.h>
#include "AS5600.h"
AS5600 as5600;   //  use default Wire
void Zero_Position_Setting(void);
void Zero_Configuration_Setting(void);
void setup()
{
    Serial.begin(115200);
    Serial.println(__FILE__);
    Serial.print("AS5600_LIB_VERSION: ");
    Serial.println(AS5600_LIB_VERSION);
    Wire.begin(4);
    as5600.begin();  //  set direction pin.
    as5600.setDirection(AS5600_CLOCK_WISE);  //  default, just be explicit.
    if (as5600.isConnected())
    {
        Serial.println("Connected");
    }
    else
    {
        Serial.println("Failed to connect. Check wires and reboot.");
        while (1);
    }
    Serial.println(as5600.getAddress());
    as5600.setOutputMode(AS5600_OUTMODE_ANALOG_100);
    as5600.resetCumulativePosition(0);
    delay(100);
    Serial.println("\nWARNING  WARNING  WARNING  WARNING  WARNING  WARNING\n");
    Serial.println("This sketch will burn settings to your AS5600.");
    Serial.println("Adjust the settings in the sketch to your needs.");
    Serial.println("Press any key to continue.");
    Serial.println("\nWARNING  WARNING  WARNING  WARNING  WARNING  WARNING\n\n");
    while (Serial.available()) Serial.read();
    while (!Serial.available());
    Serial.read();
    while (Serial.available()) Serial.read();
    Serial.print("Are you sure to Zero Position Setting? [P for Yes]");
    while (!Serial.available());
    char c = Serial.read();
    if (c == 'P')
    {
        Zero_Position_Setting();
    }
    Serial.println("\nDone..");
    while (Serial.available()) Serial.read();
    Serial.print("Are you sure to Zero Configuration Setting? [C for Yes]");
    while (!Serial.available());
    char ch = Serial.read();
    if (ch == 'C')
    {
        Zero_Configuration_Setting();
    }
    Serial.println("\nDone..");
}
void loop()
{
    //  set initial position
    as5600.getCumulativePosition();
    Serial.print("Timer\t");
    Serial.println(millis());
    Serial.print("getCumulativePosition\t");
    Serial.println(as5600.getCumulativePosition());
    Serial.print("getRevolutions\t");
    Serial.println(as5600.getRevolutions());
    Serial.print("readAngle:\t ");
    Serial.println(as5600.readAngle());
    Serial.print("rawAngle:\t ");
    Serial.println(as5600.rawAngle() * AS5600_RAW_TO_DEGREES);
    Serial.print("readStatus:\t ");
    Serial.println(as5600.readStatus(), HEX);
    Serial.print("getConfigure:\t ");
    Serial.println(as5600.getConfigure(), HEX);
    Serial.print("readAGC:\t ");
    Serial.println(as5600.readAGC(), HEX);
    Serial.print("readMagnitude:\t ");
    Serial.println(as5600.readMagnitude(), HEX);
    Serial.print("detectMagnet:\t ");
    Serial.println(as5600.detectMagnet(), HEX);
    Serial.print("magnetTooStrong:\t ");
    Serial.println(as5600.magnetTooStrong(), HEX);
    Serial.print("magnetTooWeak:\t ");
    Serial.println(as5600.magnetTooWeak(), HEX);
    Serial.print("analogRead:\t ");
    Serial.println(analogRead(A0));
    Serial.print("getAngularSpeed:\t");
    Serial.println(as5600.getAngularSpeed(AS5600_MODE_RPM));
    Serial.print("AS5600_RAW_TO_RADIANS\t");
    Serial.println(as5600.rawAngle() * AS5600_RAW_TO_RADIANS);
    Serial.println("");
    delay(1000);
    if (as5600.getRevolutions() >= 10)
    {
        as5600.resetPosition();
    }
}
void Zero_Position_Setting()
{
    const uint16_t ZPOS = 0;
    bool OK = true;
    OK = OK && as5600.setZPosition(ZPOS);
    OK = OK && (ZPOS == as5600.getZPosition());
    if (OK == false)
    {
    Serial.println("\nERROR: in settings, burn_zpos() cancelled.");
    return;
    }
    Serial.println();
    Serial.println("burning in 5 seconds");
    delay(100);
    Serial.println("burning in 4 seconds");
    delay(100);
    Serial.println("burning in 3 seconds");
    delay(100);
    Serial.println("burning in 2 seconds");
    delay(100);
    Serial.println("burning in 1 seconds");
    delay(100);
    Serial.print("burning ...");
    delay(100);
    Serial.println(" done.");
    Serial.println("Reboot AS5600 to use the new settings.");
}
void Zero_Configuration_Setting()
{
    //  ADJUST settings
    const uint16_t POWERMODE = 0;
    const uint16_t HYSTERESIS = 0;
    const uint16_t OUTPUTMODE = 0;
    const uint16_t PWMFREQUENCY = 0;
    const uint16_t SLOWFILTER = 0;
    const uint16_t FASTFILTER = 0;
    const uint16_t WATCHDOG = 0;
    const uint16_t MAXANGLE = 0;
    bool OK = true;
    OK = OK && as5600.setPowerMode(POWERMODE);
    OK = OK && (POWERMODE == as5600.getPowerMode());
    if (OK == false)
    {
    Serial.println("ERROR: POWERMODE.");
    return;
    }
    OK = OK && as5600.setHysteresis(HYSTERESIS);
    OK = OK && (HYSTERESIS == as5600.getHysteresis());
    if (OK == false)
    {
    Serial.println("ERROR: HYSTERESIS");
    return;
    }
    OK = OK && as5600.setOutputMode(OUTPUTMODE);
    OK = OK && (OUTPUTMODE == as5600.getOutputMode());
    if (OK == false)
    {
    Serial.println("ERROR: OUTPUTMODE");
    return;
    }
    OK = OK && as5600.setPWMFrequency(PWMFREQUENCY);
    OK = OK && (PWMFREQUENCY == as5600.getPWMFrequency());
    if (OK == false)
    {
    Serial.println("ERROR: PWMFREQUENCY");
    return;
    }
    OK = OK && as5600.setSlowFilter(SLOWFILTER);
    OK = OK && (SLOWFILTER == as5600.getSlowFilter());
    if (OK == false)
    {
    Serial.println("ERROR: SLOWFILTER");
    return;
    }
    OK = OK && as5600.setFastFilter(FASTFILTER);
    OK = OK && (FASTFILTER == as5600.getFastFilter());
    if (OK == false)
    {
    Serial.println("ERROR: FASTFILTER");
    return;
    }
    OK = OK && as5600.setWatchDog(WATCHDOG);
    OK = OK && (WATCHDOG == as5600.getWatchDog());
    if (OK == false)
    {
    Serial.println("ERROR: WATCHDOG");
    return;
    }
    OK = OK && as5600.setMaxAngle(MAXANGLE);
    OK = OK && (MAXANGLE == as5600.getMaxAngle());
    if (OK == false)
    {
    Serial.println("ERROR: MAXANGLE");
    return;
    }
    Serial.println();
    Serial.println("burning in 5 seconds");
    delay(100);
    Serial.println("burning in 4 seconds");
    delay(100);
    Serial.println("burning in 3 seconds");
    delay(100);
    Serial.println("burning in 2 seconds");
    delay(100);
    Serial.println("burning in 1 seconds");
    delay(100);
    Serial.print("burning ...");
    Serial.println(" done.");
    Serial.println("Reboot AS5600 to use the new settings.");
}

2. STM32 MCU중에서 DAC를 제공하면서 핀 수가 적은 부품 검토


STM32G071 혹은 STM32G081 계열을 선택

3. STM32 + AS5600 Library

https://github.com/nicholasmorrow/AS5600
https://github.com/raulgotor/ams_as5600

profile
평생 엔지니어로....

0개의 댓글