![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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.
main.cpp@0:03e8a03052c9, 2010-08-27 (annotated)
- Committer:
- jimurai
- Date:
- Fri Aug 27 15:20:30 2010 +0000
- Revision:
- 0:03e8a03052c9
Who changed what in which revision?
User | Revision | Line number | New 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 | } |