diff --git a/Firmware/MotorControl/encoder.cpp b/Firmware/MotorControl/encoder.cpp index 9b964f21..9b3acdec 100644 --- a/Firmware/MotorControl/encoder.cpp +++ b/Firmware/MotorControl/encoder.cpp @@ -277,6 +277,20 @@ bool Encoder::update() { } } } break; + + case MODE_SINCOS: { + float c = get_adc_voltage(GPIO_3_GPIO_Port, GPIO_3_Pin) / 3.3f; + float s = get_adc_voltage(GPIO_4_GPIO_Port, GPIO_4_Pin) / 3.3f; + + float phase = fast_atan2(s, c); + int fake_count = (int)(1000.0f * phase); + //CPR = 6283 = 2pi * 1k + + delta_enc = fake_count - count_in_cpr_; + delta_enc = mod(delta_enc, 6283); + if (delta_enc > 6283/2) + delta_enc -= 6283; + } break; default: { set_error(ERROR_UNSUPPORTED_ENCODER_MODE); diff --git a/Firmware/MotorControl/encoder.hpp b/Firmware/MotorControl/encoder.hpp index 96e1a914..d8d279b1 100644 --- a/Firmware/MotorControl/encoder.hpp +++ b/Firmware/MotorControl/encoder.hpp @@ -19,7 +19,8 @@ public: enum Mode_t { MODE_INCREMENTAL, - MODE_HALL + MODE_HALL, + MODE_SINCOS }; struct Config_t {