Measurement of three analogue signals a filtration and transfer of their values through Ethernet (UDP)

Dependencies:   mbed EthernetNetIf

Committer:
AndrewK
Date:
Tue Jun 26 06:24:23 2012 +0000
Revision:
0:72d0d2736b7f
Child:
1:be04a186a221

        

Who changed what in which revision?

UserRevisionLine numberNew 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 // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 2
AndrewK 0:72d0d2736b7f 108 } else {
AndrewK 0:72d0d2736b7f 109 if (dif12 < dif02)
AndrewK 0:72d0d2736b7f 110 dadc0 = dadc2; // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 0
AndrewK 0:72d0d2736b7f 111 else
AndrewK 0:72d0d2736b7f 112 dadc1 = dadc2; // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 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 }