by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"

Dependencies:   mbed

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?

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