This code is to collect data from the ADCs in burst mode, decimate the data, encapsulate it in a simple UDP-like packet and then transmit it over the serial port.

Dependencies:   mbed

Committer:
jimurai
Date:
Fri Aug 27 15:20:30 2010 +0000
Revision:
0:03e8a03052c9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jimurai 0:03e8a03052c9 1 #include "mbed.h"
jimurai 0:03e8a03052c9 2 #include "daq.h"
jimurai 0:03e8a03052c9 3 #include "comms.h"
jimurai 0:03e8a03052c9 4
jimurai 0:03e8a03052c9 5 #define NODE_ID 1
jimurai 0:03e8a03052c9 6 #define SAMPLE_PERIOD_US 20000
jimurai 0:03e8a03052c9 7 #define EXT_BIAS_VOLTAGE 0.1
jimurai 0:03e8a03052c9 8
jimurai 0:03e8a03052c9 9 DigitalOut myled(LED1);
jimurai 0:03e8a03052c9 10 Serial pc(USBTX, USBRX);
jimurai 0:03e8a03052c9 11 Serial radioUART(p13,p14);
jimurai 0:03e8a03052c9 12 DigitalOut rst(p29);
jimurai 0:03e8a03052c9 13 DigitalOut en_mux_EXT(p29);
jimurai 0:03e8a03052c9 14 BusOut mux_EXT(p23,p24);
jimurai 0:03e8a03052c9 15 AnalogOut bias_EXT(p18);
jimurai 0:03e8a03052c9 16
jimurai 0:03e8a03052c9 17 ADC_BURST adc;
jimurai 0:03e8a03052c9 18 Decimator dec_0(5);
jimurai 0:03e8a03052c9 19 Decimator dec_1(5);
jimurai 0:03e8a03052c9 20 Decimator dec_2(5);
jimurai 0:03e8a03052c9 21 Decimator dec_3_0(5);
jimurai 0:03e8a03052c9 22 Decimator dec_3_1(5);
jimurai 0:03e8a03052c9 23 Decimator dec_3_2(5);
jimurai 0:03e8a03052c9 24 Decimator dec_3_3(5);
jimurai 0:03e8a03052c9 25 Ticker sampler;
jimurai 0:03e8a03052c9 26
jimurai 0:03e8a03052c9 27 Transport transmission(0xC0A80001, 0xC0A80000, NODE_ID);
jimurai 0:03e8a03052c9 28
jimurai 0:03e8a03052c9 29 uint8_t* radio_ptr = NULL;
jimurai 0:03e8a03052c9 30 uint16_t radio_len = 0;
jimurai 0:03e8a03052c9 31
jimurai 0:03e8a03052c9 32 uint8_t ext_mux_channel = 0;
jimurai 0:03e8a03052c9 33 bool waiting = false;
jimurai 0:03e8a03052c9 34
jimurai 0:03e8a03052c9 35 /**
jimurai 0:03e8a03052c9 36 * Collects sample from multiple sensor sources.
jimurai 0:03e8a03052c9 37 * Create a packets of samples from multiple sensor and pack
jimurai 0:03e8a03052c9 38 * them into a single, synchronised (via decimators) packet.
jimurai 0:03e8a03052c9 39 */
jimurai 0:03e8a03052c9 40 void pack_samples_ISR() {
jimurai 0:03e8a03052c9 41 uint16_t syncd_samples[7];
jimurai 0:03e8a03052c9 42 syncd_samples[0] = dec_0.read();
jimurai 0:03e8a03052c9 43 syncd_samples[1] = dec_1.read();
jimurai 0:03e8a03052c9 44 syncd_samples[2] = dec_2.read();
jimurai 0:03e8a03052c9 45 syncd_samples[3] = dec_3_0.read();
jimurai 0:03e8a03052c9 46 syncd_samples[4] = dec_3_1.read();
jimurai 0:03e8a03052c9 47 syncd_samples[5] = dec_3_2.read();
jimurai 0:03e8a03052c9 48 syncd_samples[6] = dec_3_3.read();
jimurai 0:03e8a03052c9 49 transmission.load_data(syncd_samples, 7);
jimurai 0:03e8a03052c9 50 waiting = true;
jimurai 0:03e8a03052c9 51 }
jimurai 0:03e8a03052c9 52
jimurai 0:03e8a03052c9 53 void adc_ISR() {
jimurai 0:03e8a03052c9 54 // Toggle a LED for visual feedback of activity
jimurai 0:03e8a03052c9 55 myled = !myled;
jimurai 0:03e8a03052c9 56 // Send the latest set of samples to the decimators
jimurai 0:03e8a03052c9 57 dec_0.write((uint16_t)(adc.data[0] >> 4));
jimurai 0:03e8a03052c9 58 dec_1.write((uint16_t)(adc.data[1] >> 4));
jimurai 0:03e8a03052c9 59 dec_2.write((uint16_t)(adc.data[2] >> 4));
jimurai 0:03e8a03052c9 60 switch (ext_mux_channel) {
jimurai 0:03e8a03052c9 61 case 0:
jimurai 0:03e8a03052c9 62 dec_3_0.write((uint16_t)(adc.data[3] >> 4));
jimurai 0:03e8a03052c9 63 break;
jimurai 0:03e8a03052c9 64 case 1:
jimurai 0:03e8a03052c9 65 dec_3_1.write((uint16_t)(adc.data[3] >> 4));
jimurai 0:03e8a03052c9 66 break;
jimurai 0:03e8a03052c9 67 case 2:
jimurai 0:03e8a03052c9 68 dec_3_2.write((uint16_t)(adc.data[3] >> 4));
jimurai 0:03e8a03052c9 69 break;
jimurai 0:03e8a03052c9 70 case 3:
jimurai 0:03e8a03052c9 71 dec_3_3.write((uint16_t)(adc.data[3] >> 4));
jimurai 0:03e8a03052c9 72 break;
jimurai 0:03e8a03052c9 73 default:
jimurai 0:03e8a03052c9 74 error("Random multiplexer channel: %d!\n",ext_mux_channel);
jimurai 0:03e8a03052c9 75 }
jimurai 0:03e8a03052c9 76 // Select the next channel on the external multiplexer
jimurai 0:03e8a03052c9 77 if (++ext_mux_channel == 4) ext_mux_channel = 0;
jimurai 0:03e8a03052c9 78 mux_EXT = ext_mux_channel;
jimurai 0:03e8a03052c9 79 }
jimurai 0:03e8a03052c9 80
jimurai 0:03e8a03052c9 81 int main() {
jimurai 0:03e8a03052c9 82 // Set up UART interface over USB
jimurai 0:03e8a03052c9 83 pc.baud(115200);
jimurai 0:03e8a03052c9 84
jimurai 0:03e8a03052c9 85 // Set up UART interface to radio module node
jimurai 0:03e8a03052c9 86 // - CTS1 is set to DIP12 = port0.17
jimurai 0:03e8a03052c9 87 LPC_PINCON->PINSEL1 &= ~((uint32_t)0x3 << 2);
jimurai 0:03e8a03052c9 88 LPC_PINCON->PINSEL1 |= ((uint32_t)0x1 << 2);
jimurai 0:03e8a03052c9 89 // - CTS1 is given a weak pull-up
jimurai 0:03e8a03052c9 90 LPC_PINCON->PINMODE1 &= ~((uint32_t)0x3 << 2);
jimurai 0:03e8a03052c9 91 // - Enable autocts mode on UART1
jimurai 0:03e8a03052c9 92 LPC_UART1->MCR |= (1 <<7 );
jimurai 0:03e8a03052c9 93 // - Baud rate set fairly high
jimurai 0:03e8a03052c9 94 radioUART.baud(115200);
jimurai 0:03e8a03052c9 95
jimurai 0:03e8a03052c9 96 // Reset the radio board and wait a while for it to boot
jimurai 0:03e8a03052c9 97 rst = 0;
jimurai 0:03e8a03052c9 98 rst = 1;
jimurai 0:03e8a03052c9 99 wait(0.25);
jimurai 0:03e8a03052c9 100
jimurai 0:03e8a03052c9 101 // Attach a function to the sample period ticker
jimurai 0:03e8a03052c9 102 // - this will enable continuous sampling of the ADC
jimurai 0:03e8a03052c9 103 sampler.attach_us(&pack_samples_ISR, SAMPLE_PERIOD_US);
jimurai 0:03e8a03052c9 104
jimurai 0:03e8a03052c9 105 // Set up the external analogue circuitry
jimurai 0:03e8a03052c9 106 bias_EXT = EXT_BIAS_VOLTAGE;
jimurai 0:03e8a03052c9 107 en_mux_EXT = 1;
jimurai 0:03e8a03052c9 108 mux_EXT = ext_mux_channel;
jimurai 0:03e8a03052c9 109
jimurai 0:03e8a03052c9 110 // Set up any remaining comm's
jimurai 0:03e8a03052c9 111
jimurai 0:03e8a03052c9 112 // Choose which function to process the latest ADC values
jimurai 0:03e8a03052c9 113 adc.attach(&adc_ISR);
jimurai 0:03e8a03052c9 114
jimurai 0:03e8a03052c9 115
jimurai 0:03e8a03052c9 116 while (1) {
jimurai 0:03e8a03052c9 117 if (waiting) {
jimurai 0:03e8a03052c9 118
jimurai 0:03e8a03052c9 119 transmission.get_packet(&radio_ptr, &radio_len);
jimurai 0:03e8a03052c9 120 //radioUART.attach(&uartISR,Serial::TxIrq);
jimurai 0:03e8a03052c9 121 while (radio_len-- != 0) {
jimurai 0:03e8a03052c9 122 radioUART.putc(*radio_ptr++);
jimurai 0:03e8a03052c9 123 }
jimurai 0:03e8a03052c9 124 pc.printf("C = %d\n",radio_len);
jimurai 0:03e8a03052c9 125 waiting = false;
jimurai 0:03e8a03052c9 126 }
jimurai 0:03e8a03052c9 127 }
jimurai 0:03e8a03052c9 128 }