Exemple de test
Fork of AS5600 by
AS5600.cpp@0:ec69fa9832e5, 2017-02-28 (annotated)
- Committer:
- gr66
- Date:
- Tue Feb 28 12:26:56 2017 +0000
- Revision:
- 0:ec69fa9832e5
Exemple de classe
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gr66 | 0:ec69fa9832e5 | 1 | // AS5600 Verson 1.3 |
gr66 | 0:ec69fa9832e5 | 2 | // 20/03/2015 GR : fonction limitant la dynamique autour de zero à -max , +max |
gr66 | 0:ec69fa9832e5 | 3 | #include "AS5600.h" |
gr66 | 0:ec69fa9832e5 | 4 | //#include "mbed.h" |
gr66 | 0:ec69fa9832e5 | 5 | |
gr66 | 0:ec69fa9832e5 | 6 | |
gr66 | 0:ec69fa9832e5 | 7 | |
gr66 | 0:ec69fa9832e5 | 8 | AS5600::AS5600(PinName sda, PinName scl) : i2c(sda,scl) |
gr66 | 0:ec69fa9832e5 | 9 | { |
gr66 | 0:ec69fa9832e5 | 10 | addresse=0x36; |
gr66 | 0:ec69fa9832e5 | 11 | i2c.frequency(400000); |
gr66 | 0:ec69fa9832e5 | 12 | } |
gr66 | 0:ec69fa9832e5 | 13 | int AS5600::isMagnetPresent() |
gr66 | 0:ec69fa9832e5 | 14 | { |
gr66 | 0:ec69fa9832e5 | 15 | char cmd=0x0B,data=0,value=0; |
gr66 | 0:ec69fa9832e5 | 16 | data=this->read(cmd); |
gr66 | 0:ec69fa9832e5 | 17 | value=(char) (data & 0x20) >> 5 ; |
gr66 | 0:ec69fa9832e5 | 18 | |
gr66 | 0:ec69fa9832e5 | 19 | return value; |
gr66 | 0:ec69fa9832e5 | 20 | } |
gr66 | 0:ec69fa9832e5 | 21 | |
gr66 | 0:ec69fa9832e5 | 22 | |
gr66 | 0:ec69fa9832e5 | 23 | int AS5600::getAngleAbsolute() |
gr66 | 0:ec69fa9832e5 | 24 | { |
gr66 | 0:ec69fa9832e5 | 25 | char cmd1=0x0E,cmd2=0x0F; |
gr66 | 0:ec69fa9832e5 | 26 | int data=0; |
gr66 | 0:ec69fa9832e5 | 27 | |
gr66 | 0:ec69fa9832e5 | 28 | data=this->read(cmd1) << 8; |
gr66 | 0:ec69fa9832e5 | 29 | data=data+this->read(cmd2); |
gr66 | 0:ec69fa9832e5 | 30 | |
gr66 | 0:ec69fa9832e5 | 31 | return data; |
gr66 | 0:ec69fa9832e5 | 32 | } |
gr66 | 0:ec69fa9832e5 | 33 | |
gr66 | 0:ec69fa9832e5 | 34 | int AS5600::getAngleRelative() |
gr66 | 0:ec69fa9832e5 | 35 | { |
gr66 | 0:ec69fa9832e5 | 36 | return ((this->getAngleAbsolute() + (2047 - relative_zero)) % 4096) - 2047; |
gr66 | 0:ec69fa9832e5 | 37 | } |
gr66 | 0:ec69fa9832e5 | 38 | |
gr66 | 0:ec69fa9832e5 | 39 | |
gr66 | 0:ec69fa9832e5 | 40 | float AS5600::getAngleDegrees() |
gr66 | 0:ec69fa9832e5 | 41 | { |
gr66 | 0:ec69fa9832e5 | 42 | return ((float)this->getAngleRelative() * 180) / 2048 ; |
gr66 | 0:ec69fa9832e5 | 43 | } |
gr66 | 0:ec69fa9832e5 | 44 | |
gr66 | 0:ec69fa9832e5 | 45 | void AS5600::setZero() |
gr66 | 0:ec69fa9832e5 | 46 | { |
gr66 | 0:ec69fa9832e5 | 47 | relative_zero=0; |
gr66 | 0:ec69fa9832e5 | 48 | relative_zero=this->getAngleAbsolute(); |
gr66 | 0:ec69fa9832e5 | 49 | } |
gr66 | 0:ec69fa9832e5 | 50 | |
gr66 | 0:ec69fa9832e5 | 51 | |
gr66 | 0:ec69fa9832e5 | 52 | char AS5600::read(char address) |
gr66 | 0:ec69fa9832e5 | 53 | { |
gr66 | 0:ec69fa9832e5 | 54 | char retval; |
gr66 | 0:ec69fa9832e5 | 55 | i2c.write(addresse * 2, &address, 1); |
gr66 | 0:ec69fa9832e5 | 56 | i2c.read(addresse * 2, &retval, 1); |
gr66 | 0:ec69fa9832e5 | 57 | return retval; |
gr66 | 0:ec69fa9832e5 | 58 | } |
gr66 | 0:ec69fa9832e5 | 59 | |
gr66 | 0:ec69fa9832e5 | 60 | void AS5600::init() |
gr66 | 0:ec69fa9832e5 | 61 | { |
gr66 | 0:ec69fa9832e5 | 62 | |
gr66 | 0:ec69fa9832e5 | 63 | for (int i=0; i<100; i++) |
gr66 | 0:ec69fa9832e5 | 64 | this->setZero(); |
gr66 | 0:ec69fa9832e5 | 65 | |
gr66 | 0:ec69fa9832e5 | 66 | } |
gr66 | 0:ec69fa9832e5 | 67 | |
gr66 | 0:ec69fa9832e5 | 68 | float AS5600::getAngleMinMax(float angleMax) |
gr66 | 0:ec69fa9832e5 | 69 | { |
gr66 | 0:ec69fa9832e5 | 70 | static unsigned char etat=0; // etat de l'automate |
gr66 | 0:ec69fa9832e5 | 71 | static int anglePrec=0; // angle precedent |
gr66 | 0:ec69fa9832e5 | 72 | float angle=0; // angle courant |
gr66 | 0:ec69fa9832e5 | 73 | float angleX=0; //angle en sortie borne |
gr66 | 0:ec69fa9832e5 | 74 | // |
gr66 | 0:ec69fa9832e5 | 75 | angle=this->getAngleDegrees(); // lecture de l'angle courant |
gr66 | 0:ec69fa9832e5 | 76 | switch(etat) { |
gr66 | 0:ec69fa9832e5 | 77 | case 0 : // angle compris entre min et max |
gr66 | 0:ec69fa9832e5 | 78 | angleX = angle; |
gr66 | 0:ec69fa9832e5 | 79 | if(angle > angleMax) etat = 2; |
gr66 | 0:ec69fa9832e5 | 80 | if(angle < -angleMax) etat = 1; |
gr66 | 0:ec69fa9832e5 | 81 | break; |
gr66 | 0:ec69fa9832e5 | 82 | case 1 : // angle inferieur a -max |
gr66 | 0:ec69fa9832e5 | 83 | angleX = -angleMax; |
gr66 | 0:ec69fa9832e5 | 84 | if((anglePrec <= -angleMax) && (angle >= -angleMax) && (angle < 0)) etat = 0; |
gr66 | 0:ec69fa9832e5 | 85 | break; |
gr66 | 0:ec69fa9832e5 | 86 | case 2 : |
gr66 | 0:ec69fa9832e5 | 87 | angleX = angleMax; |
gr66 | 0:ec69fa9832e5 | 88 | if((anglePrec >= angleMax) && (angle <= angleMax) && (angle > 0))etat = 0; |
gr66 | 0:ec69fa9832e5 | 89 | break; |
gr66 | 0:ec69fa9832e5 | 90 | default : |
gr66 | 0:ec69fa9832e5 | 91 | break; |
gr66 | 0:ec69fa9832e5 | 92 | } |
gr66 | 0:ec69fa9832e5 | 93 | anglePrec=angle; |
gr66 | 0:ec69fa9832e5 | 94 | return angleX; |
gr66 | 0:ec69fa9832e5 | 95 | } |