Library for SPI communication with the AMS AS5048 rotary sensor

Dependents:   heros_leg_readout_torque_addition heros_leg_readout_torque_addition heros_leg_readout_torque_addition_V3

Committer:
megrootens
Date:
Thu Aug 25 14:34:39 2016 +0000
Revision:
5:9df31d15f3fa
Parent:
As5048.h@4:56d59ce73270
C++ Style guide: file names lower case

Who changed what in which revision?

UserRevisionLine numberNew contents of line
megrootens 0:723d48642d5c 1 #ifndef _AS5048_H_
megrootens 0:723d48642d5c 2 #define _AS5048_H_
megrootens 0:723d48642d5c 3
megrootens 0:723d48642d5c 4 #include "mbed.h"
megrootens 0:723d48642d5c 5 /**
megrootens 0:723d48642d5c 6 * Interfacing with the AMS AS5048A magnetic rotary sensor using SPI protocol
megrootens 0:723d48642d5c 7 * AS5048 uses 16-bit transfer;
megrootens 0:723d48642d5c 8 * We use two 8-bit transfers for compatibility with 8-bit SPI master devices
megrootens 0:723d48642d5c 9 * SPI protocol:
megrootens 0:723d48642d5c 10 * Mode = 1:
megrootens 0:723d48642d5c 11 * clock polarity = 0 --> clock pulse is high
megrootens 0:723d48642d5c 12 * clock phase = 1 --> sample on falling edge of clock pulse
megrootens 0:723d48642d5c 13 * Code was succesfully tested on the FRDM KL25Z and K22F. The same code fails
megrootens 0:723d48642d5c 14 * on the K64F for some reason. Sampling using a logic analyzer does however
megrootens 0:723d48642d5c 15 * show the same results for al three boards.
megrootens 0:723d48642d5c 16 */
megrootens 0:723d48642d5c 17 class As5048 {
megrootens 0:723d48642d5c 18
megrootens 3:579e12eda4e6 19
megrootens 0:723d48642d5c 20 public:
megrootens 0:723d48642d5c 21
megrootens 4:56d59ce73270 22 static const int kNumSensorBits = 14; // 14-bits sensor
megrootens 4:56d59ce73270 23 static const uint16_t kCountsPerRev = 0x4000; // 2**NUM_SENSOR_BITS
megrootens 4:56d59ce73270 24 static const uint16_t kMask = 0x3FFF; // 2**NUM_SENSOR_BITS - 1
megrootens 4:56d59ce73270 25 static const int kParity = 1; // even parity
megrootens 4:56d59ce73270 26
megrootens 4:56d59ce73270 27 static const int kSpiFrequency = 1000000; // AS5048 max 10 MHz
megrootens 4:56d59ce73270 28 static const int kSpiBitsPerTransfer = 8;
megrootens 4:56d59ce73270 29 static const int kSpiMode = 1;
megrootens 4:56d59ce73270 30
megrootens 4:56d59ce73270 31 static const float kDegPerRev = 360.0f; // 360 degrees/rev
megrootens 4:56d59ce73270 32 static const float kRadPerRev = 6.28318530718f; // 2*pi rad/rev
megrootens 4:56d59ce73270 33
megrootens 3:579e12eda4e6 34 // AS5048 flags
megrootens 3:579e12eda4e6 35 typedef enum {
megrootens 3:579e12eda4e6 36 AS_FLAG_PARITY = 0x8000,
megrootens 3:579e12eda4e6 37 AS_FLAG_READ = 0x4000,
megrootens 3:579e12eda4e6 38 } As5048Flag;
megrootens 3:579e12eda4e6 39
megrootens 3:579e12eda4e6 40 // AS5048 commands
megrootens 3:579e12eda4e6 41 typedef enum {
megrootens 3:579e12eda4e6 42 AS_CMD_NOP = 0x0000,
megrootens 3:579e12eda4e6 43 AS_CMD_ERROR = 0x0001 | AS_FLAG_READ, // Reads error register of sensor and clear error flags
megrootens 3:579e12eda4e6 44 AS_CMD_DIAGNOSTICS = 0x3FFD | AS_FLAG_READ, // Reads automatic gain control and diagnostics info
megrootens 3:579e12eda4e6 45 AS_CMD_MAGNITUDE = 0x3FFE | AS_FLAG_READ,
megrootens 3:579e12eda4e6 46 AS_CMD_ANGLE = 0x3FFF | AS_FLAG_PARITY | AS_FLAG_READ,
megrootens 3:579e12eda4e6 47 } As5048Command;
megrootens 3:579e12eda4e6 48
megrootens 3:579e12eda4e6 49 // AS5048 diagnostics
megrootens 3:579e12eda4e6 50 typedef enum {
megrootens 3:579e12eda4e6 51 AS_DIAG_CORDIC_OVERFLOW = 0x0200,
megrootens 3:579e12eda4e6 52 AS_DIAG_HIGH_MAGNETIC = 0x0400,
megrootens 3:579e12eda4e6 53 AS_DIAG_LOW_MAGNETIC = 0x0800,
megrootens 3:579e12eda4e6 54 } As5048Diagnostics;
megrootens 3:579e12eda4e6 55
megrootens 0:723d48642d5c 56 /**
megrootens 0:723d48642d5c 57 * Creates an object of num_sensors daisy chained AS5048 sensors;
megrootens 0:723d48642d5c 58 * default number of sensors in chain is 1
megrootens 0:723d48642d5c 59 * @param mosi: pinname of the mosi pin of the spi communication
megrootens 0:723d48642d5c 60 * @param miso: pinname of the miso pin of the spi communication
megrootens 0:723d48642d5c 61 * @param sck: pinname of the clock pin of the spi communication
megrootens 0:723d48642d5c 62 * @param cs: pinname of the chip select pin of the spi communication
megrootens 0:723d48642d5c 63 * @param num_sensors = 1: number of sensors in daisy chain
megrootens 0:723d48642d5c 64 */
megrootens 0:723d48642d5c 65 As5048(PinName mosi, PinName miso, PinName sck, PinName cs, int num_sensors = 1):
megrootens 0:723d48642d5c 66 kNumSensors_(num_sensors),
megrootens 0:723d48642d5c 67 chip_(cs),
megrootens 0:723d48642d5c 68 spi_(mosi, miso, sck)
megrootens 0:723d48642d5c 69 {
megrootens 0:723d48642d5c 70 DeselectChip();
megrootens 0:723d48642d5c 71
megrootens 0:723d48642d5c 72 spi_.format(kSpiBitsPerTransfer, kSpiMode);
megrootens 0:723d48642d5c 73 spi_.frequency(kSpiFrequency);
megrootens 0:723d48642d5c 74
megrootens 0:723d48642d5c 75 read_buffer_ = new uint16_t[kNumSensors_];
megrootens 0:723d48642d5c 76 angle_buffer_ = new uint16_t[kNumSensors_];
megrootens 0:723d48642d5c 77 angle_offset_ = new uint16_t[kNumSensors_];
megrootens 1:94b48453d13a 78 directions_ = new bool[kNumSensors_];
megrootens 0:723d48642d5c 79
megrootens 0:723d48642d5c 80 for (int i=0; i<kNumSensors_; ++i) {
megrootens 0:723d48642d5c 81 read_buffer_[i] = 0;
megrootens 0:723d48642d5c 82 angle_buffer_[i] = 0;
megrootens 0:723d48642d5c 83 angle_offset_[i] = 0;
megrootens 1:94b48453d13a 84 directions_[i] = true;
megrootens 0:723d48642d5c 85 }
megrootens 0:723d48642d5c 86
megrootens 0:723d48642d5c 87 last_command_ = AS_CMD_NOP;
megrootens 0:723d48642d5c 88 }
megrootens 0:723d48642d5c 89
megrootens 0:723d48642d5c 90
megrootens 0:723d48642d5c 91 /**
megrootens 0:723d48642d5c 92 * Destructor, memory deallocation
megrootens 0:723d48642d5c 93 */
megrootens 2:111641f7e672 94 ~As5048()
megrootens 2:111641f7e672 95 {
megrootens 0:723d48642d5c 96 delete [] read_buffer_;
megrootens 0:723d48642d5c 97 delete [] angle_buffer_;
megrootens 0:723d48642d5c 98 delete [] angle_offset_;
megrootens 1:94b48453d13a 99 delete [] directions_;
megrootens 0:723d48642d5c 100 }
megrootens 0:723d48642d5c 101
megrootens 0:723d48642d5c 102 /**
megrootens 0:723d48642d5c 103 * Parity check
megrootens 0:723d48642d5c 104 * @param n: integer to check
megrootens 0:723d48642d5c 105 * @return: true if ok
megrootens 0:723d48642d5c 106 */
megrootens 2:111641f7e672 107 static bool CheckParity(int n)
megrootens 2:111641f7e672 108 {
megrootens 0:723d48642d5c 109 int parity = n;
megrootens 0:723d48642d5c 110 for(int i=1; i <= kNumSensorBits+1; ++i) {
megrootens 0:723d48642d5c 111 n >>= 1;
megrootens 0:723d48642d5c 112 parity ^= n;
megrootens 0:723d48642d5c 113 }
megrootens 0:723d48642d5c 114 return (parity & kParity) == 0;
megrootens 0:723d48642d5c 115 }
megrootens 0:723d48642d5c 116
megrootens 0:723d48642d5c 117 /**
megrootens 0:723d48642d5c 118 * Update the buffer with angular measurements
megrootens 0:723d48642d5c 119 * NOTE 1:
megrootens 0:723d48642d5c 120 * If the last command sent through Transfer was *not* AS_CMD_ANGLE
megrootens 0:723d48642d5c 121 * then we need an additional Transfer; this takes more time!
megrootens 0:723d48642d5c 122 * This should not occur, since Transfer is not *yet* used elsewhere.
megrootens 0:723d48642d5c 123 * NOTE 2:
megrootens 0:723d48642d5c 124 * We run a parity check on the results from the transfer. We only
megrootens 0:723d48642d5c 125 * update the angle_buffer_ with values that pass the parity check.
megrootens 0:723d48642d5c 126 * Measurement using Timer on K64F for last_command_ == AS_CMD_ANGLE
megrootens 0:723d48642d5c 127 * shows this function takes 87 or 88 us.
megrootens 0:723d48642d5c 128 */
megrootens 2:111641f7e672 129 void UpdateAngleBuffer()
megrootens 2:111641f7e672 130 {
megrootens 0:723d48642d5c 131 // ensure that the new results indeed will be angles
megrootens 0:723d48642d5c 132 if (last_command_ != AS_CMD_ANGLE) {
megrootens 0:723d48642d5c 133 Transfer(AS_CMD_ANGLE);
megrootens 0:723d48642d5c 134 }
megrootens 0:723d48642d5c 135
megrootens 0:723d48642d5c 136 // update the read buffer
megrootens 0:723d48642d5c 137 Transfer(AS_CMD_ANGLE);
megrootens 0:723d48642d5c 138
megrootens 0:723d48642d5c 139 // update the angle buffer with parity checked values
megrootens 0:723d48642d5c 140 for (int i=0; i<kNumSensors_; ++i) {
megrootens 0:723d48642d5c 141 if (CheckParity(read_buffer_[i])) {
megrootens 0:723d48642d5c 142 // only update angles when parity is correct
megrootens 0:723d48642d5c 143 angle_buffer_[i] = read_buffer_[i];
megrootens 0:723d48642d5c 144 }
megrootens 0:723d48642d5c 145 }
megrootens 0:723d48642d5c 146 }
megrootens 0:723d48642d5c 147
megrootens 0:723d48642d5c 148 /**
megrootens 0:723d48642d5c 149 * @return: pointer to read_buffer_
megrootens 0:723d48642d5c 150 */
megrootens 0:723d48642d5c 151 const uint16_t* get_read_buffer() { return read_buffer_; }
megrootens 0:723d48642d5c 152
megrootens 0:723d48642d5c 153 /**
megrootens 0:723d48642d5c 154 * @return: pointer to angle_buffer_
megrootens 0:723d48642d5c 155 */
megrootens 0:723d48642d5c 156 const uint16_t* get_angle_buffer() { return angle_buffer_; }
megrootens 0:723d48642d5c 157
megrootens 0:723d48642d5c 158 /**
megrootens 0:723d48642d5c 159 * @return: pointer to angle_offet_
megrootens 0:723d48642d5c 160 */
megrootens 0:723d48642d5c 161 const uint16_t* get_angle_offset() { return angle_offset_; }
megrootens 0:723d48642d5c 162
megrootens 0:723d48642d5c 163 /**
megrootens 1:94b48453d13a 164 * @return: pointer to directions_
megrootens 1:94b48453d13a 165 */
megrootens 1:94b48453d13a 166 const bool * get_directions_() { return directions_;}
megrootens 1:94b48453d13a 167
megrootens 1:94b48453d13a 168 /**
megrootens 0:723d48642d5c 169 * You get the angles from two UpdateAngleBuffer() calls before
megrootens 0:723d48642d5c 170 * @return: 14 bits absolute position
megrootens 0:723d48642d5c 171 */
megrootens 2:111641f7e672 172 int getAngle(int i_sensor=0)
megrootens 2:111641f7e672 173 {
megrootens 1:94b48453d13a 174 int ans = ((int) (angle_buffer_[i_sensor] & kMask)) - angle_offset_[i_sensor];
megrootens 1:94b48453d13a 175 return directions_[i_sensor]?ans:-ans;
megrootens 0:723d48642d5c 176 }
megrootens 0:723d48642d5c 177
megrootens 0:723d48642d5c 178 /**
megrootens 0:723d48642d5c 179 * You get the angles from two UpdateAngleBuffer() calls before
megrootens 0:723d48642d5c 180 * @return: revolution ratio in [0,1]
megrootens 0:723d48642d5c 181 */
megrootens 0:723d48642d5c 182 float getAngleRatio(int i_sensor=0) { return (float) getAngle(i_sensor) / kCountsPerRev; }
megrootens 0:723d48642d5c 183
megrootens 0:723d48642d5c 184 /**
megrootens 0:723d48642d5c 185 * You get the angles from two UpdateAngleBuffer() calls before
megrootens 0:723d48642d5c 186 * @return: angle in degrees
megrootens 0:723d48642d5c 187 */
megrootens 0:723d48642d5c 188 float getAngleDegrees(int i_sensor=0) { return getAngleRatio(i_sensor) * kDegPerRev; }
megrootens 0:723d48642d5c 189
megrootens 0:723d48642d5c 190 /**
megrootens 0:723d48642d5c 191 * You get the angles from two UpdateAngleBuffer() calls before
megrootens 0:723d48642d5c 192 * @return: angle in radians
megrootens 0:723d48642d5c 193 */
megrootens 0:723d48642d5c 194 float getAngleRadians(int i_sensor=0) { return getAngleRatio(i_sensor) * kRadPerRev; }
megrootens 0:723d48642d5c 195
megrootens 0:723d48642d5c 196 /**
megrootens 1:94b48453d13a 197 * Set direction for a sensor
megrootens 1:94b48453d13a 198 * @param i_sensor: id of sensor for which the offset is to be set
megrootens 1:94b48453d13a 199 * @param dir: true positive, false negative
megrootens 1:94b48453d13a 200 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 1:94b48453d13a 201 */
megrootens 2:111641f7e672 202 bool setDirection(int i_sensor, bool dir)
megrootens 2:111641f7e672 203 {
megrootens 1:94b48453d13a 204 if (i_sensor>-1 and i_sensor<kNumSensors_) {
megrootens 1:94b48453d13a 205 directions_[i_sensor] = dir;
megrootens 1:94b48453d13a 206 return true;
megrootens 1:94b48453d13a 207 }
megrootens 1:94b48453d13a 208 return false;
megrootens 1:94b48453d13a 209 }
megrootens 1:94b48453d13a 210
megrootens 1:94b48453d13a 211 /**
megrootens 1:94b48453d13a 212 * Set direction for the first sensor
megrootens 1:94b48453d13a 213 * @param dir: true positive, false negative
megrootens 1:94b48453d13a 214 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 1:94b48453d13a 215 */
megrootens 2:111641f7e672 216 bool setDirection(bool dir)
megrootens 2:111641f7e672 217 {
megrootens 1:94b48453d13a 218 return setDirection(0,dir);
megrootens 1:94b48453d13a 219 }
megrootens 1:94b48453d13a 220
megrootens 1:94b48453d13a 221
megrootens 1:94b48453d13a 222 /**
megrootens 0:723d48642d5c 223 * Set offset for a sensor
megrootens 0:723d48642d5c 224 * @param i_sensor: id of sensor for which the offset is to be set
megrootens 0:723d48642d5c 225 * @param offset: offset in counts [0,2**14-1]
megrootens 0:723d48642d5c 226 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 227 */
megrootens 2:111641f7e672 228 bool setOffset(int i_sensor, uint16_t offset)
megrootens 2:111641f7e672 229 {
megrootens 0:723d48642d5c 230 if (i_sensor>-1 and i_sensor<kNumSensors_) {
megrootens 0:723d48642d5c 231 angle_offset_[i_sensor] = offset;
megrootens 0:723d48642d5c 232 return true;
megrootens 0:723d48642d5c 233 }
megrootens 0:723d48642d5c 234 return false;
megrootens 0:723d48642d5c 235 }
megrootens 0:723d48642d5c 236
megrootens 0:723d48642d5c 237 /**
megrootens 0:723d48642d5c 238 * Set offset for the first sensor
megrootens 0:723d48642d5c 239 * @param offset: offset in counts [0,2**14-1]
megrootens 0:723d48642d5c 240 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 241 */
megrootens 0:723d48642d5c 242 bool setOffset(uint16_t offset) { return setOffset(0,offset); }
megrootens 0:723d48642d5c 243
megrootens 0:723d48642d5c 244 /**
megrootens 0:723d48642d5c 245 * Set offset for a sensor
megrootens 0:723d48642d5c 246 * @param i_sensor: id of sensor for which the offset is to be set
megrootens 0:723d48642d5c 247 * @param offset_ratio: offset in ratio in [0,1]
megrootens 0:723d48642d5c 248 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 249 */
megrootens 2:111641f7e672 250 bool setOffsetRatio (int i_sensor, float offset_ratio)
megrootens 2:111641f7e672 251 {
megrootens 0:723d48642d5c 252 return setOffset(i_sensor,offset_ratio*kCountsPerRev);
megrootens 0:723d48642d5c 253 }
megrootens 0:723d48642d5c 254
megrootens 0:723d48642d5c 255 /**
megrootens 0:723d48642d5c 256 * Set offset for the first sensor
megrootens 0:723d48642d5c 257 * @param offset_ratio: offset in ratio in [0,1]
megrootens 0:723d48642d5c 258 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 259 */
megrootens 2:111641f7e672 260 bool setOffsetRatio(float offset_ratio)
megrootens 2:111641f7e672 261 {
megrootens 0:723d48642d5c 262 return setOffsetRatio(0,offset_ratio);
megrootens 0:723d48642d5c 263 }
megrootens 0:723d48642d5c 264
megrootens 0:723d48642d5c 265 /**
megrootens 0:723d48642d5c 266 * Set offset for a sensor
megrootens 0:723d48642d5c 267 * @param i_sensor: id of sensor for which the offset is to be set
megrootens 0:723d48642d5c 268 * @param offset_degrees: offset in degrees in [0,360]
megrootens 0:723d48642d5c 269 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 270 */
megrootens 2:111641f7e672 271 bool setOffsetDegrees(int i_sensor, float offset_degrees)
megrootens 2:111641f7e672 272 {
megrootens 0:723d48642d5c 273 return setOffsetRatio(i_sensor,offset_degrees / kDegPerRev);
megrootens 0:723d48642d5c 274 }
megrootens 0:723d48642d5c 275
megrootens 0:723d48642d5c 276 /**
megrootens 0:723d48642d5c 277 * Set offset for the first sensor
megrootens 0:723d48642d5c 278 * @param offset_degrees: offset in degrees in [0,360]
megrootens 0:723d48642d5c 279 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 280 */
megrootens 2:111641f7e672 281 bool setOffsetDegrees(float offset_degrees)
megrootens 2:111641f7e672 282 {
megrootens 0:723d48642d5c 283 return setOffsetDegrees(0, offset_degrees);
megrootens 0:723d48642d5c 284 }
megrootens 0:723d48642d5c 285
megrootens 0:723d48642d5c 286 /**
megrootens 0:723d48642d5c 287 * Set offset for a sensor
megrootens 0:723d48642d5c 288 * @param i_sensor: id of sensor for which the offset is to be set
megrootens 0:723d48642d5c 289 * @param offset_radians: offset in radians in [0,2*pi]
megrootens 0:723d48642d5c 290 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 291 */
megrootens 2:111641f7e672 292 bool setOffsetRadians(int i_sensor, float offset_radians)
megrootens 2:111641f7e672 293 {
megrootens 0:723d48642d5c 294 return setOffsetRatio(i_sensor, offset_radians / kRadPerRev);
megrootens 0:723d48642d5c 295 }
megrootens 0:723d48642d5c 296
megrootens 0:723d48642d5c 297 /**
megrootens 0:723d48642d5c 298 * Set offset for the first sensor
megrootens 0:723d48642d5c 299 * @param offset_radians: offset in radians in [0,2*pi]
megrootens 0:723d48642d5c 300 * @return: true if i_sensor in [0,kNumSensor_)
megrootens 0:723d48642d5c 301 */
megrootens 2:111641f7e672 302 bool setOffsetRadians(float offset_radians)
megrootens 2:111641f7e672 303 {
megrootens 0:723d48642d5c 304 return setOffsetRadians(0, offset_radians);
megrootens 0:723d48642d5c 305 }
megrootens 1:94b48453d13a 306
megrootens 1:94b48453d13a 307
megrootens 0:723d48642d5c 308
megrootens 0:723d48642d5c 309
megrootens 0:723d48642d5c 310 protected:
megrootens 0:723d48642d5c 311
megrootens 4:56d59ce73270 312
megrootens 3:579e12eda4e6 313
megrootens 0:723d48642d5c 314 /**
megrootens 0:723d48642d5c 315 * Select (low) chip, and wait 1 us (at least 350 ns)
megrootens 0:723d48642d5c 316 */
megrootens 0:723d48642d5c 317 void SelectChip() { chip_.write(0); wait_us(1); }
megrootens 0:723d48642d5c 318
megrootens 0:723d48642d5c 319 /**
megrootens 0:723d48642d5c 320 * Deselect (high) chip, and wait 1 us (at least 350 ns)
megrootens 0:723d48642d5c 321 */
megrootens 0:723d48642d5c 322 void DeselectChip() { chip_.write(1); wait_us(1); }
megrootens 0:723d48642d5c 323
megrootens 0:723d48642d5c 324 /**
megrootens 0:723d48642d5c 325 * SPI transfer between each of the daisy chained sensors
megrootens 0:723d48642d5c 326 * @param cmd: Command to send
megrootens 0:723d48642d5c 327 */
megrootens 2:111641f7e672 328 void Transfer(As5048Command cmd)
megrootens 2:111641f7e672 329 {
megrootens 0:723d48642d5c 330 SelectChip();
megrootens 0:723d48642d5c 331 for(int i=0; i<kNumSensors_; ++i){
megrootens 0:723d48642d5c 332 read_buffer_[i] = spi_.write(cmd>>8) << 8;
megrootens 0:723d48642d5c 333 read_buffer_[i] |= spi_.write(cmd & 0x00FF);
megrootens 0:723d48642d5c 334 }
megrootens 0:723d48642d5c 335 DeselectChip();
megrootens 0:723d48642d5c 336 last_command_ = cmd;
megrootens 0:723d48642d5c 337 }
megrootens 0:723d48642d5c 338
megrootens 0:723d48642d5c 339 const int kNumSensors_; // number of sensors in daisy chain
megrootens 0:723d48642d5c 340 DigitalOut chip_; // chip select port
megrootens 0:723d48642d5c 341 SPI spi_; // mbed spi communiation object
megrootens 0:723d48642d5c 342
megrootens 0:723d48642d5c 343 uint16_t* read_buffer_; // buffer for results from last transfer
megrootens 0:723d48642d5c 344 uint16_t* angle_buffer_; // buffer for angle results from last transfer
megrootens 0:723d48642d5c 345 uint16_t* angle_offset_; // offset array for each sensor
megrootens 1:94b48453d13a 346 bool* directions_; // direction true positive, false negative
megrootens 0:723d48642d5c 347
megrootens 0:723d48642d5c 348 As5048Command last_command_;// command sent during last Transfer
megrootens 0:723d48642d5c 349
megrootens 0:723d48642d5c 350 };
megrootens 0:723d48642d5c 351 #endif