by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"
main.cpp@0:de78c543d4ed, 2013-06-16 (annotated)
- Committer:
- robt
- Date:
- Sun Jun 16 15:37:57 2013 +0000
- Revision:
- 0:de78c543d4ed
by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
robt | 0:de78c543d4ed | 1 | /* Program Example: 13.2 Open Loop Compass |
robt | 0:de78c543d4ed | 2 | */ |
robt | 0:de78c543d4ed | 3 | #include "mbed.h" |
robt | 0:de78c543d4ed | 4 | //***** mbed objects ***** |
robt | 0:de78c543d4ed | 5 | I2C compass(p28, p27); // sda, scl |
robt | 0:de78c543d4ed | 6 | PwmOut PWM(p25); |
robt | 0:de78c543d4ed | 7 | AnalogIn Ain(p20); |
robt | 0:de78c543d4ed | 8 | Serial pc(USBTX, USBRX); // tx, rx |
robt | 0:de78c543d4ed | 9 | Ticker s100hz_tick; // 100 Hz (10ms) ticker |
robt | 0:de78c543d4ed | 10 | Ticker s5hz_tick; // 5 Hz (200ms) ticker |
robt | 0:de78c543d4ed | 11 | //***** variables ***** |
robt | 0:de78c543d4ed | 12 | const int addr = 0x42; // define the I2C write Address |
robt | 0:de78c543d4ed | 13 | char cmd[3]; |
robt | 0:de78c543d4ed | 14 | float pos; // measured position |
robt | 0:de78c543d4ed | 15 | float ctrlval; // PWM control value |
robt | 0:de78c543d4ed | 16 | //***** function prototypes ***** |
robt | 0:de78c543d4ed | 17 | void s100hz_task(void); // 100 Hz task |
robt | 0:de78c543d4ed | 18 | void s5hz_task(void); // 5 Hz task |
robt | 0:de78c543d4ed | 19 | //***** main code ***** |
robt | 0:de78c543d4ed | 20 | int main() { |
robt | 0:de78c543d4ed | 21 | // initialise and setup data |
robt | 0:de78c543d4ed | 22 | PWM.period(0.02); |
robt | 0:de78c543d4ed | 23 | cmd[0] = 0x47; // 'G' write to RAM address |
robt | 0:de78c543d4ed | 24 | cmd[1] = 0x74; // Operation mode register address |
robt | 0:de78c543d4ed | 25 | cmd[2] = 0x72; // Op mode = 20H, S/R, continuous |
robt | 0:de78c543d4ed | 26 | compass.write(addr,cmd, 3); // Send operation |
robt | 0:de78c543d4ed | 27 | s100hz_tick.attach(&s100hz_task,0.01); // attach 100 Hz task |
robt | 0:de78c543d4ed | 28 | s5hz_tick.attach(&s5hz_task,0.2); // attach 5 Hz task |
robt | 0:de78c543d4ed | 29 | while(1){ |
robt | 0:de78c543d4ed | 30 | // loop forever |
robt | 0:de78c543d4ed | 31 | } |
robt | 0:de78c543d4ed | 32 | } |
robt | 0:de78c543d4ed | 33 | |
robt | 0:de78c543d4ed | 34 | //***** function 100hz_task ***** |
robt | 0:de78c543d4ed | 35 | void s100hz_task(void) { |
robt | 0:de78c543d4ed | 36 | compass.read(addr, cmd, 2); // read the two-byte compass data |
robt | 0:de78c543d4ed | 37 | pos = 0.1 * ((cmd[0] << 8) + cmd[1]); //convert to degrees |
robt | 0:de78c543d4ed | 38 | if (pos>180) |
robt | 0:de78c543d4ed | 39 | pos=pos-360; // convert to ±180deg |
robt | 0:de78c543d4ed | 40 | ctrlval=Ain; // set control value (also try ctrlval=Ain/4) |
robt | 0:de78c543d4ed | 41 | PWM=ctrlval; // output control value to PWM |
robt | 0:de78c543d4ed | 42 | } |
robt | 0:de78c543d4ed | 43 | |
robt | 0:de78c543d4ed | 44 | //***** function 5hz_task ***** |
robt | 0:de78c543d4ed | 45 | void s5hz_task(void) { |
robt | 0:de78c543d4ed | 46 | pc.printf("deg = %.1f PWM = %.4f\n", pos, ctrlval); |
robt | 0:de78c543d4ed | 47 | } |