NucleoF401RE A/D Envelope detection with Moving average, transfer via XBww

Dependencies:   mbed

Committer:
nagasm
Date:
Tue Dec 09 00:51:38 2014 +0000
Revision:
0:14c6afea35c7
NucleoF401RE A/D Envelope detection with Moving average, transfer via XBww

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nagasm 0:14c6afea35c7 1 #include "mbed.h"
nagasm 0:14c6afea35c7 2 #include "sub.hpp"
nagasm 0:14c6afea35c7 3
nagasm 0:14c6afea35c7 4 float mean_sum, ad_data[201];
nagasm 0:14c6afea35c7 5 int average_mode, max_count, ad_pointer[5];
nagasm 0:14c6afea35c7 6
nagasm 0:14c6afea35c7 7 void sum_clear(){
nagasm 0:14c6afea35c7 8 int i;
nagasm 0:14c6afea35c7 9 for (i=0; i<5; i++) ad_pointer[i] = 0;
nagasm 0:14c6afea35c7 10 for (i=0; i<201; i++) ad_data[i] = 0;
nagasm 0:14c6afea35c7 11 mean_sum = 0;
nagasm 0:14c6afea35c7 12 }
nagasm 0:14c6afea35c7 13
nagasm 0:14c6afea35c7 14 float move_mean_calc(float data){
nagasm 0:14c6afea35c7 15 mean_sum = mean_sum - ad_data[ad_pointer[0]] + data;
nagasm 0:14c6afea35c7 16 ad_data[ad_pointer[0]] = data;
nagasm 0:14c6afea35c7 17 ad_pointer[0]++;
nagasm 0:14c6afea35c7 18 if(ad_pointer[0] == max_count) ad_pointer[0] = 0;
nagasm 0:14c6afea35c7 19 return(mean_sum / (float)max_count);
nagasm 0:14c6afea35c7 20 }
nagasm 0:14c6afea35c7 21
nagasm 0:14c6afea35c7 22 int main(){
nagasm 0:14c6afea35c7 23 int i, detection, sum, gain;
nagasm 0:14c6afea35c7 24 i = 0;
nagasm 0:14c6afea35c7 25 detection = 0;
nagasm 0:14c6afea35c7 26 gain = 1;
nagasm 0:14c6afea35c7 27 average_mode = 0;
nagasm 0:14c6afea35c7 28 for (i=0; i<5; i++) timer_value[i] = 0;
nagasm 0:14c6afea35c7 29 sum_clear();
nagasm 0:14c6afea35c7 30 xbee.baud(38400);
nagasm 0:14c6afea35c7 31 xbee.attach(&rx_fifoset, xbee.RxIrq);
nagasm 0:14c6afea35c7 32 timer_setup.attach_us(&timer_interrupt, 50); // 50usec
nagasm 0:14c6afea35c7 33 while(1){
nagasm 0:14c6afea35c7 34 if(timer_value[2] > 99){ // 5msec
nagasm 0:14c6afea35c7 35 timer_value[2] = 0;
nagasm 0:14c6afea35c7 36 float data = (float)gain * (analog_value3.read() - 0.5f);
nagasm 0:14c6afea35c7 37 if(detection == 1){
nagasm 0:14c6afea35c7 38 if (data < 0) data = -data;
nagasm 0:14c6afea35c7 39 }
nagasm 0:14c6afea35c7 40 if(average_mode != 0) data = move_mean_calc(data);
nagasm 0:14c6afea35c7 41 tx_message((uint16_t)((data + 1.0f) * 2047)<<4);
nagasm 0:14c6afea35c7 42 }
nagasm 0:14c6afea35c7 43 if(timer_value[0] > 9999){ // 500msec
nagasm 0:14c6afea35c7 44 timer_value[0] = 0;
nagasm 0:14c6afea35c7 45 myled = !myled;
nagasm 0:14c6afea35c7 46 }
nagasm 0:14c6afea35c7 47 tx_fifo_check();
nagasm 0:14c6afea35c7 48 if(rx_fifo_check() == 1){
nagasm 0:14c6afea35c7 49 sum = 0;
nagasm 0:14c6afea35c7 50 for (i=0; i<6; i++) sum += conv_hex(raw_data[i])<<(4*(5-i));
nagasm 0:14c6afea35c7 51 tx_message(sum); /* Echo Back */
nagasm 0:14c6afea35c7 52 if(sum>>16 == 0x80){
nagasm 0:14c6afea35c7 53 switch((sum & 0xff00)>>8){
nagasm 0:14c6afea35c7 54 case 0x00:
nagasm 0:14c6afea35c7 55 detection = sum & 0x01;
nagasm 0:14c6afea35c7 56 break;
nagasm 0:14c6afea35c7 57 case 0x01:
nagasm 0:14c6afea35c7 58 gain = sum & 0x0f;
nagasm 0:14c6afea35c7 59 break;
nagasm 0:14c6afea35c7 60 case 0x02:
nagasm 0:14c6afea35c7 61 average_mode = sum & 0x07;
nagasm 0:14c6afea35c7 62 max_count = 5;
nagasm 0:14c6afea35c7 63 switch(average_mode){
nagasm 0:14c6afea35c7 64 case(2):
nagasm 0:14c6afea35c7 65 max_count = 10;
nagasm 0:14c6afea35c7 66 break;
nagasm 0:14c6afea35c7 67 case(3):
nagasm 0:14c6afea35c7 68 max_count = 20;
nagasm 0:14c6afea35c7 69 break;
nagasm 0:14c6afea35c7 70 case(4):
nagasm 0:14c6afea35c7 71 max_count = 50;
nagasm 0:14c6afea35c7 72 break;
nagasm 0:14c6afea35c7 73 case(5):
nagasm 0:14c6afea35c7 74 max_count = 100;
nagasm 0:14c6afea35c7 75 break;
nagasm 0:14c6afea35c7 76 case(6):
nagasm 0:14c6afea35c7 77 max_count = 200;
nagasm 0:14c6afea35c7 78 break;
nagasm 0:14c6afea35c7 79 }
nagasm 0:14c6afea35c7 80 sum_clear();
nagasm 0:14c6afea35c7 81 break;
nagasm 0:14c6afea35c7 82 }
nagasm 0:14c6afea35c7 83 }
nagasm 0:14c6afea35c7 84 }
nagasm 0:14c6afea35c7 85 }
nagasm 0:14c6afea35c7 86 }