0.3.8 AS5600

This commit is contained in:
Rob Tillaart 2023-06-27 13:34:28 +02:00
parent a312d56a0d
commit 431dad0b17
8 changed files with 330 additions and 13 deletions

View File

@ -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
@ -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);
// }

View File

@ -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
@ -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;

View File

@ -5,6 +5,13 @@ 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.
@ -12,7 +19,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- 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()**.

View File

@ -97,6 +97,12 @@ Examples are added to show how to use this pin with **setOutputMode()**.
See more in the sections Analog OUT and PWM OUT below.
##### Note: (From Zipdox2 - See issue #36)
Some AS5600 modules seem to have a resistor between **PGO** and **GND**.
This causes the AS5600 to disable the output (to use it for programming, see datasheet).
This resistor needs to be removed to use the **OUT** pin.
#### PGO pin
Not tested. ==> Read the datasheet!
@ -388,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**

View File

@ -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 --

View File

@ -0,0 +1,114 @@
//
// FILE: AS5600_burn_zpos.ino
// AUTHOR: Rob Tillaart
// PURPOSE: demo (not tested yet - see issue #38)
// DATE: 2023-06-18
// WARNING
// As burning the angle can only be done three times 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 burnAngle() in AS5600.h and AS5600.cpp.
// - adjust settings and MaxAngle in burn_zpos() function below ==> line 77++
// - uncomment line 105 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 zpos? [Y for Yes]");
while (!Serial.available());
char c = Serial.read();
if (c == 'Y')
{
burn_zpos();
}
Serial.println("\nDone..");
}
void loop()
{
}
void burn_zpos()
{
// ADJUST ZPOS
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(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 ...");
delay(1000);
// uncomment next line
// as5600.burnAngle();
Serial.println(" done.");
Serial.println("Reboot AS5600 to use the new settings.");
}
// -- END OF FILE --

View File

@ -15,7 +15,7 @@
"type": "git",
"url": "https://github.com/RobTillaart/AS5600.git"
},
"version": "0.3.7",
"version": "0.3.8",
"license": "MIT",
"frameworks": "arduino",
"platforms": "*",

View File

@ -1,5 +1,5 @@
name=AS5600
version=0.3.7
version=0.3.8
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino library for AS5600 and AS5600L magnetic rotation meter.