Measurement of three analogue signals a filtration and transfer of their values through Ethernet (UDP)
Dependencies: mbed EthernetNetIf
main.cpp@0:72d0d2736b7f, 2012-06-26 (annotated)
- Committer:
- AndrewK
- Date:
- Tue Jun 26 06:24:23 2012 +0000
- Revision:
- 0:72d0d2736b7f
- Child:
- 1:be04a186a221
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AndrewK | 0:72d0d2736b7f | 1 | |
AndrewK | 0:72d0d2736b7f | 2 | #define SAMPLE_RATE 150000 |
AndrewK | 0:72d0d2736b7f | 3 | #include "mbed.h" |
AndrewK | 0:72d0d2736b7f | 4 | #include "adc.h" |
AndrewK | 0:72d0d2736b7f | 5 | #include "EthernetNetIf.h" |
AndrewK | 0:72d0d2736b7f | 6 | #include "UDPSocket.h" |
AndrewK | 0:72d0d2736b7f | 7 | |
AndrewK | 0:72d0d2736b7f | 8 | EthernetNetIf eth( IpAddr(192,168,1,5), //IP Address |
AndrewK | 0:72d0d2736b7f | 9 | IpAddr(255,255,255,0), //Network Mask |
AndrewK | 0:72d0d2736b7f | 10 | IpAddr(192,168,1,254), //Gateway |
AndrewK | 0:72d0d2736b7f | 11 | IpAddr(192,168,1,254) //DNS |
AndrewK | 0:72d0d2736b7f | 12 | ); |
AndrewK | 0:72d0d2736b7f | 13 | //EthernetNetIf eth; |
AndrewK | 0:72d0d2736b7f | 14 | UDPSocket udp; |
AndrewK | 0:72d0d2736b7f | 15 | |
AndrewK | 0:72d0d2736b7f | 16 | DigitalOut int_led(LED1); |
AndrewK | 0:72d0d2736b7f | 17 | DigitalOut P15(p15); |
AndrewK | 0:72d0d2736b7f | 18 | Serial pc(USBTX,USBRX); |
AndrewK | 0:72d0d2736b7f | 19 | Host multicast(IpAddr(192,168,1,10),27200, NULL); //Target IP and port |
AndrewK | 0:72d0d2736b7f | 20 | ADC adc(SAMPLE_RATE, 1); |
AndrewK | 0:72d0d2736b7f | 21 | Ticker flipper; |
AndrewK | 0:72d0d2736b7f | 22 | unsigned short s1,s2,s3; |
AndrewK | 0:72d0d2736b7f | 23 | unsigned short i1,i2,i3; |
AndrewK | 0:72d0d2736b7f | 24 | unsigned short a1,a2,a3; |
AndrewK | 0:72d0d2736b7f | 25 | unsigned short sm1, sm2, sm3; |
AndrewK | 0:72d0d2736b7f | 26 | unsigned short im1, im2, im3; |
AndrewK | 0:72d0d2736b7f | 27 | unsigned short am1; |
AndrewK | 0:72d0d2736b7f | 28 | unsigned short smag, imag; |
AndrewK | 0:72d0d2736b7f | 29 | float s0; |
AndrewK | 0:72d0d2736b7f | 30 | //int k=0; |
AndrewK | 0:72d0d2736b7f | 31 | //Timer tmr; |
AndrewK | 0:72d0d2736b7f | 32 | Timeout timeout; |
AndrewK | 0:72d0d2736b7f | 33 | char str[50]; |
AndrewK | 0:72d0d2736b7f | 34 | unsigned char buf[10]; |
AndrewK | 0:72d0d2736b7f | 35 | int count_puls; |
AndrewK | 0:72d0d2736b7f | 36 | int led1_on = 0; |
AndrewK | 0:72d0d2736b7f | 37 | void Timer_Handler() |
AndrewK | 0:72d0d2736b7f | 38 | { |
AndrewK | 0:72d0d2736b7f | 39 | if(count_puls) { |
AndrewK | 0:72d0d2736b7f | 40 | printf("cp %d\n", count_puls); |
AndrewK | 0:72d0d2736b7f | 41 | count_puls--; |
AndrewK | 0:72d0d2736b7f | 42 | led1_on = !led1_on; |
AndrewK | 0:72d0d2736b7f | 43 | int_led = led1_on; |
AndrewK | 0:72d0d2736b7f | 44 | P15 = !led1_on; |
AndrewK | 0:72d0d2736b7f | 45 | timeout.attach_us(Timer_Handler, 100); |
AndrewK | 0:72d0d2736b7f | 46 | } else |
AndrewK | 0:72d0d2736b7f | 47 | timeout.detach(); |
AndrewK | 0:72d0d2736b7f | 48 | } |
AndrewK | 0:72d0d2736b7f | 49 | |
AndrewK | 0:72d0d2736b7f | 50 | void onUDPSocketEvent(UDPSocketEvent e) { //Incoming UDP packet processing |
AndrewK | 0:72d0d2736b7f | 51 | switch (e) { |
AndrewK | 0:72d0d2736b7f | 52 | case UDPSOCKET_READABLE: //The only event for now |
AndrewK | 0:72d0d2736b7f | 53 | char buf[64] = {0}; |
AndrewK | 0:72d0d2736b7f | 54 | Host host; |
AndrewK | 0:72d0d2736b7f | 55 | while ( int len = udp.recvfrom( buf, 63, &host ) ) { |
AndrewK | 0:72d0d2736b7f | 56 | if ( len <= 0 ) |
AndrewK | 0:72d0d2736b7f | 57 | break; |
AndrewK | 0:72d0d2736b7f | 58 | printf("From %d.%d.%d.%d: %s\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], buf); |
AndrewK | 0:72d0d2736b7f | 59 | } |
AndrewK | 0:72d0d2736b7f | 60 | switch(buf[0]) { |
AndrewK | 0:72d0d2736b7f | 61 | case '1': |
AndrewK | 0:72d0d2736b7f | 62 | count_puls = 8; |
AndrewK | 0:72d0d2736b7f | 63 | break; |
AndrewK | 0:72d0d2736b7f | 64 | case '2': |
AndrewK | 0:72d0d2736b7f | 65 | count_puls = 4; |
AndrewK | 0:72d0d2736b7f | 66 | break; |
AndrewK | 0:72d0d2736b7f | 67 | case '3': |
AndrewK | 0:72d0d2736b7f | 68 | count_puls = 6; |
AndrewK | 0:72d0d2736b7f | 69 | break; |
AndrewK | 0:72d0d2736b7f | 70 | case '4': |
AndrewK | 0:72d0d2736b7f | 71 | count_puls = 2; |
AndrewK | 0:72d0d2736b7f | 72 | break; |
AndrewK | 0:72d0d2736b7f | 73 | case '5': |
AndrewK | 0:72d0d2736b7f | 74 | count_puls = 10; |
AndrewK | 0:72d0d2736b7f | 75 | break; |
AndrewK | 0:72d0d2736b7f | 76 | default: |
AndrewK | 0:72d0d2736b7f | 77 | count_puls = 0; |
AndrewK | 0:72d0d2736b7f | 78 | } |
AndrewK | 0:72d0d2736b7f | 79 | timeout.attach_us(Timer_Handler, 100); |
AndrewK | 0:72d0d2736b7f | 80 | break; |
AndrewK | 0:72d0d2736b7f | 81 | } |
AndrewK | 0:72d0d2736b7f | 82 | } |
AndrewK | 0:72d0d2736b7f | 83 | /* |
AndrewK | 0:72d0d2736b7f | 84 | void adc_comlete(uint32_t value) { |
AndrewK | 0:72d0d2736b7f | 85 | samples1 = adc.read(p20); |
AndrewK | 0:72d0d2736b7f | 86 | Net::poll(); //Do network stuff |
AndrewK | 0:72d0d2736b7f | 87 | sprintf(str, "1=%4u\0", samples1); |
AndrewK | 0:72d0d2736b7f | 88 | printf("%d\n", samples1); |
AndrewK | 0:72d0d2736b7f | 89 | udp.sendto( str, strlen(str)+1, &multicast ); |
AndrewK | 0:72d0d2736b7f | 90 | |
AndrewK | 0:72d0d2736b7f | 91 | } |
AndrewK | 0:72d0d2736b7f | 92 | */ |
AndrewK | 0:72d0d2736b7f | 93 | unsigned short Major(unsigned short dadc2, unsigned short dadc0, unsigned short dadc1) |
AndrewK | 0:72d0d2736b7f | 94 | { |
AndrewK | 0:72d0d2736b7f | 95 | //printf("%d %d %d\n", dadc2, dadc0, dadc1); |
AndrewK | 0:72d0d2736b7f | 96 | unsigned short rez; |
AndrewK | 0:72d0d2736b7f | 97 | int dif01, dif02, dif12; |
AndrewK | 0:72d0d2736b7f | 98 | dif01 = dadc0 - dadc1; |
AndrewK | 0:72d0d2736b7f | 99 | dif02 = dadc0 - dadc2; |
AndrewK | 0:72d0d2736b7f | 100 | dif12 = dadc1 - dadc2; |
AndrewK | 0:72d0d2736b7f | 101 | if (dif01 < 0) dif01 = -dif01; |
AndrewK | 0:72d0d2736b7f | 102 | if (dif02 < 0) dif02 = -dif02; |
AndrewK | 0:72d0d2736b7f | 103 | if (dif12 < 0) dif12 = -dif12; |
AndrewK | 0:72d0d2736b7f | 104 | if (dif01 < dif02) { |
AndrewK | 0:72d0d2736b7f | 105 | if (dif12 < dif01) |
AndrewK | 0:72d0d2736b7f | 106 | dadc0 = dadc2; |
AndrewK | 0:72d0d2736b7f | 107 | //else // �������� 2 |
AndrewK | 0:72d0d2736b7f | 108 | } else { |
AndrewK | 0:72d0d2736b7f | 109 | if (dif12 < dif02) |
AndrewK | 0:72d0d2736b7f | 110 | dadc0 = dadc2; // �������� 0 |
AndrewK | 0:72d0d2736b7f | 111 | else |
AndrewK | 0:72d0d2736b7f | 112 | dadc1 = dadc2; // �������� 1 |
AndrewK | 0:72d0d2736b7f | 113 | } |
AndrewK | 0:72d0d2736b7f | 114 | rez = dadc0 + dadc1; |
AndrewK | 0:72d0d2736b7f | 115 | rez >>= 1; |
AndrewK | 0:72d0d2736b7f | 116 | return rez; |
AndrewK | 0:72d0d2736b7f | 117 | } |
AndrewK | 0:72d0d2736b7f | 118 | int delta; |
AndrewK | 0:72d0d2736b7f | 119 | float err; |
AndrewK | 0:72d0d2736b7f | 120 | static int number = 0; |
AndrewK | 0:72d0d2736b7f | 121 | |
AndrewK | 0:72d0d2736b7f | 122 | void flip() { // interrupt function: measurement and sending a UDP packet |
AndrewK | 0:72d0d2736b7f | 123 | switch(number) { |
AndrewK | 0:72d0d2736b7f | 124 | case 0: |
AndrewK | 0:72d0d2736b7f | 125 | s1 = adc.read(p20); |
AndrewK | 0:72d0d2736b7f | 126 | number++; |
AndrewK | 0:72d0d2736b7f | 127 | break; |
AndrewK | 0:72d0d2736b7f | 128 | case 3: |
AndrewK | 0:72d0d2736b7f | 129 | s2 = adc.read(p20); |
AndrewK | 0:72d0d2736b7f | 130 | number++; |
AndrewK | 0:72d0d2736b7f | 131 | break; |
AndrewK | 0:72d0d2736b7f | 132 | case 6: |
AndrewK | 0:72d0d2736b7f | 133 | s3 = adc.read(p20); |
AndrewK | 0:72d0d2736b7f | 134 | number++; |
AndrewK | 0:72d0d2736b7f | 135 | sm1 = Major(s1, s2, s3); |
AndrewK | 0:72d0d2736b7f | 136 | // sprintf(str, "1=%4u\0",sm1); |
AndrewK | 0:72d0d2736b7f | 137 | // Net::poll(); //Do network stuff |
AndrewK | 0:72d0d2736b7f | 138 | // udp.sendto( str, strlen(str)+1, &multicast ); |
AndrewK | 0:72d0d2736b7f | 139 | break; |
AndrewK | 0:72d0d2736b7f | 140 | case 1: |
AndrewK | 0:72d0d2736b7f | 141 | number++; |
AndrewK | 0:72d0d2736b7f | 142 | i1 = adc.read(p19); |
AndrewK | 0:72d0d2736b7f | 143 | break; |
AndrewK | 0:72d0d2736b7f | 144 | case 4: |
AndrewK | 0:72d0d2736b7f | 145 | number++; |
AndrewK | 0:72d0d2736b7f | 146 | i2 = adc.read(p19); |
AndrewK | 0:72d0d2736b7f | 147 | break; |
AndrewK | 0:72d0d2736b7f | 148 | case 7: |
AndrewK | 0:72d0d2736b7f | 149 | number++; |
AndrewK | 0:72d0d2736b7f | 150 | i3 = adc.read(p19); |
AndrewK | 0:72d0d2736b7f | 151 | im1 = Major(i1, i2, i3); |
AndrewK | 0:72d0d2736b7f | 152 | // sprintf(str, "2=%4u %4u\0",sm1, im1); |
AndrewK | 0:72d0d2736b7f | 153 | // Net::poll(); //Do network stuff |
AndrewK | 0:72d0d2736b7f | 154 | // udp.sendto( str, strlen(str)+1, &multicast ); |
AndrewK | 0:72d0d2736b7f | 155 | break; |
AndrewK | 0:72d0d2736b7f | 156 | case 2: |
AndrewK | 0:72d0d2736b7f | 157 | number++; |
AndrewK | 0:72d0d2736b7f | 158 | a1 = adc.read(p17); |
AndrewK | 0:72d0d2736b7f | 159 | break; |
AndrewK | 0:72d0d2736b7f | 160 | case 5: |
AndrewK | 0:72d0d2736b7f | 161 | number++; |
AndrewK | 0:72d0d2736b7f | 162 | a2 = adc.read(p17); |
AndrewK | 0:72d0d2736b7f | 163 | break; |
AndrewK | 0:72d0d2736b7f | 164 | case 8: |
AndrewK | 0:72d0d2736b7f | 165 | number=0; |
AndrewK | 0:72d0d2736b7f | 166 | a3 = adc.read(p17); |
AndrewK | 0:72d0d2736b7f | 167 | am1 = Major(a1, a2, a3); |
AndrewK | 0:72d0d2736b7f | 168 | sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1); |
AndrewK | 0:72d0d2736b7f | 169 | Net::poll(); //Do network stuff |
AndrewK | 0:72d0d2736b7f | 170 | udp.sendto( str, strlen(str)+1, &multicast ); |
AndrewK | 0:72d0d2736b7f | 171 | break; |
AndrewK | 0:72d0d2736b7f | 172 | } |
AndrewK | 0:72d0d2736b7f | 173 | } |
AndrewK | 0:72d0d2736b7f | 174 | #define MASK 0xC700000C |
AndrewK | 0:72d0d2736b7f | 175 | //#define MASK 0x00000000 |
AndrewK | 0:72d0d2736b7f | 176 | |
AndrewK | 0:72d0d2736b7f | 177 | int main() { |
AndrewK | 0:72d0d2736b7f | 178 | pc.baud(57600); |
AndrewK | 0:72d0d2736b7f | 179 | //Ethernet initializing, Serial Interface - 57600 kbit/s |
AndrewK | 0:72d0d2736b7f | 180 | printf("Setting up...\n"); |
AndrewK | 0:72d0d2736b7f | 181 | P15 = 1; |
AndrewK | 0:72d0d2736b7f | 182 | EthernetErr ethErr = eth.setup(); |
AndrewK | 0:72d0d2736b7f | 183 | if (ethErr) { |
AndrewK | 0:72d0d2736b7f | 184 | // printf("Error %d in setup.\n", ethErr); |
AndrewK | 0:72d0d2736b7f | 185 | return -1; |
AndrewK | 0:72d0d2736b7f | 186 | } |
AndrewK | 0:72d0d2736b7f | 187 | // printf("Setup OK\n"); |
AndrewK | 0:72d0d2736b7f | 188 | // Host multicast(IpAddr(239, 192, 1, 100), 50000, NULL); //Join multicast group on port 50000 |
AndrewK | 0:72d0d2736b7f | 189 | AnalogIn in0(p20); |
AndrewK | 0:72d0d2736b7f | 190 | AnalogIn in1(p19); |
AndrewK | 0:72d0d2736b7f | 191 | // AnalogIn in2(p18); |
AndrewK | 0:72d0d2736b7f | 192 | AnalogIn in3(p17); |
AndrewK | 0:72d0d2736b7f | 193 | // AnalogIn in4(p16); |
AndrewK | 0:72d0d2736b7f | 194 | // AnalogIn in5(p15); |
AndrewK | 0:72d0d2736b7f | 195 | // PortOut(Port0, MASK); |
AndrewK | 0:72d0d2736b7f | 196 | // DigitalOut P19(p19); |
AndrewK | 0:72d0d2736b7f | 197 | AnalogOut tri(p18); |
AndrewK | 0:72d0d2736b7f | 198 | // DigitalOut P17(p17); |
AndrewK | 0:72d0d2736b7f | 199 | DigitalOut P16(p16); |
AndrewK | 0:72d0d2736b7f | 200 | P16 = 0; // P17 = 0;// = P19 = 0; |
AndrewK | 0:72d0d2736b7f | 201 | |
AndrewK | 0:72d0d2736b7f | 202 | udp.setOnEvent(&onUDPSocketEvent); |
AndrewK | 0:72d0d2736b7f | 203 | udp.bind(multicast); |
AndrewK | 0:72d0d2736b7f | 204 | |
AndrewK | 0:72d0d2736b7f | 205 | Net::poll(); |
AndrewK | 0:72d0d2736b7f | 206 | |
AndrewK | 0:72d0d2736b7f | 207 | // tmr.start(); |
AndrewK | 0:72d0d2736b7f | 208 | |
AndrewK | 0:72d0d2736b7f | 209 | //Turning ON Burst-mode ADC on pins 17,18,19,20 note: connect not used ADC ping to ground |
AndrewK | 0:72d0d2736b7f | 210 | // adc.startmode(0,0); |
AndrewK | 0:72d0d2736b7f | 211 | adc.burst(1); |
AndrewK | 0:72d0d2736b7f | 212 | adc.setup(p20,1); |
AndrewK | 0:72d0d2736b7f | 213 | adc.setup(p19,1); |
AndrewK | 0:72d0d2736b7f | 214 | // adc.select(p20); |
AndrewK | 0:72d0d2736b7f | 215 | // adc.start(); |
AndrewK | 0:72d0d2736b7f | 216 | // adc.setup(p18,1); |
AndrewK | 0:72d0d2736b7f | 217 | adc.setup(p17,1); |
AndrewK | 0:72d0d2736b7f | 218 | // printf("start\n"); |
AndrewK | 0:72d0d2736b7f | 219 | // printf("%d\n", adc.channel_to_pin_number(0)); |
AndrewK | 0:72d0d2736b7f | 220 | |
AndrewK | 0:72d0d2736b7f | 221 | flipper.attach_us(&flip, 83); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz) |
AndrewK | 0:72d0d2736b7f | 222 | tri = 0; |
AndrewK | 0:72d0d2736b7f | 223 | while(1) { |
AndrewK | 0:72d0d2736b7f | 224 | tri = tri + 0.001; |
AndrewK | 0:72d0d2736b7f | 225 | wait_us(100); |
AndrewK | 0:72d0d2736b7f | 226 | if(tri >= 0.06) { |
AndrewK | 0:72d0d2736b7f | 227 | tri = 0; |
AndrewK | 0:72d0d2736b7f | 228 | } |
AndrewK | 0:72d0d2736b7f | 229 | } |
AndrewK | 0:72d0d2736b7f | 230 | } |