Lib LTC2944

Fork of LTC2944 by ltc2944_team

Committer:
gr66
Date:
Tue Feb 28 12:26:56 2017 +0000
Revision:
0:ec69fa9832e5
Exemple de classe

Who changed what in which revision?

UserRevisionLine numberNew 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 }