Added entirety of CAD files, Software and the translated documentation
This commit is contained in:
561
02_Software/01_Arduino/main/ams_as5048b.cpp
Normal file
561
02_Software/01_Arduino/main/ams_as5048b.cpp
Normal file
@ -0,0 +1,561 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file ams_as5048b.cpp
|
||||
@author SOSAndroid (E. Ha.)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
Library to interface the AS5048B magnetic rotary encoder from AMS over the I2C bus
|
||||
|
||||
@section HISTORY
|
||||
|
||||
v1.0.0 - First release
|
||||
v1.0.1 - Typo to allow compiling on Codebender.cc (Math.h vs math.h)
|
||||
v1.0.2 - setZeroReg() issue raised by @MechatronicsWorkman
|
||||
v1.0.3 - Small bug fix and improvement by @DavidHowlett
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <Wire.h>
|
||||
#include "ams_as5048b.h"
|
||||
|
||||
/*========================================================================*/
|
||||
/* CONSTRUCTORS */
|
||||
/*========================================================================*/
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Constructor
|
||||
*/
|
||||
/**************************************************************************/
|
||||
AMS_AS5048B::AMS_AS5048B(void) {
|
||||
_chipAddress = AS5048_ADDRESS;
|
||||
_debugFlag = false;
|
||||
}
|
||||
|
||||
AMS_AS5048B::AMS_AS5048B(uint8_t chipAddress) {
|
||||
_chipAddress = chipAddress;
|
||||
_debugFlag = false;
|
||||
}
|
||||
|
||||
/*========================================================================*/
|
||||
/* PUBLIC FUNCTIONS */
|
||||
/*========================================================================*/
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief init values and overall behaviors for AS5948B use
|
||||
|
||||
@params
|
||||
none
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
void AMS_AS5048B::begin(void) {
|
||||
|
||||
#ifdef USE_WIREBEGIN_ENABLED
|
||||
Wire.begin();
|
||||
#endif
|
||||
#ifdef SERIAL_DEBUG_ENABLED
|
||||
_debugFlag = true;
|
||||
if (!Serial) {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
#endif
|
||||
|
||||
_clockWise = false;
|
||||
_lastAngleRaw = 0.0;
|
||||
_zeroRegVal = AMS_AS5048B::zeroRegR();
|
||||
_addressRegVal = AMS_AS5048B::addressRegR();
|
||||
|
||||
AMS_AS5048B::resetMovingAvgExp();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Toggle debug output to serial
|
||||
|
||||
@params
|
||||
none
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::toggleDebug(void) {
|
||||
|
||||
_debugFlag = !_debugFlag;
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Set / unset clock wise counting - sensor counts CCW natively
|
||||
|
||||
@params[in]
|
||||
boolean cw - true: CW, false: CCW
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::setClockWise(boolean cw) {
|
||||
|
||||
_clockWise = cw;
|
||||
_lastAngleRaw = 0.0;
|
||||
AMS_AS5048B::resetMovingAvgExp();
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief writes OTP control register
|
||||
|
||||
@params[in]
|
||||
unit8_t register value
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::progRegister(uint8_t regVal) {
|
||||
|
||||
AMS_AS5048B::writeReg(AS5048B_PROG_REG, regVal);
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Burn values to the slave address OTP register
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::doProg(void) {
|
||||
|
||||
//enable special programming mode
|
||||
AMS_AS5048B::progRegister(0xFD);
|
||||
delay(10);
|
||||
|
||||
//set the burn bit: enables automatic programming procedure
|
||||
AMS_AS5048B::progRegister(0x08);
|
||||
delay(10);
|
||||
|
||||
//disable special programming mode
|
||||
AMS_AS5048B::progRegister(0x00);
|
||||
delay(10);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Burn values to the zero position OTP register
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::doProgZero(void) {
|
||||
//this will burn the zero position OTP register like described in the datasheet
|
||||
//enable programming mode
|
||||
AMS_AS5048B::progRegister(0x01);
|
||||
delay(10);
|
||||
|
||||
//set the burn bit: enables automatic programming procedure
|
||||
AMS_AS5048B::progRegister(0x08);
|
||||
delay(10);
|
||||
|
||||
//read angle information (equals to 0)
|
||||
AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
|
||||
delay(10);
|
||||
|
||||
//enable verification
|
||||
AMS_AS5048B::progRegister(0x40);
|
||||
delay(10);
|
||||
|
||||
//read angle information (equals to 0)
|
||||
AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
|
||||
delay(10);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief write I2C address value (5 bits) into the address register
|
||||
|
||||
@params[in]
|
||||
unit8_t register value
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::addressRegW(uint8_t regVal) {
|
||||
|
||||
// write the new chip address to the register
|
||||
AMS_AS5048B::writeReg(AS5048B_ADDR_REG, regVal);
|
||||
|
||||
// update our chip address with our 5 programmable bits
|
||||
// the MSB is internally inverted, so we flip the leftmost bit
|
||||
_chipAddress = ((regVal << 2) | (_chipAddress & 0b11)) ^ (1 << 6);
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief reads I2C address register value
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
uint8_t register value
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint8_t AMS_AS5048B::addressRegR(void) {
|
||||
|
||||
return AMS_AS5048B::readReg8(AS5048B_ADDR_REG);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief sets current angle as the zero position
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::setZeroReg(void) {
|
||||
|
||||
AMS_AS5048B::zeroRegW((uint16_t) 0x00); //Issue closed by @MechatronicsWorkman and @oilXander. The last sequence avoids any offset for the new Zero position
|
||||
uint16_t newZero = AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
|
||||
AMS_AS5048B::zeroRegW(newZero);
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief writes the 2 bytes Zero position register value
|
||||
|
||||
@params[in]
|
||||
unit16_t register value
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::zeroRegW(uint16_t regVal) {
|
||||
|
||||
AMS_AS5048B::writeReg(AS5048B_ZEROMSB_REG, (uint8_t) (regVal >> 6));
|
||||
AMS_AS5048B::writeReg(AS5048B_ZEROLSB_REG, (uint8_t) (regVal & 0x3F));
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief reads the 2 bytes Zero position register value
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
uint16_t register value trimmed on 14 bits
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t AMS_AS5048B::zeroRegR(void) {
|
||||
|
||||
return AMS_AS5048B::readReg16(AS5048B_ZEROMSB_REG);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief reads the 2 bytes magnitude register value
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
uint16_t register value trimmed on 14 bits
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t AMS_AS5048B::magnitudeR(void) {
|
||||
|
||||
return AMS_AS5048B::readReg16(AS5048B_MAGNMSB_REG);
|
||||
}
|
||||
|
||||
uint16_t AMS_AS5048B::angleRegR(void) {
|
||||
|
||||
return AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief reads the 1 bytes auto gain register value
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
uint8_t register value
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint8_t AMS_AS5048B::getAutoGain(void) {
|
||||
|
||||
return AMS_AS5048B::readReg8(AS5048B_GAIN_REG);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief reads the 1 bytes diagnostic register value
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
uint8_t register value
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint8_t AMS_AS5048B::getDiagReg(void) {
|
||||
|
||||
return AMS_AS5048B::readReg8(AS5048B_DIAG_REG);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief reads current angle value and converts it into the desired unit
|
||||
|
||||
@params[in]
|
||||
String unit : string expressing the unit of the angle. Sensor raw value as default
|
||||
@params[in]
|
||||
Boolean newVal : have a new measurement or use the last read one. True as default
|
||||
@returns
|
||||
Double angle value converted into the desired unit
|
||||
*/
|
||||
/**************************************************************************/
|
||||
double AMS_AS5048B::angleR(int unit, boolean newVal) {
|
||||
|
||||
double angleRaw;
|
||||
|
||||
if (newVal) {
|
||||
if(_clockWise) {
|
||||
angleRaw = (double) (0b11111111111111 - AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG));
|
||||
}
|
||||
else {
|
||||
angleRaw = (double) AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
|
||||
}
|
||||
_lastAngleRaw = angleRaw;
|
||||
}
|
||||
else {
|
||||
angleRaw = _lastAngleRaw;
|
||||
}
|
||||
|
||||
return AMS_AS5048B::convertAngle(unit, angleRaw);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Performs an exponential moving average on the angle.
|
||||
Works on Sine and Cosine of the angle to avoid issues 0°/360° discontinuity
|
||||
|
||||
@params[in]
|
||||
none
|
||||
@returns
|
||||
none
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void AMS_AS5048B::updateMovingAvgExp(void) {
|
||||
|
||||
//sine and cosine calculation on angles in radian
|
||||
|
||||
double angle = AMS_AS5048B::angleR(U_RAD, true);
|
||||
|
||||
if (_movingAvgCountLoop < EXP_MOVAVG_LOOP) {
|
||||
_movingAvgExpSin += sin(angle);
|
||||
_movingAvgExpCos += cos(angle);
|
||||
if (_movingAvgCountLoop == (EXP_MOVAVG_LOOP - 1)) {
|
||||
_movingAvgExpSin = _movingAvgExpSin / EXP_MOVAVG_LOOP;
|
||||
_movingAvgExpCos = _movingAvgExpCos / EXP_MOVAVG_LOOP;
|
||||
}
|
||||
_movingAvgCountLoop ++;
|
||||
}
|
||||
else {
|
||||
double movavgexpsin = _movingAvgExpSin + _movingAvgExpAlpha * (sin(angle) - _movingAvgExpSin);
|
||||
double movavgexpcos = _movingAvgExpCos + _movingAvgExpAlpha * (cos(angle) - _movingAvgExpCos);
|
||||
_movingAvgExpSin = movavgexpsin;
|
||||
_movingAvgExpCos = movavgexpcos;
|
||||
_movingAvgExpAngle = getExpAvgRawAngle();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief sent back the exponential moving averaged angle in the desired unit
|
||||
|
||||
@params[in]
|
||||
String unit : string expressing the unit of the angle. Sensor raw value as default
|
||||
@returns
|
||||
Double exponential moving averaged angle value
|
||||
*/
|
||||
/**************************************************************************/
|
||||
double AMS_AS5048B::getMovingAvgExp(int unit) {
|
||||
|
||||
return AMS_AS5048B::convertAngle(unit, _movingAvgExpAngle);
|
||||
}
|
||||
|
||||
void AMS_AS5048B::resetMovingAvgExp(void) {
|
||||
|
||||
_movingAvgExpAngle = 0.0;
|
||||
_movingAvgCountLoop = 0;
|
||||
_movingAvgExpAlpha = 2.0 / (EXP_MOVAVG_N + 1.0);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*========================================================================*/
|
||||
/* PRIVATE FUNCTIONS */
|
||||
/*========================================================================*/
|
||||
|
||||
uint8_t AMS_AS5048B::readReg8(uint8_t address) {
|
||||
|
||||
uint8_t readValue;
|
||||
byte requestResult;
|
||||
uint8_t nbByte2Read = 1;
|
||||
|
||||
Wire.beginTransmission(_chipAddress);
|
||||
Wire.write(address);
|
||||
requestResult = Wire.endTransmission(false);
|
||||
if (requestResult){
|
||||
Serial.print("I2C error: ");
|
||||
Serial.println(requestResult);
|
||||
}
|
||||
|
||||
Wire.requestFrom(_chipAddress, nbByte2Read);
|
||||
readValue = (uint8_t) Wire.read();
|
||||
|
||||
return readValue;
|
||||
}
|
||||
|
||||
uint16_t AMS_AS5048B::readReg16(uint8_t address) {
|
||||
//16 bit value got from 2 8bits registers (7..0 MSB + 5..0 LSB) => 14 bits value
|
||||
|
||||
uint8_t nbByte2Read = 2;
|
||||
byte requestResult;
|
||||
byte readArray[2];
|
||||
uint16_t readValue = 0;
|
||||
|
||||
Wire.beginTransmission(_chipAddress);
|
||||
Wire.write(address);
|
||||
requestResult = Wire.endTransmission(false);
|
||||
if (requestResult){
|
||||
Serial.print("I2C error: ");
|
||||
Serial.println(requestResult);
|
||||
}
|
||||
|
||||
|
||||
Wire.requestFrom(_chipAddress, nbByte2Read);
|
||||
for (byte i=0; i < nbByte2Read; i++) {
|
||||
readArray[i] = Wire.read();
|
||||
}
|
||||
|
||||
readValue = (((uint16_t) readArray[0]) << 6);
|
||||
readValue += (readArray[1] & 0x3F);
|
||||
/*
|
||||
Serial.println(readArray[0], BIN);
|
||||
Serial.println(readArray[1], BIN);
|
||||
Serial.println(readValue, BIN);
|
||||
*/
|
||||
return readValue;
|
||||
}
|
||||
|
||||
void AMS_AS5048B::writeReg(uint8_t address, uint8_t value) {
|
||||
|
||||
Wire.beginTransmission(_chipAddress);
|
||||
Wire.write(address);
|
||||
Wire.write(value);
|
||||
Wire.endTransmission();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
double AMS_AS5048B::convertAngle(int unit, double angle) {
|
||||
|
||||
// convert raw sensor reading into angle unit
|
||||
|
||||
double angleConv;
|
||||
|
||||
switch (unit) {
|
||||
case U_RAW:
|
||||
//Sensor raw measurement
|
||||
angleConv = angle;
|
||||
break;
|
||||
case U_TRN:
|
||||
//full turn ratio
|
||||
angleConv = (angle / AS5048B_RESOLUTION);
|
||||
break;
|
||||
case U_DEG:
|
||||
//degree
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 360.0;
|
||||
break;
|
||||
case U_RAD:
|
||||
//Radian
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 2 * M_PI;
|
||||
break;
|
||||
case U_MOA:
|
||||
//minute of arc
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 60.0 * 360.0;
|
||||
break;
|
||||
case U_SOA:
|
||||
//second of arc
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 60.0 * 60.0 * 360.0;
|
||||
break;
|
||||
case U_GRAD:
|
||||
//grade
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 400.0;
|
||||
break;
|
||||
case U_MILNATO:
|
||||
//NATO MIL
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 6400.0;
|
||||
break;
|
||||
case U_MILSE:
|
||||
//Swedish MIL
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 6300.0;
|
||||
break;
|
||||
case U_MILRU:
|
||||
//Russian MIL
|
||||
angleConv = (angle / AS5048B_RESOLUTION) * 6000.0;
|
||||
break;
|
||||
default:
|
||||
//no conversion => raw angle
|
||||
angleConv = angle;
|
||||
break;
|
||||
}
|
||||
return angleConv;
|
||||
}
|
||||
|
||||
double AMS_AS5048B::getExpAvgRawAngle(void) {
|
||||
|
||||
double angle;
|
||||
double twopi = 2 * M_PI;
|
||||
|
||||
if (_movingAvgExpSin < 0.0) {
|
||||
angle = twopi - acos(_movingAvgExpCos);
|
||||
}
|
||||
else {
|
||||
angle = acos(_movingAvgExpCos);
|
||||
}
|
||||
|
||||
angle = (angle / twopi) * AS5048B_RESOLUTION;
|
||||
|
||||
return angle;
|
||||
}
|
||||
|
||||
void AMS_AS5048B::printDebug(void) {
|
||||
|
||||
return;
|
||||
}
|
150
02_Software/01_Arduino/main/ams_as5048b.h
Normal file
150
02_Software/01_Arduino/main/ams_as5048b.h
Normal file
@ -0,0 +1,150 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file ams_as5048b.h
|
||||
@author SOSAndroid.fr (E. Ha.)
|
||||
|
||||
@section HISTORY
|
||||
|
||||
v1.0 - First release
|
||||
v1.0.1 - Typo to allow compiling on Codebender.cc (Math.h vs math.h)
|
||||
v1.0.2 - Small bug fix and improvement by @DavidHowlett
|
||||
|
||||
Library to interface the AS5048B magnetic rotary encoder from AMS over the I2C bus
|
||||
|
||||
@section LICENSE
|
||||
|
||||
Software License Agreement (BSD License)
|
||||
|
||||
Copyright (c) 2013, SOSAndroid.fr (E. Ha.)
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <Wire.h>
|
||||
|
||||
|
||||
#ifndef _AMS_AS5048B_H_
|
||||
#define _AMS_AS5048B_H_
|
||||
|
||||
|
||||
// OPERATIONS
|
||||
#define SERIAL_DEBUG_ENABLED
|
||||
#define USE_WIREBEGIN_ENABLED // to comment if Wire.begin() function is called in Setup() for instance. Usefull to manage one or several I2C devices in the same sketch
|
||||
|
||||
// Default addresses for AS5048B
|
||||
#define AS5048_ADDRESS 0x40 // 0b10000 + ( A1 & A2 to GND)
|
||||
#define AS5048B_PROG_REG 0x03
|
||||
#define AS5048B_ADDR_REG 0x15
|
||||
#define AS5048B_ZEROMSB_REG 0x16 //bits 0..7
|
||||
#define AS5048B_ZEROLSB_REG 0x17 //bits 0..5
|
||||
#define AS5048B_GAIN_REG 0xFA
|
||||
#define AS5048B_DIAG_REG 0xFB
|
||||
#define AS5048B_MAGNMSB_REG 0xFC //bits 0..7
|
||||
#define AS5048B_MAGNLSB_REG 0xFD //bits 0..5
|
||||
#define AS5048B_ANGLMSB_REG 0xFE //bits 0..7
|
||||
#define AS5048B_ANGLLSB_REG 0xFF //bits 0..5
|
||||
#define AS5048B_RESOLUTION 16384.0 //14 bits
|
||||
|
||||
|
||||
// Moving Exponential Average on angle - beware heavy calculation for some Arduino boards
|
||||
// This is a 1st order low pass filter
|
||||
// Moving average is calculated on Sine et Cosine values of the angle to provide an extrapolated accurate angle value.
|
||||
#define EXP_MOVAVG_N 5 //history length impact on moving average impact - keep in mind the moving average will be impacted by the measurement frequency too
|
||||
#define EXP_MOVAVG_LOOP 1 //number of measurements before starting mobile Average - starting with a simple average - 1 allows a quick start. Value must be 1 minimum
|
||||
|
||||
//unit consts - just to make the units more readable
|
||||
#define U_RAW 1
|
||||
#define U_TRN 2
|
||||
#define U_DEG 3
|
||||
#define U_RAD 4
|
||||
#define U_GRAD 5
|
||||
#define U_MOA 6
|
||||
#define U_SOA 7
|
||||
#define U_MILNATO 8
|
||||
#define U_MILSE 9
|
||||
#define U_MILRU 10
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class AMS_AS5048B {
|
||||
public:
|
||||
AMS_AS5048B(void);
|
||||
AMS_AS5048B(uint8_t chipAddress);
|
||||
|
||||
void begin(void); // to init the object, must be called in the setup loop
|
||||
void toggleDebug(void); // start / stop debug through serial at anytime
|
||||
void setClockWise(boolean cw = true); //set clockwise counting, default is false (native sensor)
|
||||
void progRegister(uint8_t regVal); //nothing so far - manipulate the OTP register
|
||||
void doProg(void); //progress programming slave address OTP
|
||||
void doProgZero(void); //progress programming zero position OTP
|
||||
void addressRegW(uint8_t regVal); //change the chip address
|
||||
uint8_t addressRegR(void); //read chip address
|
||||
void setZeroReg(void); //set Zero to current angle position
|
||||
void zeroRegW(uint16_t regVal); //write Zero register value
|
||||
uint16_t zeroRegR(void); //read Zero register value
|
||||
uint16_t angleRegR(void); //read raw value of the angle register
|
||||
uint8_t diagR(void); //read diagnostic register
|
||||
uint16_t magnitudeR(void); //read current magnitude
|
||||
double angleR(int unit = U_RAW, boolean newVal = true); //Read current angle or get last measure with unit conversion : RAW, TRN, DEG, RAD, GRAD, MOA, SOA, MILNATO, MILSE, MILRU
|
||||
uint8_t getAutoGain(void);
|
||||
uint8_t getDiagReg(void);
|
||||
|
||||
void updateMovingAvgExp(void); //measure the current angle and feed the Exponential Moving Average calculation
|
||||
double getMovingAvgExp(int unit = U_RAW); //get Exponential Moving Average calculation
|
||||
void resetMovingAvgExp(void); //reset Exponential Moving Average calculation values
|
||||
|
||||
private:
|
||||
//variables
|
||||
boolean _debugFlag;
|
||||
boolean _clockWise;
|
||||
uint8_t _chipAddress;
|
||||
uint8_t _addressRegVal;
|
||||
uint16_t _zeroRegVal;
|
||||
double _lastAngleRaw;
|
||||
double _movingAvgExpAngle;
|
||||
double _movingAvgExpSin;
|
||||
double _movingAvgExpCos;
|
||||
double _movingAvgExpAlpha;
|
||||
int _movingAvgCountLoop;
|
||||
|
||||
//methods
|
||||
uint8_t readReg8(uint8_t address);
|
||||
uint16_t readReg16(uint8_t address); //16 bit value got from 2x8bits registers (7..0 MSB + 5..0 LSB) => 14 bits value
|
||||
void writeReg(uint8_t address, uint8_t value);
|
||||
double convertAngle(int unit, double angle); //RAW, TRN, DEG, RAD, GRAD, MOA, SOA, MILNATO, MILSE, MILRU
|
||||
double getExpAvgRawAngle(void);
|
||||
void printDebug(void);
|
||||
};
|
||||
|
||||
#endif
|
1534
02_Software/01_Arduino/main/main.ino
Normal file
1534
02_Software/01_Arduino/main/main.ino
Normal file
File diff suppressed because it is too large
Load Diff
593
02_Software/01_Arduino/main/main_AVR_UNO_atmega328p.hex
Normal file
593
02_Software/01_Arduino/main/main_AVR_UNO_atmega328p.hex
Normal file
@ -0,0 +1,593 @@
|
||||
:100000000C9463000C948B000C948B000C94690589
|
||||
:100010000C9469050C9469050C948B000C948B006E
|
||||
:100020000C948B000C948B000C948B000C94A80403
|
||||
:100030000C948B000C948B000C948B000C948B0014
|
||||
:100040000C9434080C948B000C9448030C942203F9
|
||||
:100050000C948B000C948B000C948B000C948B00F4
|
||||
:100060000C947A030C948B000000000024002700FD
|
||||
:100070002A0000000008000201000003040700003D
|
||||
:1000800000000000000000000000250028002B00F8
|
||||
:1000900000000000230026002900040404040404D6
|
||||
:1000A0000404020202020202030303030303010227
|
||||
:1000B00004081020408001020408102001020408F6
|
||||
:1000C00010200C0CF00B11241FBECFEFD8E0DEBFC8
|
||||
:1000D000CDBF11E0A0E0B1E0E4E8F4E202C0059099
|
||||
:1000E0000D92AA36B107D9F723E0AAE6B1E001C024
|
||||
:1000F0001D92A03CB207E1F710E0C2E6D0E004C0D8
|
||||
:100100002197FE010E942310C136D107C9F70E9432
|
||||
:10011000A5080C9435120C940000CF92DF92EF9258
|
||||
:10012000FF920F931F93CF93DF936C017A018B01A2
|
||||
:10013000C0E0D0E0CE15DF0589F0D8016D918D01CA
|
||||
:10014000D601ED91FC910190F081E02DC601099559
|
||||
:10015000892B11F47E0102C02196ECCFC701DF91FB
|
||||
:10016000CF911F910F91FF90EF90DF90CF90089566
|
||||
:10017000FC01538D448D252F30E0842F90E0821BAD
|
||||
:10018000930B541710F0CF96089501970895FC0132
|
||||
:10019000918D828D981761F0828DDF01A80FB11DBE
|
||||
:1001A0005D968C91928D9F5F9F73928F90E00895E2
|
||||
:1001B0008FEF9FEF0895FC01918D828D981731F09C
|
||||
:1001C000828DE80FF11D858D90E008958FEF9FEFF0
|
||||
:1001D0000895FC01918D228D892F90E0805C9F4FC6
|
||||
:1001E000821B91098F739927089585E692E00E94FA
|
||||
:1001F000E90021E0892B09F420E0822F0895FC0119
|
||||
:10020000848DDF01A80FB11DA35ABF4F2C91848D9F
|
||||
:1002100090E001968F739927848FA689B7892C93D4
|
||||
:10022000A089B1898C9180648C93938D848D98136F
|
||||
:1002300006C00288F389E02D80818F7D8083089538
|
||||
:10024000EF92FF920F931F93CF93DF93EC0181E026
|
||||
:10025000888F9B8D8C8D981305C0E889F9898081E2
|
||||
:1002600085FD24C0F62E0B8D10E00F5F1F4F0F731E
|
||||
:100270001127E02E8C8DE8120CC00FB607FCFACFC8
|
||||
:10028000E889F989808185FFF5CFCE010E94FF00C2
|
||||
:10029000F1CF8B8DFE01E80FF11DE35AFF4FF08285
|
||||
:1002A0000B8FEA89FB898081806207C0EE89FF8914
|
||||
:1002B0006083E889F98980818064808381E090E0AF
|
||||
:1002C000DF91CF911F910F91FF90EF900895CF9301
|
||||
:1002D000DF93EC01888D8823C9F0EA89FB8980814E
|
||||
:1002E00085FD05C0A889B9898C9186FD0FC00FB620
|
||||
:1002F00007FCF5CF808185FFF2CFA889B9898C9161
|
||||
:1003000085FFEDCFCE010E94FF00E7CFDF91CF91B7
|
||||
:10031000089580E090E0892B29F00E94F50081117A
|
||||
:100320000C940000089585ED8093BC008091BC0082
|
||||
:1003300084FDFCCF1092400208954091D101262FF8
|
||||
:1003400030E0240F311D21323105DCF420914002D0
|
||||
:100350002430C9F4FC0180E090E0861758F4309115
|
||||
:10036000D1012191DC01A155BE4FA30FB11D2C93EA
|
||||
:100370000196F3CF8091D101680F6093D10180E0A5
|
||||
:10038000089581E0089582E008952091AC013091B4
|
||||
:10039000AD012817390771F49091AB018091AA0142
|
||||
:1003A000981741F0E091AB01F0E0E659FE4F8081F3
|
||||
:1003B00090E008958FEF9FEF089508951F93CF93D6
|
||||
:1003C000DF93DC015C962D913C915D972115310501
|
||||
:1003D00039F481E090E013969C938E9312973DC080
|
||||
:1003E0005196ED91FC91529750969C915097892F80
|
||||
:1003F00080951FB75E964C915E9741FB772770F909
|
||||
:1004000041FD6095F8944081772311F0492B01C09C
|
||||
:1004100048234083E9012197F1F748E0508160FFCC
|
||||
:1004200002C0592B01C058235083E9012197F1F7ED
|
||||
:100430006695415099F7772321F090818923808335
|
||||
:1004400003C08081982B90831FBF5C968D919C91F7
|
||||
:100450005D970197F1F721E030E0C901DF91CF917D
|
||||
:100460001F9108952091AC013091AD0128173907F3
|
||||
:1004700071F48091AA012091AB0190E0805C9F4FC4
|
||||
:10048000821B910960E470E00E94FB0F089580E0F8
|
||||
:1004900090E008952091AC013091AD012817390703
|
||||
:1004A000B9F49091AB018091AA01981789F0E0917D
|
||||
:1004B000AB01F0E0E659FE4F80812091AB0130E0C6
|
||||
:1004C0002F5F3F4F2F7333272093AB0190E00895A8
|
||||
:1004D0008FEF9FEF08950895E091F9018091F80161
|
||||
:1004E000E81730F4F0E0E650FE4F808190E0089588
|
||||
:1004F0008FEF9FEF08959091F9018091F80198177F
|
||||
:1005000050F4E92FF0E0E650FE4F208130E09F5F8D
|
||||
:100510009093F90102C02FEF3FEFC9010895809138
|
||||
:10052000F80190E02091F901821B91090895CF9282
|
||||
:10053000DF92EF92FF920F931F93CF93DF937C0193
|
||||
:10054000262F972F8A0180914102882391F0C62F90
|
||||
:10055000D72F6E01C40ED51ECC15DD0571F0699143
|
||||
:10056000D701ED91FC910190F081E02DC701099533
|
||||
:10057000F3CF642F822F0E949D01C801DF91CF919C
|
||||
:100580001F910F91FF90EF90DF90CF900895CF9340
|
||||
:10059000DF931F92CDB7DEB76983209141022223FA
|
||||
:1005A000D1F020916402203240F021E030E0FC01E3
|
||||
:1005B0003383228380E090E015C080914202E82FCF
|
||||
:1005C000F0E0ED5BFD4F998190838F5F8093420255
|
||||
:1005D0008093640205C061E0CE0101960E949D01F6
|
||||
:1005E00081E090E00F90DF91CF910895089580E031
|
||||
:1005F00090E008950E9420121092F9011092F801E3
|
||||
:1006000010924202109264021092400281E08093A4
|
||||
:100610003F0210921A0261E082E10E94870761E0C6
|
||||
:1006200083E10E948707E9EBF0E080818E7F808381
|
||||
:1006300080818D7F808388E48093B80085E48093F7
|
||||
:10064000BC0008951F920F920FB60F9211242F93A2
|
||||
:100650003F934F935F936F937F938F939F93AF934A
|
||||
:10066000BF93EF93FF9385E692E00E94FF00FF9116
|
||||
:10067000EF91BF91AF919F918F917F916F915F911A
|
||||
:100680004F913F912F910F900FBE0F901F90189593
|
||||
:100690001F920F920FB60F9211242F938F939F9357
|
||||
:1006A000EF93FF93E0917502F09176028081E091E3
|
||||
:1006B0007B02F0917C0282FD12C0908180917E02CB
|
||||
:1006C0008F5F8F7320917F02821751F0E0917E023D
|
||||
:1006D000F0E0EB59FD4F958F80937E0201C0808141
|
||||
:1006E000FF91EF919F918F912F910F900FBE0F90DF
|
||||
:1006F0001F9018951F920F920FB60F9211242F93EF
|
||||
:100700003F934F935F936F937F938F939F93AF9399
|
||||
:10071000BF93EF93FF938091B900887F803609F4EF
|
||||
:100720009CC068F5883209F45BC090F4803109F40C
|
||||
:1007300054C038F4882309F4F6C0883009F44DC059
|
||||
:10074000F6C0883109F44CC0803209F45DC0EFC0B6
|
||||
:10075000803409F468C048F4803309F455C0883304
|
||||
:1007600009F0E5C080933E02D8C0803509F44FC03F
|
||||
:10077000883509F45DC0883409F0D9C0D6C08839FD
|
||||
:1007800009F4C7C0A8F4883709F467C038F488367C
|
||||
:1007900009F463C0803709F460C0C9C0883809F41F
|
||||
:1007A000B8C0803909F45FC0803809F0C0C05BC0B0
|
||||
:1007B000803B09F486C038F4803A09F466C0883A70
|
||||
:1007C00009F47FC0B4C0803C09F4A7C0883C09F498
|
||||
:1007D000A4C0883B09F48AC0AAC080911B0210C043
|
||||
:1007E00090913D0280913C02981770F5E0913D0296
|
||||
:1007F00081E08E0F80933D02F0E0E45EFD4F80814A
|
||||
:100800008093BB0085EC86C080933E028EC0E09151
|
||||
:100810003D0281E08E0F80933D028091BB00F0E0AD
|
||||
:10082000E45EFD4F808390913D0280913C026EC05A
|
||||
:10083000E0913D0281E08E0F80933D028091BB00EC
|
||||
:10084000F0E0E45EFD4F808380913F0281116DC036
|
||||
:1008500081E080931A0284EA61C083E080934002C1
|
||||
:100860001092F501CFCF8091F501803208F051C090
|
||||
:10087000E091F50181E08E0F8093F5018091BB003E
|
||||
:10088000F0E0EB52FE4F8083BDCF85EC8093BC003F
|
||||
:10089000109240028091F501803230F4E091F50130
|
||||
:1008A000F0E0EB52FE4F10826091F50170E0E091B4
|
||||
:1008B000D301F091D40185ED91E009951092F501F5
|
||||
:1008C00036C084E0809340021092D2011092D10190
|
||||
:1008D000E091CF01F091D00109958091D101811172
|
||||
:1008E00005C081E08093D1011092AF01E091D20167
|
||||
:1008F00081E08E0F8093D201F0E0E155FE4F8081C0
|
||||
:100900008093BB009091D2018091D101981708F497
|
||||
:1009100079CF85E88093BC000AC085EC8093BC0049
|
||||
:100920001092400204C010923E020E949301FF9177
|
||||
:10093000EF91BF91AF919F918F917F916F915F9157
|
||||
:100940004F913F912F910F900FBE0F901F901895D0
|
||||
:100950001F920F920FB60F9211242F933F934F9334
|
||||
:100960005F936F937F938F939F93AF93BF93EF9317
|
||||
:10097000FF938091AE0187FF05C010928500109211
|
||||
:1009800084001BC02091AE01022E000C330B80911D
|
||||
:10099000320390E02817390784F48091AE01082EC5
|
||||
:1009A000000C990BFC01EE0FFF1F8E0F9F1FFC0127
|
||||
:1009B000E25FFC4F808186FD15C08091AE018F5FA4
|
||||
:1009C0008093AE012091AE01022E000C330B80917A
|
||||
:1009D000320390E028173907C4F48091AE018C30BF
|
||||
:1009E00064F113C08091AE01082E000C990BFC013C
|
||||
:1009F000EE0FFF1F8E0F9F1FFC01E25FFC4F8081F7
|
||||
:100A000060E08F730E948707D8CF80918400909117
|
||||
:100A10008500049680349C4918F480E49CE905C064
|
||||
:100A20008091840090918500049690938900809332
|
||||
:100A300088008FEF8093AE013BC0209184003091FD
|
||||
:100A400085008091AE01082E000C990BFC01EE0F81
|
||||
:100A5000FF1F8E0F9F1FFC01E25FFC4F818192817F
|
||||
:100A6000820F931F90938900809388008091AE013C
|
||||
:100A7000082E000C990BFC01EE0FFF1F8E0F9F1F1D
|
||||
:100A8000FC01E25FFC4F808186FF12C08091AE01C5
|
||||
:100A9000082E000C990BFC01EE0FFF1F8E0F9F1FFD
|
||||
:100AA000FC01E25FFC4F808161E08F730E94870749
|
||||
:100AB000FF91EF91BF91AF919F918F917F916F9136
|
||||
:100AC0005F914F913F912F910F900FBE0F901F900C
|
||||
:100AD00018951F920F920FB60F9211242F933F93E8
|
||||
:100AE0004F935F936F937F938F939F93AF93BF9336
|
||||
:100AF000EF93FF93E091AC01F091AD01309709F4D1
|
||||
:100B000051C0968DA685B785858591FF04C09C91BF
|
||||
:100B1000892329F447C09C91892309F043C0A38904
|
||||
:100B2000B4899C918589809589238C93868997893E
|
||||
:100B30000197F1F7608D718DA685B785558538E0F1
|
||||
:100B400020E0CB010197F1F7822F90E095958795F2
|
||||
:100B5000282F4C91452309F02068315091F7868D5C
|
||||
:100B600081FD20958091AA0190E001968F739927CD
|
||||
:100B70003091AB01381749F0A091AA01B0E0A65915
|
||||
:100B8000BE4F2C938093AA0103C0868D8160868F0F
|
||||
:100B9000828D938D0197F1F7A389B4899C91858902
|
||||
:100BA000892B8C93FF91EF91BF91AF919F918F9182
|
||||
:100BB0007F916F915F914F913F912F910F900FBE59
|
||||
:100BC0000F901F901895009769F0FC01019000208C
|
||||
:100BD000E9F73197AF01481B590BBC0185E692E05C
|
||||
:100BE0000C948D0080E090E008958F929F92AF92D8
|
||||
:100BF000BF920F931F93CF93DF93CDB7DEB7A1972B
|
||||
:100C00000FB6F894DEBF0FBECDBF19A2423008F474
|
||||
:100C10004AE08E010F5D1F4F842E912CA12CB12C28
|
||||
:100C2000A50194010E94A60EE62FB901CA01015048
|
||||
:100C30001109EA3014F4E05D01C0E95CD801EC93DD
|
||||
:100C4000232B242B252B61F7C8010E94E305A196D5
|
||||
:100C50000FB6F894DEBF0FBECDBFDF91CF911F91CD
|
||||
:100C60000F91BF90AF909F908F900895382F209153
|
||||
:100C7000640290916302213208F049C080914002E1
|
||||
:100C80008111FCCF42E04093400230933F023FEF9E
|
||||
:100C900030933E0210923D0220933C02A3E4B2E066
|
||||
:100CA0004CE152E0FA013E2F341B321718F43D910B
|
||||
:100CB0003193F9CF10921B0220911B02990F922BB6
|
||||
:100CC00090931B0290911A02913061F410921A02D3
|
||||
:100CD00090911B029093BB009091BC0093FDF8CFC4
|
||||
:100CE00095EC01C095EE9093BC009091400292303B
|
||||
:100CF000E1F390913E029F3F79F080913E02803275
|
||||
:100D000041F080913E02803331F084E005C081E003
|
||||
:100D100003C082E001C083E010924202109264029C
|
||||
:100D2000109241020895909140029111FCCF6132DE
|
||||
:100D300008F060E291E09093400290933F022FEF21
|
||||
:100D400020933E0210923D02260F20933C02909386
|
||||
:100D50001B0290911B02880F892B80931B028091AC
|
||||
:100D60001A02813061F410921A0280911B02809362
|
||||
:100D7000BB008091BC0083FDF8CF85EC01C085EEFF
|
||||
:100D80008093BC00809140028130E1F380913D026C
|
||||
:100D9000861710F460913D02ACE1B2E02AEF31E039
|
||||
:100DA000F9018E2F821B861718F48D918193F9CF4C
|
||||
:100DB0001092F9016093F801862F0895CF93DF9385
|
||||
:100DC0009091350321E020934102909363021092A9
|
||||
:100DD000420210926402682F82E093E00E94C702F0
|
||||
:100DE00080E00E943606C82F882379F08CE391E0DA
|
||||
:100DF0000E94E3056C2F70E080E090E04AE00E94E2
|
||||
:100E0000F50588E491E00E94E30562E080913503F6
|
||||
:100E10000E94930682E093E00E947B02EC0182E054
|
||||
:100E200093E00E947B02DD2796E0CC0FDD1F9A95B0
|
||||
:100E3000E1F78F739E01280F311DC901DF91CF911A
|
||||
:100E400008952FB7F8948091B8039091B903A091B9
|
||||
:100E5000BA03B091BB032FBF80939C0390939D0373
|
||||
:100E6000A0939E03B0939F03E0919403F0919503A8
|
||||
:100E70000284F385E02D84E993E0099597FF26C06D
|
||||
:100E80002FB7F8948091B8039091B903A091BA0359
|
||||
:100E9000B091BB032FBF40919C0350919D03609183
|
||||
:100EA0009E0370919F03841B950BA60BB70B40917B
|
||||
:100EB00098035091990360919A0370919B03841752
|
||||
:100EC0009507A607B70780F28FEF9FEF089560E0C0
|
||||
:100ED00082E093E00C94C702CF93C62F90919303C6
|
||||
:100EE00021E02093410290936302109242021092FB
|
||||
:100EF0006402682F82E093E00E94C7026C2F82E0B8
|
||||
:100F000093E00E94C70281E0CF910C94360690E0F6
|
||||
:100F1000FC01EE58FF4F3491FC01E255FF4F249144
|
||||
:100F2000FC01E656FF4FE491EE2309F43BC0332366
|
||||
:100F300039F1333091F038F43130A9F0323001F525
|
||||
:100F400084B58F7D12C0373091F03830A1F0343045
|
||||
:100F5000B9F4809180008F7D03C0809180008F77ED
|
||||
:100F6000809380000DC084B58F7784BD09C08091C7
|
||||
:100F7000B0008F7703C08091B0008F7D8093B00068
|
||||
:100F8000F0E0EE0FFF1FEA57FF4FA591B4918FB726
|
||||
:100F9000F894EC91611103C020952E2301C02E2BF3
|
||||
:100FA0002C938FBF0895CF93DF9390E0FC01E2551F
|
||||
:100FB000FF4F2491FC01E656FF4F8491882361F195
|
||||
:100FC00090E0880F991FFC01E859FF4FC591D4911B
|
||||
:100FD000FC01EA57FF4FA591B491611109C09FB779
|
||||
:100FE000F8948881209582238883EC912E230BC06E
|
||||
:100FF000623061F49FB7F8943881822F8095832303
|
||||
:101000008883EC912E2B2C939FBF06C08FB7F8944A
|
||||
:10101000E8812E2B28838FBFDF91CF9108953FB7B2
|
||||
:10102000F8948091B4039091B503A091B603B09168
|
||||
:10103000B70326B5A89B05C02F3F19F00196A11D47
|
||||
:10104000B11D3FBFBA2FA92F982F8827820F911D5E
|
||||
:10105000A11DB11DBC01CD0142E0660F771F881FA5
|
||||
:10106000991F4A95D1F708951F920F920FB60F92CC
|
||||
:1010700011242F933F938F939F93AF93BF938091AE
|
||||
:10108000B8039091B903A091BA03B091BB0330911A
|
||||
:10109000B30323E0230F2D3720F40196A11DB11DCA
|
||||
:1010A00005C026E8230F0296A11DB11D2093B303AE
|
||||
:1010B0008093B8039093B903A093BA03B093BB0392
|
||||
:1010C0008091B4039091B503A091B603B091B7039A
|
||||
:1010D0000196A11DB11D8093B4039093B503A09315
|
||||
:1010E000B603B093B703BF91AF919F918F913F919A
|
||||
:1010F0002F910F900FBE0F901F9018950F931F9375
|
||||
:10110000CF93DF93EC0188819981009729F02A81A0
|
||||
:101110003B812617370788F48B016F5F7F4F0E9452
|
||||
:101120005611009761F0998388831B830A832C8171
|
||||
:101130003D81232B11F4FC01108281E001C080E08D
|
||||
:10114000DF91CF911F910F910895CF93DF93CDB78A
|
||||
:10115000DEB728970FB6F894DEBF0FBECDBF7894E8
|
||||
:1011600084B5826084BD84B5816084BD85B58260AC
|
||||
:1011700085BD85B5816085BD80916E00816080935D
|
||||
:101180006E001092810080918100826080938100C6
|
||||
:1011900080918100816080938100809180008160D6
|
||||
:1011A000809380008091B10084608093B100809131
|
||||
:1011B000B00081608093B00080917A008460809359
|
||||
:1011C0007A0080917A00826080937A0080917A0020
|
||||
:1011D000816080937A0080917A00806880937A00A1
|
||||
:1011E0001092C100E0917502F091760282E0808356
|
||||
:1011F000E0917102F09172021082E0917302F0911D
|
||||
:1012000074028FEC808310927D02E0917902F0915C
|
||||
:101210007A0286E08083E0917702F0917802808103
|
||||
:1012200080618083E0917702F0917802808188600C
|
||||
:101230008083E0917702F0917802808180688083DA
|
||||
:10124000E0917702F091780280818F7D808382E047
|
||||
:1012500093E090935703809356030E94FC0282E030
|
||||
:1012600093E00E94FC0260E080E00E946C0780E452
|
||||
:1012700096E090935A03809359038091930391E0F1
|
||||
:101280009093410280936302109242021092640292
|
||||
:1012900060E082E093E00E94C70281E00E9436068F
|
||||
:1012A00061E0809193030E94930682E093E00E94A4
|
||||
:1012B0007B02182F682F6F76606180E00E946C07B8
|
||||
:1012C00063E08EEF0E946C07612F80E00E946C0744
|
||||
:1012D0000E940F084B015C0195E0C92ED12CE12C36
|
||||
:1012E000F12C0E940F08DC01CB0188199909AA0989
|
||||
:1012F000BB09883E9340A105B10558F021E0C21A10
|
||||
:10130000D108E108F10888EE880E83E0981EA11C40
|
||||
:10131000B11CC114D104E104F10419F7612F616A11
|
||||
:1013200080E00E946C0716E001E080919303009337
|
||||
:101330004102809363021092420210926402612F74
|
||||
:1013400082E093E00E94C7020E9467070E9467073D
|
||||
:101350000E9467070E94670781E00E9436061C5FB3
|
||||
:10136000163419F70091540310915503F8012285A2
|
||||
:101370003385AAE0B0E00E94C80E9B01AC01C12CED
|
||||
:1013800087E8D82E83E9E82E83E0F82EC701B6015E
|
||||
:101390000E94A60EF801208331834283538300917B
|
||||
:1013A000520310915303F80122853385AAE0B0E07F
|
||||
:1013B0000E94C80E9B01AC01C701B6010E94A60E97
|
||||
:1013C000F801208331834283538380914F038C3013
|
||||
:1013D00008F051C061E088E00E94D30780914F037C
|
||||
:1013E000E82FF0E09F01220F331FE20FF31FE25FAF
|
||||
:1013F000FC4F9081907C98609083109250031092E3
|
||||
:1014000051036CE00E94EF0FFCE08F9FB0011124AC
|
||||
:1014100040E050E09A01260F371FF901EE0FFF1F41
|
||||
:101420002E0F3F1FF901E25FFC4F908196FD16C021
|
||||
:101430004F5F5F4F4C30510569F781110FC010921B
|
||||
:10144000800082E0809381001092850010928400D9
|
||||
:10145000B19A80916F00826080936F00E0914F039A
|
||||
:10146000F0E0CF01880F991FE80FF91FE25FFC4FF2
|
||||
:1014700080818064808382E093E00E94FC0211E01E
|
||||
:1014800010933303109234031092390310923A03ED
|
||||
:1014900010923B0310923C0386E10E94DE0690937B
|
||||
:1014A0003803809337038091350310934102809372
|
||||
:1014B0006302109242021092640265E182E093E0BE
|
||||
:1014C0000E94C70280E00E943606182F882379F018
|
||||
:1014D0008CE391E00E94E305612F70E080E090E0F2
|
||||
:1014E0004AE00E94F50588E491E00E94E30561E08E
|
||||
:1014F000809135030E94930682E093E00E947B0274
|
||||
:101500008093360310923D0310923E0310923F03E6
|
||||
:101510001092400310924E0310924D038BEA9AEA08
|
||||
:10152000AAEABEE38093490390934A03A0934B0336
|
||||
:10153000B0934C0322242394312C02E010E084E980
|
||||
:1015400093E00E943202892B09F448C01A82198262
|
||||
:101550001C821B821E821D8260E070E0CE0101961B
|
||||
:101560000E947E0829813A8181110DC02115310523
|
||||
:1015700019F0C9010E94BE101A8219821E821D82B2
|
||||
:101580001C821B8223C01E821D826AE471E0C90195
|
||||
:101590000E942E121BC08F831886ED80FE802FEFD5
|
||||
:1015A000E21AF20AB701CE0101960E947E08882352
|
||||
:1015B00069F029813A818D819E81BE01695F7F4FEB
|
||||
:1015C000820F931F0E942E12FE82ED820E9421073D
|
||||
:1015D00097FFE1CF89819A810E94BE1085E692E053
|
||||
:1015E0000E94E90080913403882341F08EEF0E942D
|
||||
:1015F000DE066FEF7FE3681B790B04C08EEF0E945D
|
||||
:10160000DE06BC0180E090E00E94500D609339033B
|
||||
:1016100070933A0380933B0390933C0320E030E0C7
|
||||
:1016200040E858E30E94B10D20E030E044EB53E481
|
||||
:101630000E94B10D6B017C014B015C019B01AC016F
|
||||
:101640000E94EA0F882319F08BE491E01AC026016A
|
||||
:101650003701E89477F82FEF3FEF4FE75FE7C301DB
|
||||
:10166000B2010E94EA0F81110FC02FEF3FEF4FE749
|
||||
:101670005FE7C301B2010E944B0D18162CF48FE4F2
|
||||
:1016800091E00E94E3058CC02FEF3FEF4FE75FE44E
|
||||
:10169000C701B6010E94E50F18161CF483E591E01E
|
||||
:1016A000F0CF2FEF3FEF4FE75FECC701B6010E948D
|
||||
:1016B0004B0D87FDF3CF20E030E0A901C701B60153
|
||||
:1016C0000E944B0D87FF11C0E0916502F091660208
|
||||
:1016D0000190F081E02D6DE285E692E009954601EA
|
||||
:1016E0005701B7FAB094B7F8B0949AE0F92E60E0D9
|
||||
:1016F00070E080E09FE320E030E040E251E40E94AF
|
||||
:10170000440FFA94F110F7CF9B01AC01C501B4016D
|
||||
:101710000E94D80E6B017C010E94B60F4B015C0148
|
||||
:101720000E94500D9B01AC01C701B6010E94D70E6B
|
||||
:101730006B017C014AE0C501B4010E94F505E0910E
|
||||
:101740006502F09166020190F081E02D6EE285E67F
|
||||
:1017500092E009958BE0B82EBA94BB2009F120E005
|
||||
:1017600030E040E251E4C701B6010E94B10D2B0107
|
||||
:101770003C010E94B60F6B01E12CF12C4AE0C7013D
|
||||
:10178000B6010E94F505C701B6010E94500D9B01EC
|
||||
:10179000AC01C301B2010E94D70E6B017C01DCCF0A
|
||||
:1017A00088E491E00E94E3058091F6019091F701B1
|
||||
:1017B000009739F0019789F41093F7010093F6012F
|
||||
:1017C0000CC087E591E00E94E30588E491E00E9467
|
||||
:1017D000E3053092F7012092F6010E948901AFCE15
|
||||
:1017E0008EE291E090939503809394038091AC01F5
|
||||
:1017F0009091AD018459934071F4E091A703F09169
|
||||
:10180000A80390818091A9038095892380831092F9
|
||||
:10181000AD011092AC010895109268021092670217
|
||||
:1018200088EE93E0A0E0B0E08093690290936A02B2
|
||||
:10183000A0936B02B0936C022AE031E03093660211
|
||||
:101840002093650225EC30E0309372022093710200
|
||||
:1018500024EC30E0309374022093730220EC30E0EB
|
||||
:10186000309376022093750221EC30E030937802B9
|
||||
:101870002093770222EC30E030937A0220937902B1
|
||||
:1018800026EC30E030937C0220937B0210927E02A3
|
||||
:1018900010927F0210928002109281021092050332
|
||||
:1018A000109204038093060390930703A093080308
|
||||
:1018B000B09309032CE131E030930303209302033A
|
||||
:1018C0001092970310929603809398039093990334
|
||||
:1018D000A0939A03B0939B038EE291E090939503BB
|
||||
:1018E000809394031092AB031092AA031092AD035D
|
||||
:1018F0001092AC031092AF031092AE031092B1039A
|
||||
:101900001092B0036091B2036E7F6D7F6093B2035B
|
||||
:101910006695617081E0682784E00E94870761E036
|
||||
:1019200084E00E94D307E2EBF0E0E491E093A403AB
|
||||
:10193000EEE9F0E0E491F0E0EE0FFF1FEA57FF4F11
|
||||
:10194000859194919093A6038093A50360E082E033
|
||||
:101950000E94D3078091B20381FD04C061E082E060
|
||||
:101960000E94870782E08093A003E0EBF0E0E4911F
|
||||
:10197000E093A103ECE9F0E0E491F0E0EE0FFF1F4B
|
||||
:10198000E057FF4F859194919093A3038093A20316
|
||||
:10199000EDE5F3E01282118213821082DF011197CC
|
||||
:1019A0001C9211971C92369683E0E537F80791F761
|
||||
:1019B00086E593E010927F031092820310928F03CA
|
||||
:1019C00021E6209358032093930321E02093920370
|
||||
:1019D00028EC30E030938E0320938D039093910395
|
||||
:1019E0008093900342E04093870347E040938A034B
|
||||
:1019F00044E04093880343E04093890345E04093EB
|
||||
:101A00008B0346E040938C0343E853E05093550327
|
||||
:101A10004093540330937E0320937D03909381037E
|
||||
:101A20008093800388E0809377038DE080937A032E
|
||||
:101A30008AE08093780389E0809379038BE0809338
|
||||
:101A40007B038CE080937C0383E793E090935303C4
|
||||
:101A500080935203809132038C30A0F491E0980F70
|
||||
:101A60009093320380934F0390E0FC01EE0FFF1F31
|
||||
:101A70008E0F9F1FFC01E25FFC4F88EB9BE092837F
|
||||
:101A8000818303C08FEF80934F0380E480933503FD
|
||||
:101A90001092330308950E948D0D08F481E008959B
|
||||
:101AA000E89409C097FB3EF49095809570956195F8
|
||||
:101AB0007F4F8F4F9F4F9923A9F0F92F96E9BB27AE
|
||||
:101AC0009395F695879577956795B795F111F8CF2A
|
||||
:101AD000FAF4BB0F11F460FF1BC06F5F7F4F8F4F95
|
||||
:101AE0009F4F16C0882311F096E911C0772321F08B
|
||||
:101AF0009EE8872F762F05C0662371F096E8862F23
|
||||
:101B000070E060E02AF09A95660F771F881FDAF779
|
||||
:101B1000880F9695879597F90895990F0008550FA6
|
||||
:101B2000AA0BE0E8FEEF16161706E807F907C0F063
|
||||
:101B300012161306E407F50798F0621B730B840B6B
|
||||
:101B4000950B39F40A2661F0232B242B252B21F445
|
||||
:101B500008950A2609F4A140A6958FEF811D811DE5
|
||||
:101B600008950E94C40D0C94350E0E94270E38F083
|
||||
:101B70000E942E0E20F0952311F00C941E0E0C9452
|
||||
:101B8000240E11240C94690E0E94460E70F3959F4A
|
||||
:101B9000C1F3950F50E0551F629FF001729FBB2764
|
||||
:101BA000F00DB11D639FAA27F00DB11DAA1F649F00
|
||||
:101BB0006627B00DA11D661F829F2227B00DA11DB3
|
||||
:101BC000621F739FB00DA11D621F839FA00D611D39
|
||||
:101BD000221F749F3327A00D611D231F849F600D5A
|
||||
:101BE000211D822F762F6A2F11249F5750409AF083
|
||||
:101BF000F1F088234AF0EE0FFF1FBB1F661F771F0F
|
||||
:101C0000881F91505040A9F79E3F510580F00C94D9
|
||||
:101C10001E0E0C94690E5F3FE4F3983ED4F3869554
|
||||
:101C200077956795B795F795E7959F5FC1F7FE2B79
|
||||
:101C3000880F911D9695879597F9089597F99F6755
|
||||
:101C400080E870E060E008959FEF80EC0895002444
|
||||
:101C50000A941616170618060906089500240A9411
|
||||
:101C600012161306140605060895092E0394000C97
|
||||
:101C700011F4882352F0BB0F40F4BF2B11F460FF26
|
||||
:101C800004C06F5F7F4F8F4F9F4F089557FD90584F
|
||||
:101C9000440F551F59F05F3F71F04795880F97FB30
|
||||
:101CA000991F61F09F3F79F08795089512161306EA
|
||||
:101CB0001406551FF2CF4695F1DF08C01616170619
|
||||
:101CC0001806991FF1CF869571056105089408954E
|
||||
:101CD000E894BB2766277727CB0197F908952F92C1
|
||||
:101CE0003F924F925F926F927F928F929F92AF92AC
|
||||
:101CF000BF92CF92DF92EF92FF920F931F93CF93F9
|
||||
:101D0000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF8F
|
||||
:101D10000FBECDBF09942A88398848885F846E84B5
|
||||
:101D20007D848C849B84AA84B984C884DF80EE80FF
|
||||
:101D3000FD800C811B81AA81B981CE0FD11D0FB608
|
||||
:101D4000F894DEBF0FBECDBFED010895A1E21A2EBB
|
||||
:101D5000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F4F
|
||||
:101D6000A217B307E407F50720F0A21BB30BE40B9F
|
||||
:101D7000F50B661F771F881F991F1A9469F76095E6
|
||||
:101D80007095809590959B01AC01BD01CF010895A0
|
||||
:101D9000A29FB001B39FC001A39F700D811D1124AC
|
||||
:101DA000911DB29F700D811D1124911D08955058F1
|
||||
:101DB000BB27AA270E94EF0E0C94350E0E94270E17
|
||||
:101DC00038F00E942E0E20F039F49F3F19F426F4CB
|
||||
:101DD0000C94240E0EF4E095E7FB0C941E0EE92FF4
|
||||
:101DE0000E94460E58F3BA176207730784079507D7
|
||||
:101DF00020F079F4A6F50C94680E0EF4E0950B2E05
|
||||
:101E0000BA2FA02D0B01B90190010C01CA01A0014C
|
||||
:101E10001124FF27591B99F0593F50F4503E68F1A7
|
||||
:101E20001A16F040A22F232F342F4427585FF3CFE8
|
||||
:101E3000469537952795A795F0405395C9F77EF4B9
|
||||
:101E40001F16BA0B620B730B840BBAF09150A1F002
|
||||
:101E5000FF0FBB1F661F771F881FC2F70EC0BA0F88
|
||||
:101E6000621F731F841F48F4879577956795B79510
|
||||
:101E7000F7959E3F08F0B0CF9395880F08F099270B
|
||||
:101E8000EE0F9795879508950E94580F0C94350E84
|
||||
:101E90000E942E0E58F00E94270E40F029F45F3F5A
|
||||
:101EA00029F00C941E0E51110C94690E0C94240E02
|
||||
:101EB0000E94460E68F39923B1F3552391F3951BC5
|
||||
:101EC000550BBB27AA2762177307840738F09F5F5B
|
||||
:101ED0005F4F220F331F441FAA1FA9F335D00E2EC8
|
||||
:101EE0003AF0E0E832D091505040E695001CCAF735
|
||||
:101EF0002BD0FE2F29D0660F771F881FBB1F2617F8
|
||||
:101F000037074807AB07B0E809F0BB0B802DBF01CE
|
||||
:101F1000FF2793585F4F3AF09E3F510578F00C949D
|
||||
:101F20001E0E0C94690E5F3FE4F3983ED4F3869541
|
||||
:101F300077956795B795F7959F5FC9F7880F911DBE
|
||||
:101F40009695879597F90895E1E0660F771F881FAA
|
||||
:101F5000BB1F621773078407BA0720F0621B730B5D
|
||||
:101F6000840BBA0BEE1F88F7E09508950E944E0E81
|
||||
:101F700088F09F5798F0B92F9927B751B0F0E1F04A
|
||||
:101F8000660F771F881F991F1AF0BA95C9F714C0FA
|
||||
:101F9000B13091F00E94680EB1E008950C94680E83
|
||||
:101FA000672F782F8827B85F39F0B93FCCF3869533
|
||||
:101FB00077956795B395D9F73EF490958095709590
|
||||
:101FC00061957F4F8F4F9F4F08950E948D0D08F4AC
|
||||
:101FD0008FEF08950E948D0D880B990B0895991B22
|
||||
:101FE00079E004C0991F961708F0961B881F7A9510
|
||||
:101FF000C9F78095089597FB072E16F4009407D033
|
||||
:1020000077FD09D00E940F1007FC05D03EF4909593
|
||||
:1020100081959F4F0895709561957F4F0895AA1BF4
|
||||
:10202000BB1B51E107C0AA1FBB1FA617B70710F0C3
|
||||
:10203000A61BB70B881F991F5A95A9F780959095F5
|
||||
:10204000BC01CD010895EE0FFF1F0590F491E02D26
|
||||
:102050000994CF93DF938230910510F482E090E0F1
|
||||
:10206000E091BE03F091BF0320E030E0C0E0D0E09B
|
||||
:10207000309711F14081518148175907C0F0481736
|
||||
:10208000590761F482819381209719F09B838A8399
|
||||
:102090002BC09093BF038093BE0326C0211531054A
|
||||
:1020A00019F04217530718F49A01BE01DF01EF013E
|
||||
:1020B0000280F381E02DDCCF2115310509F1281BC9
|
||||
:1020C000390B2430310590F412968D919C91139721
|
||||
:1020D0006115710521F0FB019383828304C0909305
|
||||
:1020E000BF038093BE03FD01329644C0FD01E20FA1
|
||||
:1020F000F31F81939193225031092D933C933AC061
|
||||
:102100002091BC033091BD03232B41F420910201A7
|
||||
:10211000309103013093BD032093BC032091000153
|
||||
:10212000309101012115310541F42DB73EB74091A1
|
||||
:10213000040150910501241B350BE091BC03F09183
|
||||
:10214000BD03E217F307A0F42E1B3F0B2817390736
|
||||
:1021500078F0AC014E5F5F4F2417350748F04E0F03
|
||||
:102160005F1F5093BD034093BC038193919302C0C2
|
||||
:10217000E0E0F0E0CF01DF91CF9108950F931F933E
|
||||
:10218000CF93DF93009709F48CC0FC013297138240
|
||||
:1021900012820091BE031091BF030115110581F455
|
||||
:1021A00020813181820F931F2091BC033091BD03A8
|
||||
:1021B0002817390779F5F093BD03E093BC0371C08C
|
||||
:1021C000D80140E050E0AE17BF0750F412962D91B1
|
||||
:1021D0003C911397AD012115310509F1D901F3CFD8
|
||||
:1021E0009D01DA013383228360817181860F971FFD
|
||||
:1021F0008217930769F4EC0128813981260F371F74
|
||||
:102200002E5F3F4F318320838A819B81938382831A
|
||||
:10221000452B29F4F093BF03E093BE0342C013960D
|
||||
:10222000FC93EE931297ED01499159919E01240F71
|
||||
:10223000351FE217F30771F480819181840F951F98
|
||||
:10224000029611969C938E938281938113969C9310
|
||||
:102250008E931297E0E0F0E0D80112968D919C9158
|
||||
:102260001397009719F0F8018C01F6CF8D919C918E
|
||||
:1022700098012E5F3F4F820F931F2091BC03309136
|
||||
:10228000BD032817390769F4309729F41092BF036A
|
||||
:102290001092BE0302C0138212821093BD030093FA
|
||||
:1022A000BC03DF91CF911F910F910895A0E0B0E0A2
|
||||
:1022B000ECE5F1E10C94730EEC01009721F4CB01F5
|
||||
:1022C0000E942910B8C0FC01E60FF71F9C012250A4
|
||||
:1022D0003109E217F30708F4ACC0D9010D911C9144
|
||||
:1022E000119706171707B0F00530110508F49FC0C5
|
||||
:1022F000C80104978617970708F499C0025011097E
|
||||
:10230000061B170B019311936D937C93CF010E94D1
|
||||
:10231000BE108DC05B01A01AB10A4C01800E911E47
|
||||
:10232000A091BE03B091BF0340E050E0E12CF12C3E
|
||||
:10233000109709F44AC0A815B905D1F56D907C90A5
|
||||
:102340001197630182E0C80ED11CCA14DB0480F12E
|
||||
:10235000A3014A195B096A0182E0C80ED11C1296DA
|
||||
:10236000BC9012971396AC91B5E0CB16D10440F017
|
||||
:10237000B282A38351834083D9016D937C930AC0B9
|
||||
:102380000E5F1F4FC301800F911FF901918380835E
|
||||
:10239000EB2DFA2FE114F10431F0D7011396FC93E1
|
||||
:1023A000EE93129744C0F093BF03E093BE033FC087
|
||||
:1023B0008D919C9111974817590708F4AC017D0144
|
||||
:1023C00012960D90BC91A02DB3CF8091BC0390913B
|
||||
:1023D000BD0388159905E1F446175707C8F48091A5
|
||||
:1023E000000190910101009741F48DB79EB7409193
|
||||
:1023F000040150910501841B950BE817F907C8F4F7
|
||||
:10240000F093BD03E093BC03F901718360830FC0B7
|
||||
:10241000CB010E9429107C01009759F0A801BE0150
|
||||
:102420000E942512CE010E94BE10C70104C0CE0139
|
||||
:1024300002C080E090E0CDB7DEB7EEE00C948F0EE6
|
||||
:1024400081E090E0F8940C943512FB01DC0102C0AD
|
||||
:1024500001900D9241505040D8F70895FB01DC01E6
|
||||
:1024600001900D920020E1F7089510E0C2E6D0E05F
|
||||
:1024700004C0FE010E9423102196C336D107C9F77C
|
||||
:04248000F894FFCFFE
|
||||
:102484000000C00380000000000020018D00B8009F
|
||||
:102494006701E900C700DB0000000000C7029702E3
|
||||
:1024A400F7026B028F027B026C0200000000DE0167
|
||||
:1024B4008D00F702DD0132024A02C5014932432090
|
||||
:1024C4006572726F723A20000D0A006E616E0069C7
|
||||
:1024D4006E66006F76660073746174652073776945
|
||||
:0A24E40074636820302D3E310000C3
|
||||
:00000001FF
|
Reference in New Issue
Block a user