HMC5882 from BlazeX

Dependents:   Sensor_test Algoritmo_Fuzzy

Committer:
caroe
Date:
Wed May 30 10:45:00 2012 +0000
Revision:
0:a5e06bb74915

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caroe 0:a5e06bb74915 1 #include "mbed.h"
caroe 0:a5e06bb74915 2 #include "HMC5883.h"
caroe 0:a5e06bb74915 3
caroe 0:a5e06bb74915 4 #define I2CADR_W(ADR) (ADR<<1&0xFE)
caroe 0:a5e06bb74915 5 #define I2CADR_R(ADR) (ADR<<1|0x01)
caroe 0:a5e06bb74915 6
caroe 0:a5e06bb74915 7 //Initialisieren
caroe 0:a5e06bb74915 8 HMC5883::HMC5883(I2C & I2CBus_, Timer & GlobalTime_) :
caroe 0:a5e06bb74915 9 I2CBus(I2CBus_),
caroe 0:a5e06bb74915 10 GlobalTime(GlobalTime_)
caroe 0:a5e06bb74915 11
caroe 0:a5e06bb74915 12 {}
caroe 0:a5e06bb74915 13
caroe 0:a5e06bb74915 14 void HMC5883::Init()
caroe 0:a5e06bb74915 15 {
caroe 0:a5e06bb74915 16 //Nullsetzen
caroe 0:a5e06bb74915 17 MeasurementError= 0;
caroe 0:a5e06bb74915 18 AutoCalibration= 0;
caroe 0:a5e06bb74915 19 #pragma unroll
caroe 0:a5e06bb74915 20 for(int i= 0; i < 3; i++)
caroe 0:a5e06bb74915 21 {
caroe 0:a5e06bb74915 22 RawMin[i]= -400;
caroe 0:a5e06bb74915 23 RawMax[i]= 400;
caroe 0:a5e06bb74915 24 Offset[i]= 0;
caroe 0:a5e06bb74915 25 Scale[i]= 1.0;
caroe 0:a5e06bb74915 26 RawMag[i]= 0;
caroe 0:a5e06bb74915 27 Mag[i]= 0;
caroe 0:a5e06bb74915 28 }
caroe 0:a5e06bb74915 29
caroe 0:a5e06bb74915 30
caroe 0:a5e06bb74915 31 //HMC5883 initialisieren
caroe 0:a5e06bb74915 32 char tx[4];
caroe 0:a5e06bb74915 33
caroe 0:a5e06bb74915 34 //1 Sample pro Messung
caroe 0:a5e06bb74915 35 //75Hz Output Rate
caroe 0:a5e06bb74915 36 //Range: +- 1.3 Gauss
caroe 0:a5e06bb74915 37 //Continuous-Measurement Mode
caroe 0:a5e06bb74915 38 tx[0]= 0x00;
caroe 0:a5e06bb74915 39 tx[1]= 0x78; //Configuration Register A
caroe 0:a5e06bb74915 40 tx[2]= 0x20; //Configuration Register B
caroe 0:a5e06bb74915 41 tx[3]= 0x00; //Mode Register
caroe 0:a5e06bb74915 42 I2CBus.write(I2CADR_W(HMC5883_ADRESS), tx, 4);
caroe 0:a5e06bb74915 43
caroe 0:a5e06bb74915 44
caroe 0:a5e06bb74915 45 Update();
caroe 0:a5e06bb74915 46 }
caroe 0:a5e06bb74915 47
caroe 0:a5e06bb74915 48 //Rohdaten lesen
caroe 0:a5e06bb74915 49 void HMC5883::ReadRawData()
caroe 0:a5e06bb74915 50 {
caroe 0:a5e06bb74915 51 //Drehrate aller Axen abholen
caroe 0:a5e06bb74915 52 char tx[1];
caroe 0:a5e06bb74915 53 char rx[6];
caroe 0:a5e06bb74915 54
caroe 0:a5e06bb74915 55 tx[0]= 0x03;
caroe 0:a5e06bb74915 56 I2CBus.write(I2CADR_W(HMC5883_ADRESS), tx, 1);
caroe 0:a5e06bb74915 57 I2CBus.read (I2CADR_R(HMC5883_ADRESS), rx, 6);
caroe 0:a5e06bb74915 58
caroe 0:a5e06bb74915 59 //Aus den einzelnen Bytes den 16-Bit-Wert zusammenbauen
caroe 0:a5e06bb74915 60 short r[3];
caroe 0:a5e06bb74915 61 r[0]= rx[0]<<8|rx[1];
caroe 0:a5e06bb74915 62 r[1]= rx[4]<<8|rx[5];
caroe 0:a5e06bb74915 63 r[2]= rx[2]<<8|rx[3];
caroe 0:a5e06bb74915 64
caroe 0:a5e06bb74915 65 //Grober Messfehler?
caroe 0:a5e06bb74915 66 if(r[0] == -4096
caroe 0:a5e06bb74915 67 || r[1] == -4096
caroe 0:a5e06bb74915 68 || r[2] == -4096)
caroe 0:a5e06bb74915 69 MeasurementError= 1;
caroe 0:a5e06bb74915 70 else
caroe 0:a5e06bb74915 71 {
caroe 0:a5e06bb74915 72 MeasurementError= 0;
caroe 0:a5e06bb74915 73 RawMag[0]= r[0];
caroe 0:a5e06bb74915 74 RawMag[1]= r[1];
caroe 0:a5e06bb74915 75 RawMag[2]= r[2];
caroe 0:a5e06bb74915 76 }
caroe 0:a5e06bb74915 77 }
caroe 0:a5e06bb74915 78
caroe 0:a5e06bb74915 79
caroe 0:a5e06bb74915 80 //Update-Methode
caroe 0:a5e06bb74915 81 void HMC5883::Update()
caroe 0:a5e06bb74915 82 {
caroe 0:a5e06bb74915 83 //Rohdaten lesen
caroe 0:a5e06bb74915 84 ReadRawData();
caroe 0:a5e06bb74915 85
caroe 0:a5e06bb74915 86 if(AutoCalibration)
caroe 0:a5e06bb74915 87 {
caroe 0:a5e06bb74915 88 #pragma unroll
caroe 0:a5e06bb74915 89 for(int i= 0; i < 3; i++)
caroe 0:a5e06bb74915 90 {
caroe 0:a5e06bb74915 91 //Neuer Min Max Wert?
caroe 0:a5e06bb74915 92 RawMin[i]= RawMin[i] < RawMag[i] ? RawMin[i] : RawMag[i];
caroe 0:a5e06bb74915 93 RawMax[i]= RawMax[i] > RawMag[i] ? RawMax[i] : RawMag[i];
caroe 0:a5e06bb74915 94
caroe 0:a5e06bb74915 95 //Scale und Offset aus gesammelten Min Max Werten berechnen
caroe 0:a5e06bb74915 96 //Die neue Untere und obere Grenze bilden -1 und +1
caroe 0:a5e06bb74915 97 Scale[i]= 2.0 / (float)(RawMax[i]-RawMin[i]);
caroe 0:a5e06bb74915 98 Offset[i]= 1.0 - (float)(RawMax[i]) * Scale[i];
caroe 0:a5e06bb74915 99 }
caroe 0:a5e06bb74915 100 }
caroe 0:a5e06bb74915 101
caroe 0:a5e06bb74915 102 //Feldstaerke berechnen
caroe 0:a5e06bb74915 103 Mag[0]= Scale[0] * (float)(RawMag[0]) + Offset[0];
caroe 0:a5e06bb74915 104 Mag[1]= Scale[1] * (float)(RawMag[1]) + Offset[1];
caroe 0:a5e06bb74915 105 Mag[2]= Scale[2] * (float)(RawMag[2]) + Offset[2];
caroe 0:a5e06bb74915 106 }
caroe 0:a5e06bb74915 107
caroe 0:a5e06bb74915 108
caroe 0:a5e06bb74915 109 //Kalibrieren
caroe 0:a5e06bb74915 110 void HMC5883::Calibrate(const short * pRawMin, const short * pRawMax)
caroe 0:a5e06bb74915 111 {
caroe 0:a5e06bb74915 112 #pragma unroll
caroe 0:a5e06bb74915 113 for(int i= 0; i < 3; i++)
caroe 0:a5e06bb74915 114 {
caroe 0:a5e06bb74915 115 RawMin[i]= pRawMin[i];
caroe 0:a5e06bb74915 116 RawMax[i]= pRawMax[i];
caroe 0:a5e06bb74915 117 }
caroe 0:a5e06bb74915 118 char AutoCalibrationBak= AutoCalibration;
caroe 0:a5e06bb74915 119 AutoCalibration= 1;
caroe 0:a5e06bb74915 120 Update();
caroe 0:a5e06bb74915 121 AutoCalibration= AutoCalibrationBak;
caroe 0:a5e06bb74915 122 }
caroe 0:a5e06bb74915 123
caroe 0:a5e06bb74915 124 void HMC5883::Calibrate(int s)
caroe 0:a5e06bb74915 125 {
caroe 0:a5e06bb74915 126 char AutoCalibrationBak= AutoCalibration;
caroe 0:a5e06bb74915 127 AutoCalibration= 1;
caroe 0:a5e06bb74915 128
caroe 0:a5e06bb74915 129 //Ende der Kalibrierung in ms Millisekunden berechnen
caroe 0:a5e06bb74915 130 int CalibEnd= GlobalTime.read_ms() + s*1000;
caroe 0:a5e06bb74915 131
caroe 0:a5e06bb74915 132 while(GlobalTime.read_ms() < CalibEnd)
caroe 0:a5e06bb74915 133 {
caroe 0:a5e06bb74915 134 //Update erledigt alles
caroe 0:a5e06bb74915 135 Update();
caroe 0:a5e06bb74915 136 }
caroe 0:a5e06bb74915 137
caroe 0:a5e06bb74915 138 AutoCalibration= AutoCalibrationBak;
caroe 0:a5e06bb74915 139 }