A library for Silicon Sensing DMU02

Dependents:   DMUTest

Committer:
ramwilliford
Date:
Mon Mar 11 16:54:53 2013 +0000
Revision:
2:8f71fe74e379
Parent:
0:e4342b551612
Fixed comment typos.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ramwilliford 0:e4342b551612 1 #include "DMU.h"
ramwilliford 0:e4342b551612 2
ramwilliford 0:e4342b551612 3 DMU::DMU(PinName MOSI, PinName MISO, PinName SCLK,
ramwilliford 0:e4342b551612 4 PinName S0, PinName S1, PinName S2){
ramwilliford 0:e4342b551612 5 _spi = new SPI(MOSI, MISO, SCLK); //communication
ramwilliford 0:e4342b551612 6 _cs = new BusOut(S0, S1, S2); //slave select/axis selct
ramwilliford 0:e4342b551612 7
ramwilliford 0:e4342b551612 8 _init();
ramwilliford 0:e4342b551612 9
ramwilliford 0:e4342b551612 10
ramwilliford 0:e4342b551612 11 }
ramwilliford 0:e4342b551612 12
ramwilliford 0:e4342b551612 13 float DMU::acceleration(char axis){
ramwilliford 0:e4342b551612 14
ramwilliford 0:e4342b551612 15
ramwilliford 0:e4342b551612 16 bool correctRead;
ramwilliford 0:e4342b551612 17 do{
ramwilliford 0:e4342b551612 18 _selectAxis(axis);
ramwilliford 0:e4342b551612 19 correctRead = _write(0x01);
ramwilliford 0:e4342b551612 20 }while (!correctRead);
ramwilliford 0:e4342b551612 21
ramwilliford 0:e4342b551612 22 short dispA = (data2<<8) | data3;
ramwilliford 0:e4342b551612 23 int negTester = 0x8000;
ramwilliford 0:e4342b551612 24 if (negTester & dispA) dispA = -1 * (65536 - dispA);
ramwilliford 0:e4342b551612 25
ramwilliford 0:e4342b551612 26 return dispA * .00366;
ramwilliford 0:e4342b551612 27
ramwilliford 0:e4342b551612 28 }
ramwilliford 0:e4342b551612 29
ramwilliford 0:e4342b551612 30 float DMU::roll(){
ramwilliford 0:e4342b551612 31
ramwilliford 0:e4342b551612 32 bool correctRead;
ramwilliford 0:e4342b551612 33 do{
ramwilliford 0:e4342b551612 34 _selectAxis('x');
ramwilliford 0:e4342b551612 35 correctRead = _write(0x01);
ramwilliford 0:e4342b551612 36 }while (!correctRead);
ramwilliford 0:e4342b551612 37
ramwilliford 0:e4342b551612 38 short dispA = (data0<<8) | data1;
ramwilliford 0:e4342b551612 39 int negTester = 0x8000;
ramwilliford 0:e4342b551612 40 if (negTester & dispA) dispA = -1 * (65536 - dispA);
ramwilliford 0:e4342b551612 41
ramwilliford 0:e4342b551612 42 return dispA * .03125;
ramwilliford 0:e4342b551612 43
ramwilliford 0:e4342b551612 44 }
ramwilliford 0:e4342b551612 45 float DMU::pitch(){
ramwilliford 0:e4342b551612 46
ramwilliford 0:e4342b551612 47 bool correctRead;
ramwilliford 0:e4342b551612 48 do{
ramwilliford 0:e4342b551612 49 _selectAxis('y');
ramwilliford 0:e4342b551612 50 correctRead = _write(0x01);
ramwilliford 0:e4342b551612 51 }while (!correctRead);
ramwilliford 0:e4342b551612 52
ramwilliford 0:e4342b551612 53 short dispA = (data0<<8) | data1;
ramwilliford 0:e4342b551612 54 int negTester = 0x8000;
ramwilliford 0:e4342b551612 55 if (negTester & dispA) dispA = -1 * (65536 - dispA);
ramwilliford 0:e4342b551612 56
ramwilliford 0:e4342b551612 57 return dispA * .03125;
ramwilliford 0:e4342b551612 58
ramwilliford 0:e4342b551612 59 }
ramwilliford 0:e4342b551612 60 float DMU::yaw(){
ramwilliford 0:e4342b551612 61
ramwilliford 0:e4342b551612 62 bool correctRead;
ramwilliford 0:e4342b551612 63 do{
ramwilliford 0:e4342b551612 64 _selectAxis('z');
ramwilliford 0:e4342b551612 65 correctRead = _write(0x01);
ramwilliford 0:e4342b551612 66 }while (!correctRead);
ramwilliford 0:e4342b551612 67
ramwilliford 0:e4342b551612 68 short dispA = (data0<<8) | data1;
ramwilliford 0:e4342b551612 69 int negTester = 0x8000;
ramwilliford 0:e4342b551612 70 if (negTester & dispA) dispA = -1 * (65536 - dispA);
ramwilliford 0:e4342b551612 71
ramwilliford 0:e4342b551612 72 return dispA * .03125;
ramwilliford 0:e4342b551612 73
ramwilliford 0:e4342b551612 74 }
ramwilliford 0:e4342b551612 75
ramwilliford 0:e4342b551612 76 void DMU::test(){
ramwilliford 0:e4342b551612 77
ramwilliford 0:e4342b551612 78 bool correctRead;
ramwilliford 0:e4342b551612 79 do{
ramwilliford 0:e4342b551612 80 _selectAxis('z');
ramwilliford 0:e4342b551612 81 correctRead = _write(0x05);
ramwilliford 0:e4342b551612 82 }while (!correctRead);
ramwilliford 0:e4342b551612 83
ramwilliford 0:e4342b551612 84 do{
ramwilliford 0:e4342b551612 85 _selectAxis('y');
ramwilliford 0:e4342b551612 86 correctRead = _write(0x05);
ramwilliford 0:e4342b551612 87 }while (!correctRead);
ramwilliford 0:e4342b551612 88
ramwilliford 0:e4342b551612 89 do{
ramwilliford 0:e4342b551612 90 _selectAxis('x');
ramwilliford 0:e4342b551612 91 correctRead = _write(0x05);
ramwilliford 0:e4342b551612 92 }while (!correctRead);
ramwilliford 0:e4342b551612 93
ramwilliford 0:e4342b551612 94 }
ramwilliford 0:e4342b551612 95
ramwilliford 0:e4342b551612 96
ramwilliford 0:e4342b551612 97
ramwilliford 0:e4342b551612 98 /* Init the DMU
ramwilliford 0:e4342b551612 99 *
ramwilliford 0:e4342b551612 100 *
ramwilliford 0:e4342b551612 101 */
ramwilliford 0:e4342b551612 102 void DMU::_init() {
ramwilliford 0:e4342b551612 103 _repClock.start(); // start clock to allow first call of select axis to read from clock
ramwilliford 0:e4342b551612 104 _spi->frequency(1150000); // f = 1.15MHz, max f = 1.25MHz, min f = 4kHz
ramwilliford 0:e4342b551612 105 _spi->format(8,0); // 8 bits of data, CPOL = 0, CPHA = 0
ramwilliford 0:e4342b551612 106
ramwilliford 0:e4342b551612 107 }
ramwilliford 0:e4342b551612 108
ramwilliford 0:e4342b551612 109 void DMU::_selectAxis(char axis) {
ramwilliford 0:e4342b551612 110 while (_repClock.read_ms() < 100); //check to ensure device isn't read more than once every 100 ms
ramwilliford 0:e4342b551612 111 _repClock.stop();
ramwilliford 0:e4342b551612 112 _repClock.reset();
ramwilliford 0:e4342b551612 113 switch (axis){
ramwilliford 0:e4342b551612 114 case 'x':
ramwilliford 0:e4342b551612 115 _repClock.start();
ramwilliford 0:e4342b551612 116 _cs->write(6); //drive SS to set x line low
ramwilliford 0:e4342b551612 117 break;
ramwilliford 0:e4342b551612 118 case 'y':
ramwilliford 0:e4342b551612 119 _repClock.start();
ramwilliford 0:e4342b551612 120 _cs->write(3); //drive SS to set y line low
ramwilliford 0:e4342b551612 121 break;
ramwilliford 0:e4342b551612 122 case 'z':
ramwilliford 0:e4342b551612 123 _repClock.start();
ramwilliford 0:e4342b551612 124 _cs->write(5); //drive SS to set z line low
ramwilliford 0:e4342b551612 125 }
ramwilliford 0:e4342b551612 126 wait(.000010); // wait time needed for device setup
ramwilliford 0:e4342b551612 127 }
ramwilliford 0:e4342b551612 128
ramwilliford 0:e4342b551612 129 void DMU::_deselectAxis() {
ramwilliford 0:e4342b551612 130
ramwilliford 0:e4342b551612 131 _cs->write(7);
ramwilliford 0:e4342b551612 132
ramwilliford 0:e4342b551612 133 }
ramwilliford 0:e4342b551612 134
ramwilliford 0:e4342b551612 135 bool DMU::_write(char controlByte) {
ramwilliford 0:e4342b551612 136
ramwilliford 0:e4342b551612 137 char status = _spi->write(controlByte);
ramwilliford 0:e4342b551612 138 wait(.0000015);
ramwilliford 0:e4342b551612 139
ramwilliford 0:e4342b551612 140 data0 = _spi->write(0x00);
ramwilliford 0:e4342b551612 141 wait(.0000015); //min wait time between successive bytes is 1.1us
ramwilliford 0:e4342b551612 142
ramwilliford 0:e4342b551612 143 data1 = _spi->write(0x00);
ramwilliford 0:e4342b551612 144 wait(.0000015);
ramwilliford 0:e4342b551612 145
ramwilliford 0:e4342b551612 146 data2 = _spi->write(0x00);
ramwilliford 0:e4342b551612 147 wait(.0000015);
ramwilliford 0:e4342b551612 148
ramwilliford 0:e4342b551612 149 data3 = _spi->write(0x00);
ramwilliford 0:e4342b551612 150 wait(.0000015);
ramwilliford 0:e4342b551612 151
ramwilliford 0:e4342b551612 152 char rCS = _spi->write(~controlByte);
ramwilliford 0:e4342b551612 153 _deselectAxis(); //deselect chip to ensure message duration is under 270 us
ramwilliford 0:e4342b551612 154
ramwilliford 0:e4342b551612 155
ramwilliford 0:e4342b551612 156 return _correctChecksumReceived(status, rCS);
ramwilliford 0:e4342b551612 157
ramwilliford 0:e4342b551612 158
ramwilliford 0:e4342b551612 159
ramwilliford 0:e4342b551612 160 }
ramwilliford 0:e4342b551612 161
ramwilliford 0:e4342b551612 162 bool DMU::_correctChecksumReceived(char statusByte, char chkSum){
ramwilliford 0:e4342b551612 163
ramwilliford 0:e4342b551612 164 char calculatedChecksum = statusByte + data0 + data1 + data2 + data3;
ramwilliford 0:e4342b551612 165
ramwilliford 0:e4342b551612 166 if ((char)~chkSum != calculatedChecksum) return 0;
ramwilliford 0:e4342b551612 167 return 1;
ramwilliford 0:e4342b551612 168
ramwilliford 0:e4342b551612 169 }