11//
22// FILE: AS56000.cpp
33// AUTHOR: Rob Tillaart
4- // VERSION: 0.2 .0
4+ // VERSION: 0.3 .0
55// PURPOSE: Arduino library for AS5600 magnetic rotation meter
66// DATE: 2022-05-28
77// URL: https://github.com/RobTillaart/AS5600
2525// define constants for configuration functions.
2626// fix conversion constants (4096 based)
2727// add get- setOffset(degrees) functions. (no radians yet)
28+ // 0.2.1 notreleased add bool return to set() functions.
29+ // update Readme (analog / PWM out)
30+ // 0.3.0 2022-07-07 fix #18 invalid mask setConfigure().
31+
2832
2933// TODO
30- // Power-up time 1 minute
34+ // Power-up time 1 minute (need HW)
3135// check Timing Characteristics
3236
3337
@@ -151,9 +155,11 @@ uint8_t AS5600::getZMCO()
151155}
152156
153157
154- void AS5600::setZPosition (uint16_t value)
158+ bool AS5600::setZPosition (uint16_t value)
155159{
156- writeReg2 (AS5600_ZPOS, value & 0x0FFF );
160+ if (value > 0x0FFF ) return false ;
161+ writeReg2 (AS5600_ZPOS, value);
162+ return true ;
157163}
158164
159165
@@ -164,9 +170,11 @@ uint16_t AS5600::getZPosition()
164170}
165171
166172
167- void AS5600::setMPosition (uint16_t value)
173+ bool AS5600::setMPosition (uint16_t value)
168174{
169- writeReg2 (AS5600_MPOS, value & 0x0FFF );
175+ if (value > 0x0FFF ) return false ;
176+ writeReg2 (AS5600_MPOS, value);
177+ return true ;
170178}
171179
172180
@@ -177,9 +185,11 @@ uint16_t AS5600::getMPosition()
177185}
178186
179187
180- void AS5600::setMaxAngle (uint16_t value)
188+ bool AS5600::setMaxAngle (uint16_t value)
181189{
182- writeReg2 (AS5600_MANG, value & 0x0FFF );
190+ if (value > 0x0FFF ) return false ;
191+ writeReg2 (AS5600_MANG, value);
192+ return true ;
183193}
184194
185195
@@ -190,111 +200,120 @@ uint16_t AS5600::getMaxAngle()
190200}
191201
192202
193- void AS5600::setConfigure (uint16_t value)
203+ bool AS5600::setConfigure (uint16_t value)
194204{
195- writeReg2 (AS5600_CONF, value & 0x2FFF );
205+ if (value > 0x3FFF ) return false ;
206+ writeReg2 (AS5600_CONF, value);
207+ return true ;
196208}
197209
198210
199211uint16_t AS5600::getConfigure ()
200212{
201- uint16_t value = readReg2 (AS5600_CONF) & 0x2FFF ;
213+ uint16_t value = readReg2 (AS5600_CONF) & 0x3FFF ;
202214 return value;
203215}
204216
205217
206218// details configure
207- void AS5600::setPowerMode (uint8_t powerMode)
219+ bool AS5600::setPowerMode (uint8_t powerMode)
208220{
209- if (powerMode > 3 ) return ;
221+ if (powerMode > 3 ) return false ;
210222 uint8_t value = readReg (AS5600_CONF + 1 );
211223 value &= ~AS5600_CONF_POWER_MODE;
212224 value |= powerMode;
213225 writeReg (AS5600_CONF + 1 , value);
226+ return true ;
214227}
215228
216229uint8_t AS5600::getPowerMode ()
217230{
218231 return readReg (AS5600_CONF + 1 ) & 0x03 ;
219232}
220233
221- void AS5600::setHysteresis (uint8_t hysteresis)
234+ bool AS5600::setHysteresis (uint8_t hysteresis)
222235{
223- if (hysteresis > 3 ) return ;
236+ if (hysteresis > 3 ) return false ;
224237 uint8_t value = readReg (AS5600_CONF + 1 );
225238 value &= ~AS5600_CONF_HYSTERESIS;
226239 value |= (hysteresis << 2 );
227240 writeReg (AS5600_CONF + 1 , value);
241+ return true ;
228242}
229243
230244uint8_t AS5600::getHysteresis ()
231245{
232246 return (readReg (AS5600_CONF + 1 ) >> 2 ) & 0x03 ;
233247}
234248
235- void AS5600::setOutputMode (uint8_t outputMode)
249+ bool AS5600::setOutputMode (uint8_t outputMode)
236250{
237- if (outputMode > 2 ) return ;
251+ if (outputMode > 2 ) return false ;
238252 uint8_t value = readReg (AS5600_CONF + 1 );
239253 value &= ~AS5600_CONF_OUTPUT_MODE;
240254 value |= (outputMode << 4 );
241255 writeReg (AS5600_CONF + 1 , value);
256+ return true ;
242257}
243258
244259uint8_t AS5600::getOutputMode ()
245260{
246261 return (readReg (AS5600_CONF + 1 ) >> 4 ) & 0x03 ;
247262}
248263
249- void AS5600::setPWMFrequency (uint8_t pwmFreq)
264+ bool AS5600::setPWMFrequency (uint8_t pwmFreq)
250265{
251- if (pwmFreq > 3 ) return ;
266+ if (pwmFreq > 3 ) return false ;
252267 uint8_t value = readReg (AS5600_CONF + 1 );
253268 value &= ~AS5600_CONF_PWM_FREQUENCY;
254269 value |= (pwmFreq << 6 );
255270 writeReg (AS5600_CONF + 1 , value);
271+ return true ;
256272}
257273
258274uint8_t AS5600::getPWMFrequency ()
259275{
260276 return (readReg (AS5600_CONF + 1 ) >> 6 ) & 0x03 ;
261277}
262278
263- void AS5600::setSlowFilter (uint8_t mask)
279+ bool AS5600::setSlowFilter (uint8_t mask)
264280{
265- if (mask > 3 ) return ;
281+ if (mask > 3 ) return false ;
266282 uint8_t value = readReg (AS5600_CONF);
267283 value &= ~AS5600_CONF_SLOW_FILTER;
268284 value |= mask;
269285 writeReg (AS5600_CONF, value);
286+ return true ;
270287}
271288
272289uint8_t AS5600::getSlowFilter ()
273290{
274291 return readReg (AS5600_CONF) & 0x03 ;
275292}
276293
277- void AS5600::setFastFilter (uint8_t mask)
294+ bool AS5600::setFastFilter (uint8_t mask)
278295{
279- if (mask > 7 ) return ;
296+ if (mask > 7 ) return false ;
280297 uint8_t value = readReg (AS5600_CONF);
281298 value &= ~AS5600_CONF_FAST_FILTER;
282299 value |= (mask << 2 );
283300 writeReg (AS5600_CONF, value);
301+ return true ;
284302}
285303
286304uint8_t AS5600::getFastFilter ()
287305{
288306 return (readReg (AS5600_CONF) >> 2 ) & 0x07 ;
289307}
290308
291- void AS5600::setWatchDog (uint8_t mask)
309+ bool AS5600::setWatchDog (uint8_t mask)
292310{
293- if (mask > 1 ) return ;
311+ if (mask > 1 ) return false ;
294312 uint8_t value = readReg (AS5600_CONF);
295313 value &= ~AS5600_CONF_WATCH_DOG;
296314 value |= (mask << 5 );
297315 writeReg (AS5600_CONF, value);
316+ return true ;
298317}
299318
300319uint8_t AS5600::getWatchDog ()
@@ -324,7 +343,7 @@ uint16_t AS5600::readAngle()
324343{
325344 uint16_t value = readReg2 (AS5600_ANGLE) & 0x0FFF ;
326345 if (_offset > 0 ) value = (value + _offset) & 0x0FFF ;
327-
346+
328347 if ((_directionPin == 255 ) && (_direction == AS5600_COUNTERCLOCK_WISE))
329348 {
330349 value = (4096 - value) & 4095 ;
@@ -333,18 +352,18 @@ uint16_t AS5600::readAngle()
333352}
334353
335354
336- void AS5600::setOffset (float degrees)
355+ bool AS5600::setOffset (float degrees)
337356{
338- bool neg = false ;
339- if (degrees < 0 )
340- {
341- neg = true ;
342- degrees = -degrees;
343- }
357+ // expect loss of precision.
358+ if (abs (degrees) > 36000 ) return false ;
359+ bool neg = (degrees < 0 );
360+ if (neg) degrees = -degrees;
361+
344362 uint16_t offset = round (degrees * (4096 / 360.0 ));
345363 offset &= 4095 ;
346364 if (neg) offset = 4096 - offset;
347- _offset = offset;
365+ _offset = offset;
366+ return true ;
348367}
349368
350369
0 commit comments