From 46f690ef22ec933652b0d0c9ef103bada3637c79 Mon Sep 17 00:00:00 2001 From: Joseph Duchesne Date: Fri, 9 Sep 2022 14:13:08 -0400 Subject: [PATCH 1/2] Added CPR configuration option to SC60228 The SC60228 encoders that I have are reporting 2048 ticks rather than the expected 4096. This is probably an SPI register setting, but I can't find documentation on the chip's register map. --- src/encoders/sc60228/MagneticSensorSC60228.cpp | 4 ++-- src/encoders/sc60228/MagneticSensorSC60228.h | 3 ++- src/encoders/sc60228/SC60228.h | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/encoders/sc60228/MagneticSensorSC60228.cpp b/src/encoders/sc60228/MagneticSensorSC60228.cpp index f68a8c5..aed39cc 100644 --- a/src/encoders/sc60228/MagneticSensorSC60228.cpp +++ b/src/encoders/sc60228/MagneticSensorSC60228.cpp @@ -3,7 +3,7 @@ #include "common/foc_utils.h" #include "common/time_utils.h" -MagneticSensorSC60228::MagneticSensorSC60228(int nCS, SPISettings settings) : SC60228(settings, nCS){ +MagneticSensorSC60228::MagneticSensorSC60228(int nCS, uint32_t cpr, SPISettings settings) : SC60228(settings, nCS), cpr_(cpr){ // nix }; MagneticSensorSC60228::~MagneticSensorSC60228(){ }; @@ -12,7 +12,7 @@ MagneticSensorSC60228::~MagneticSensorSC60228(){ }; float MagneticSensorSC60228::getSensorAngle(){ SC60228Angle angle_data = readRawAngle(); - float result = ( angle_data.angle / (float)SC60228_CPR ) * _2PI; + float result = ( angle_data.angle / (float)cpr_ ) * _2PI; return result; }; diff --git a/src/encoders/sc60228/MagneticSensorSC60228.h b/src/encoders/sc60228/MagneticSensorSC60228.h index 7720182..e51c942 100644 --- a/src/encoders/sc60228/MagneticSensorSC60228.h +++ b/src/encoders/sc60228/MagneticSensorSC60228.h @@ -8,12 +8,13 @@ class MagneticSensorSC60228 : public Sensor, public SC60228 { public: - MagneticSensorSC60228(int nCS = -1, SPISettings settings = SC60228SPISettings); + MagneticSensorSC60228(int nCS = -1, uint32_t cpr=4096, SPISettings settings = SC60228SPISettings); virtual ~MagneticSensorSC60228(); virtual float getSensorAngle() override; virtual void init(SPIClass* _spi = &SPI) override; + uint32_t cpr_; }; diff --git a/src/encoders/sc60228/SC60228.h b/src/encoders/sc60228/SC60228.h index f476102..e668727 100644 --- a/src/encoders/sc60228/SC60228.h +++ b/src/encoders/sc60228/SC60228.h @@ -18,7 +18,6 @@ typedef union { } SC60228Angle; -#define SC60228_CPR 4096 #define SC60228_BITORDER MSBFIRST static SPISettings SC60228SPISettings(8000000, SC60228_BITORDER, SPI_MODE1); // @suppress("Invalid arguments") From b349333b455546da5ffc8b27cdf1a5178c53c313 Mon Sep 17 00:00:00 2001 From: Joseph Duchesne Date: Fri, 9 Sep 2022 15:01:11 -0400 Subject: [PATCH 2/2] Updated readme example to show new configuration for sc60228 encoder --- src/encoders/sc60228/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/encoders/sc60228/README.md b/src/encoders/sc60228/README.md index e0e832d..0b3f23f 100644 --- a/src/encoders/sc60228/README.md +++ b/src/encoders/sc60228/README.md @@ -34,7 +34,10 @@ void setup() { Set some options: ```c++ -MagneticSensorSC60228 sensor1(SENSOR1_CS, mySPISettings); +// set counts_per_revolution (which should be the default 4096, but one some hardware appears to be 2048), and spi settings +MagneticSensorSC60228 sensor1(SENSOR1_CS, 4096, mySPISettings); +// or with default SPI settings, just override cpr to a non-default value +MagneticSensorSC60228 sensor1(SENSOR1_CS, 2048); ``` Use another SPI bus: