Yoichi Nagashima
/
CQ_nagasm_06_LPF
add - CQpub0 Mikami / FIR_LPF_Direct
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "sub.hpp" 00003 #include "FIR_LPF.hpp" 00004 00005 float mean_sum, ad_data[101]; 00006 int average_mode, max_count, ad_pointer[5]; 00007 00008 void sum_clear(){ 00009 int i; 00010 for (i=0; i<5; i++) ad_pointer[i] = 0; 00011 for (i=0; i<101; i++) ad_data[i] = 0; 00012 mean_sum = 0; 00013 } 00014 00015 float move_mean_calc(float data){ 00016 mean_sum = mean_sum - ad_data[ad_pointer[0]] + data; 00017 ad_data[ad_pointer[0]] = data; 00018 ad_pointer[0]++; 00019 if(ad_pointer[0] == max_count) ad_pointer[0] = 0; 00020 return(mean_sum / (float)max_count); 00021 } 00022 00023 int main(){ 00024 int i, detection, sum, gain; 00025 i = 0; 00026 detection = 0; 00027 gain = 1; 00028 for (i=0; i<5; i++) timer_value[i] = 0; 00029 for (i=0; i<=order; i++) xn[i] = 0.0; 00030 sum_clear(); 00031 xbee.baud(38400); 00032 xbee.attach(&rx_fifoset, xbee.RxIrq); 00033 timer_setup.attach_us(&timer_interrupt, 5); // 5usec 00034 while(1){ 00035 if(timer_value[1] > 19){ // 0.1msec sampling 00036 timer_value[1] = 0; 00037 float data = (float)gain * (analog_value3.read() - 0.5f); 00038 if(detection == 1){ 00039 if (data < 0) data = -data; 00040 } 00041 data = FIR_calc(data); // FIR calc call 00042 if(timer_value[2] > 1999){ // 10msec 00043 timer_value[2] = 0; 00044 if(average_mode != 0) data = move_mean_calc(data); 00045 tx_message((uint16_t)((data + 1.0f) * 2047)<<4); 00046 } 00047 } 00048 if(timer_value[0] > 99999){ // 500msec 00049 timer_value[0] = 0; 00050 myled = !myled; 00051 } 00052 tx_fifo_check(); 00053 if(rx_fifo_check() == 1){ 00054 sum = 0; 00055 for (i=0; i<6; i++) sum += conv_hex(raw_data[i])<<(4*(5-i)); 00056 tx_message(sum); // Echo Back 00057 if(sum>>16 == 0x80){ 00058 switch((sum & 0xff00)>>8){ 00059 case 0x00: 00060 detection = sum & 0x01; 00061 break; 00062 case 0x01: 00063 gain = sum & 0x0f; 00064 break; 00065 case 0x02: 00066 average_mode = sum & 0x07; 00067 max_count = 5; 00068 switch(average_mode){ 00069 case(2): 00070 max_count = 10; 00071 break; 00072 case(3): 00073 max_count = 20; 00074 break; 00075 case(4): 00076 max_count = 50; 00077 break; 00078 case(5): 00079 max_count = 100; 00080 break; 00081 } 00082 sum_clear(); 00083 break; 00084 } 00085 } 00086 } 00087 } 00088 }
Generated on Sat Jul 23 2022 06:51:34 by 1.7.2