Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Burntest #40

Merged
merged 5 commits into from
Jun 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions AS5600.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//
// FILE: AS56000.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.3.7
// VERSION: 0.3.8
// PURPOSE: Arduino library for AS5600 magnetic rotation meter
// DATE: 2022-05-28
// URL: https://github.com/RobTillaart/AS5600
Expand Down Expand Up @@ -429,9 +429,15 @@ bool AS5600::magnetTooWeak()
// }
//
//
// See https://github.com/RobTillaart/AS5600/issues/38
// void AS5600::burnSetting()
// {
// writeReg(AS5600_BURN, x0x40);
// writeReg(AS5600_BURN, 0x40);
// delay(5);
// writeReg(AS5600_BURN, 0x01);
// writeReg(AS5600_BURN, 0x11);
// writeReg(AS5600_BURN, 0x10);
// delay(5);
// }


Expand Down
4 changes: 2 additions & 2 deletions AS5600.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//
// FILE: AS5600.h
// AUTHOR: Rob Tillaart
// VERSION: 0.3.7
// VERSION: 0.3.8
// PURPOSE: Arduino library for AS5600 magnetic rotation meter
// DATE: 2022-05-28
// URL: https://github.com/RobTillaart/AS5600
Expand All @@ -12,7 +12,7 @@
#include "Wire.h"


#define AS5600_LIB_VERSION (F("0.3.7"))
#define AS5600_LIB_VERSION (F("0.3.8"))

// default addresses
const uint8_t AS5600_DEFAULT_ADDRESS = 0x36;
Expand Down
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,20 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).


## [0.3.8] - 2023-06-18
- add **void burnSetting()** improvements from #38
- use with care
- add sketches to burn settings (use with care!)
- minor edits.


## [0.3.7] - 2023-05-09
- change **getCumulativePosition()** to use **AS5600_ANGLE**
so filters can be applied.
- add **AS5600_DEGREES_TO_RAW** to constants.
- add **AS5600_SW_DIRECTION_PIN** to constants.
- minor edits.


## [0.3.6] - 2023-02-20
- add **resetCumulativePosition(int32_t position)** to completely reset the cumulative counter.
This includes the delta since last call to **getCumulativePosition()**.
Expand Down
22 changes: 16 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -394,29 +394,39 @@ Please read datasheet for details.
| 6-7 | | not used | |


## Make configuration persistent.
## Make configuration persistent. BURN

**USE AT OWN RISK**
#### Read burn count

Please read datasheet **twice** as these changes are not reversible.
- **uint8_t getZMCO()** reads back how many times the ZPOS and MPOS
registers are written to permanent memory.
You can only burn a new Angle 3 times to the AS5600, and only 2 times for the AS5600L. This function is safe as it is readonly.


#### BURN function

The burn functions are used to make settings persistent.
These burn functions are permanent, therefore they are commented in the library.
Please read datasheet twice, before uncomment them.

**USE AT OWN RISK**

Please read datasheet **twice** as these changes are not reversible.

The risk is that you make your AS5600 / AS5600L **USELESS**.

**USE AT OWN RISK**

- **uint8_t getZMCO()** reads back how many times the ZPOS and MPOS
registers are written to permanent memory.
You can only burn a new Angle 3 times to the AS5600, and only 2 times for the AS5600L.
These are the two "unsafe" functions:
- **void burnAngle()** writes the ZPOS and MPOS registers to permanent memory.
You can only burn a new Angle maximum **THREE** times to the AS5600
and **TWO** times for the AS5600L.
- **void burnSetting()** writes the MANG register to permanent memory.
You can write this only **ONE** time to the AS5600.

Some discussion about burning see issue #38
(I have no hands on experience with this functions)

**USE AT OWN RISK**


Expand Down
175 changes: 175 additions & 0 deletions examples/AS5600_burn_conf_mang/AS5600_burn_conf_mang.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
//
// FILE: AS5600_burn_conf_mang.ino
// AUTHOR: Rob Tillaart
// PURPOSE: demo (not tested yet - see issue #38)
// DATE: 2023-06-18


// WARNING
// As burning the settings can only be done once this sketch has to be used with care.
//
// You need to
// - read the datasheet so you understand what you do
// - read issue #38 to understand the discussion that lead to this sketch
// - uncomment burnSettings() in AS5600.h and AS5600.cpp.
// - adjust settings and MaxAngle in burn_mang() function below ==> line 77++
// - uncomment line 167 of this sketch


#include "AS5600.h"

#include "Wire.h"

AS5600 as5600; // use default Wire
// AS5600L as5600;


void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("AS5600_LIB_VERSION: ");
Serial.println(AS5600_LIB_VERSION);

// ESP32
// as5600.begin(14, 15);
// AVR
as5600.begin(4); // 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("\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 burn settings + maxangle? [Y for Yes]");
while (!Serial.available());
char c = Serial.read();
if (c == 'Y')
{
burn_mang();
}

Serial.println("\nDone..");
}


void loop()
{
}


void burn_mang()
{
// 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(1000);
Serial.println("burning in 4 seconds");
delay(1000);
Serial.println("burning in 3 seconds");
delay(1000);
Serial.println("burning in 2 seconds");
delay(1000);
Serial.println("burning in 1 seconds");
delay(1000);
Serial.print("burning ...");
// uncomment next line
// as5600.burnSettings();
Serial.println(" done.");
Serial.println("Reboot AS5600 to use the new settings.");
}


// -- END OF FILE --
Loading
Loading