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