Measurement of three analogue signals a filtration and transfer of their values through Ethernet (UDP)
Dependencies: mbed EthernetNetIf
main.cpp
- Committer:
- AndrewK
- Date:
- 2012-07-30
- Revision:
- 3:e2e8519a7ce7
- Parent:
- 2:0ea44fca1a81
- Child:
- 4:b04a24076feb
File content as of revision 3:e2e8519a7ce7:
#define SAMPLE_RATE 150000 #include "mbed.h" #include "adc.h" #include "EthernetNetIf.h" #include "UDPSocket.h" EthernetNetIf eth( IpAddr(192,168,1,5), //IP Address IpAddr(255,255,255,0), //Network Mask IpAddr(192,168,1,254), //Gateway IpAddr(192,168,1,254) //DNS ); //EthernetNetIf eth; UDPSocket udp; DigitalOut int_led1(LED1); DigitalOut int_led2(LED2); DigitalOut int_led3(LED3); DigitalOut int_led4(LED4); DigitalOut P21(p21); DigitalOut P22(p22); DigitalOut P23(p23); Serial pc(USBTX,USBRX); Host multicast(IpAddr(192,168,1,10),27200, NULL); //Target IP and port ADC adc(SAMPLE_RATE, 1); Ticker flipper; unsigned short s1,s2,s3; unsigned short i1,i2,i3; unsigned short a1,a2,a3; unsigned short sm1, sm2, sm3; unsigned short im1, im2, im3; unsigned short am1, am2, am3; unsigned short smag, imag, amag; float s0; //int k=0; //Timer tmr; Timeout timeout; char str[50]; unsigned char buf[10]; int count_puls; int device_no; int led1_on = 0; void Timer_Handler() { if(count_puls) { // printf("cp %d\n", count_puls); count_puls--; led1_on = !led1_on; // int_led1 = led1_on; switch(device_no) { case 1: P21 = !led1_on; break; case 2: P22 = !led1_on; break; case 3: P23 = !led1_on; break; default: timeout.detach(); return; } timeout.attach_us(Timer_Handler, 1000); } else timeout.detach(); } void onUDPSocketEvent(UDPSocketEvent e) { //Incoming UDP packet processing switch (e) { case UDPSOCKET_READABLE: //The only event for now char buf[64] = {0}; Host host; while ( int len = udp.recvfrom( buf, 63, &host ) ) { if ( len <= 0 ) break; // printf("From %d.%d.%d.%d: %s\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], buf); } switch(buf[0]) { case '1': device_no = 1; int_led1 = 1; break; case '2': device_no = 2; // int_led2 = 1; break; case '3': device_no = 3; // int_led3 = 1; break; default: device_no = 0; // int_led4 = 1; count_puls = 0; return; } int_led1 = 0; int_led2 = 0; int_led3 = 0; int_led4 = 0; switch(buf[1]) { case '1': count_puls = 2; //8 // int_led1 = 1; break; case '2': count_puls = 8; //4; // int_led2 = 1; break; case '3': count_puls = 4; //6; // int_led3 = 1; break; case '4': count_puls = 6; //2;8 // int_led4 = 1; break; case '5': count_puls = 10; // int_led1 = 1; // int_led2 = 1; break; default: count_puls = 0; } timeout.attach_us(Timer_Handler, 1000); break; } } unsigned short Major(unsigned short dadc2, unsigned short dadc0, unsigned short dadc1) { //printf("%d %d %d\n", dadc2, dadc0, dadc1); unsigned short rez; int dif01, dif02, dif12; dif01 = dadc0 - dadc1; dif02 = dadc0 - dadc2; dif12 = dadc1 - dadc2; if (dif01 < 0) dif01 = -dif01; if (dif02 < 0) dif02 = -dif02; if (dif12 < 0) dif12 = -dif12; if (dif01 < dif02) { if (dif12 < dif01) dadc0 = dadc2; //else // �������� 2 } else { if (dif12 < dif02) dadc0 = dadc2; // �������� 0 else dadc1 = dadc2; // �������� 1 } rez = dadc0 + dadc1; rez >>= 1; return rez; } static int number20 = 0; static int pass20 = 0; int ccc = 0; int number = 0; int complete20 = 1; void adc_comlete20(uint32_t value) { // void adc_comlete() { if(++ccc == 1000) int_led1 = 1; if(ccc == 2000) { int_led1 = 0; ccc = 0; } //printf("%d\n", number); switch(number20) { case 0: s1 = adc.read(p20); // printf("%d\n", s1); number20++; break; case 1: s2 = adc.read(p20); // printf("%d\n", s2); number20++; break; case 2: s3 = adc.read(p20); switch(++pass20) { case 1: sm1 = Major(s1, s2, s3); break; case 2: sm2 = Major(s1, s2, s3); break; case 3: sm3 = Major(s1, s2, s3); smag = Major(sm1, sm2, sm3); adc.interrupt_state(p20, 0); pass20 = 0; complete20 = 1; break; } number20 = 0; } } int ddd = 0; static int number19 = 0; int complete19 = 1; static int pass19 = 0; void adc_comlete19(uint32_t value) { if(++ddd == 1000) int_led2 = 1; if(ddd == 2000) { int_led2 = 0; ddd = 0; } //printf("%d\n", number); switch(number19) { case 0: i1 = adc.read(p19); // printf(" %d\n", i1); number19++; break; case 1: i2 = adc.read(p19); // printf(" %d\n", i2); number19++; break; case 2: i3 = adc.read(p19); switch(++pass19) { case 1: im1 = Major(i1, i2, i3); break; case 2: im2 = Major(i1, i2, i3); break; case 3: im3 = Major(i1, i2, i3); smag = Major(im1, im2, im3); adc.interrupt_state(p19, 0); pass19 = 0; complete19 = 1; break; } number19=0; } } int eee = 0; static int number16 = 0; int complete16 = 1; int pass16 = 0; void adc_comlete16(uint32_t value) { if(++eee == 1000) int_led3 = 1; if(eee == 2000) { int_led3 = 0; eee = 0; } //printf("%d\n", number); switch(number16) { case 0: a1 = adc.read(p16); // printf(" %d\n", a1); number16++; break; case 1: a2 = adc.read(p16); // printf(" %d\n", a2); number16++; break; case 2: a3 = adc.read(p16); switch(++pass16) { case 1: am1 = Major(a1, a2, a3); break; case 2: am2 = Major(a1, a2, a3); break; case 3: am3 = Major(a1, a2, a3); amag = Major(am1, am2, am3); adc.interrupt_state(p16, 0); pass16 = 0; complete16 = 1; break; } number16=0; } } int delta; float err; void flip() { // if(complete20 && complete19 && complete16) { { complete20 = complete19 = complete16 = 0; int_led4 = 0; sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1); Net::poll(); //Do network stuff udp.sendto( str, strlen(str)+1, &multicast ); adc.interrupt_state(p20, 1); adc.interrupt_state(p19, 1); adc.interrupt_state(p16, 1); } // else { // int_led4 = 1; // } } /* switch(number) { case 0: // s1 = adc.read(p20); number++; break; case 3: // s2 = adc.read(p20); number++; break; case 6: // s3 = adc.read(p20); number++; sm1 = Major(s1, s2, s3); // sprintf(str, "1=%4u\0",sm1); // Net::poll(); //Do network stuff // udp.sendto( str, strlen(str)+1, &multicast ); break; case 1: number++; // i1 = adc.read(p19); break; case 4: number++; // i2 = adc.read(p19); break; case 7: number++; // i3 = adc.read(p19); im1 = Major(i1, i2, i3); // sprintf(str, "2=%4u %4u\0",sm1, im1); // Net::poll(); //Do network stuff // udp.sendto( str, strlen(str)+1, &multicast ); break; case 2: number++; // a1 = adc.read(p16); break; case 5: number++; // a2 = adc.read(p16); break; case 8: number=0; // a3 = adc.read(p16); am1 = Major(a1, a2, a3); sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1); Net::poll(); //Do network stuff udp.sendto( str, strlen(str)+1, &multicast ); break; } } */ #define MASK 0xC700000C //#define MASK 0x00000000 int main() { pc.baud(57600); //Ethernet initializing, Serial Interface - 57600 kbit/s printf("Setting up...\n"); P21 = P22 = P23 = 1; EthernetErr ethErr = eth.setup(); if (ethErr) { // printf("Error %d in setup.\n", ethErr); return -1; } // printf("Setup OK\n"); // Host multicast(IpAddr(239, 192, 1, 100), 50000, NULL); //Join multicast group on port 50000 AnalogIn in0(p20); AnalogIn in1(p19); // AnalogIn in2(p18); AnalogIn in3(p16); // AnalogIn in4(p16); // AnalogIn in5(p15); // PortOut(Port0, MASK); // DigitalOut P19(p19); AnalogOut tri(p18); DigitalOut P17(p17); DigitalOut P15(p15); P17 = 0; P15 = 0;// = P19 = 0; udp.setOnEvent(&onUDPSocketEvent); udp.bind(multicast); Net::poll(); // tmr.start(); //Turning ON Burst-mode ADC on pins 17,18,19,20 note: connect not used ADC ping to ground // adc.startmode(0,0); adc.burst(1); adc.setup(p20,1); adc.setup(p19,1); // adc.select(p20); // adc.start(); // adc.setup(p18,1); adc.setup(p16,1); // printf("start\n"); // printf("%d\n", adc.channel_to_pin_number(0)); adc.append(p20, adc_comlete20); adc.interrupt_state(p20, 0); adc.append(p19, adc_comlete19); adc.interrupt_state(p19, 0); adc.append(p16, adc_comlete16); adc.interrupt_state(p16, 0); flipper.attach_us(&flip, 500); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz) tri = 0; while(1) { tri = tri + 0.001; wait_us(100); if(tri >= 0.06) { tri = 0; } } }