A library for Silicon Sensing DMU02
DMU.cpp@2:8f71fe74e379, 2013-03-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |