ok
Dependencies: mbed AnalogIn_Diff_ok MovingAverage_ok
trms/trms.cpp@2:f82c6978c589, 2016-01-08 (annotated)
- Committer:
- fblanc
- Date:
- Fri Jan 08 08:09:34 2016 +0000
- Revision:
- 2:f82c6978c589
ok
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fblanc | 2:f82c6978c589 | 1 | #include "trms.h" |
fblanc | 2:f82c6978c589 | 2 | |
fblanc | 2:f82c6978c589 | 3 | #define DEBUG 1 |
fblanc | 2:f82c6978c589 | 4 | //Debug is disabled by default |
fblanc | 2:f82c6978c589 | 5 | #if (defined(DEBUG)) |
fblanc | 2:f82c6978c589 | 6 | |
fblanc | 2:f82c6978c589 | 7 | #define DBG(x, ...) std::printf("[trms : DBG]"x"\r\n", ##__VA_ARGS__); |
fblanc | 2:f82c6978c589 | 8 | #define WARN(x, ...) std::printf("[trms : WARN]"x"\r\n", ##__VA_ARGS__); |
fblanc | 2:f82c6978c589 | 9 | #define ERR(x, ...) std::printf("[trms : ERR]"x"\r\n", ##__VA_ARGS__); |
fblanc | 2:f82c6978c589 | 10 | #define INFO(x, ...) std::printf("[trms : INFO]"x"\r\n", ##__VA_ARGS__); |
fblanc | 2:f82c6978c589 | 11 | |
fblanc | 2:f82c6978c589 | 12 | #else |
fblanc | 2:f82c6978c589 | 13 | |
fblanc | 2:f82c6978c589 | 14 | #define DBG(x, ...) |
fblanc | 2:f82c6978c589 | 15 | #define WARN(x, ...) |
fblanc | 2:f82c6978c589 | 16 | #define ERR(x, ...) |
fblanc | 2:f82c6978c589 | 17 | #define INFO(x, ...) |
fblanc | 2:f82c6978c589 | 18 | #endif |
fblanc | 2:f82c6978c589 | 19 | |
fblanc | 2:f82c6978c589 | 20 | trms::trms(int adc_Diff_number_chan) : AnalogIn_Diff(adc_Diff_number_chan), vtrms(NSAMPLE,UAC_NON2) |
fblanc | 2:f82c6978c589 | 21 | { |
fblanc | 2:f82c6978c589 | 22 | |
fblanc | 2:f82c6978c589 | 23 | timer_min.stop(); |
fblanc | 2:f82c6978c589 | 24 | timer_max.stop(); |
fblanc | 2:f82c6978c589 | 25 | timer_min.reset(); |
fblanc | 2:f82c6978c589 | 26 | timer_max.reset(); |
fblanc | 2:f82c6978c589 | 27 | _time_min=0; |
fblanc | 2:f82c6978c589 | 28 | F_timer_min=false; |
fblanc | 2:f82c6978c589 | 29 | _time_max=0; |
fblanc | 2:f82c6978c589 | 30 | F_timer_max=false; |
fblanc | 2:f82c6978c589 | 31 | _min=UAC_NON2; |
fblanc | 2:f82c6978c589 | 32 | _max=UAC_NON2; |
fblanc | 2:f82c6978c589 | 33 | gain=GAIN; |
fblanc | 2:f82c6978c589 | 34 | offset=0.0; |
fblanc | 2:f82c6978c589 | 35 | _flag_trms=false; |
fblanc | 2:f82c6978c589 | 36 | DBG("Unon =%0.0fV",UAC_NON); |
fblanc | 2:f82c6978c589 | 37 | DBG("RAW Umax2 =%d",UAC_MAX2); |
fblanc | 2:f82c6978c589 | 38 | DBG("RAW Umin2 =%d",UAC_MIN2); |
fblanc | 2:f82c6978c589 | 39 | DBG("Gain =%f",gain); |
fblanc | 2:f82c6978c589 | 40 | |
fblanc | 2:f82c6978c589 | 41 | |
fblanc | 2:f82c6978c589 | 42 | DBG("Freq UAC=%dHz",FREQ); |
fblanc | 2:f82c6978c589 | 43 | DBG("Sample =%d",NSAMPLE); |
fblanc | 2:f82c6978c589 | 44 | DBG("Sample =%dus",TSAMPLE); |
fblanc | 2:f82c6978c589 | 45 | |
fblanc | 2:f82c6978c589 | 46 | |
fblanc | 2:f82c6978c589 | 47 | |
fblanc | 2:f82c6978c589 | 48 | } |
fblanc | 2:f82c6978c589 | 49 | |
fblanc | 2:f82c6978c589 | 50 | |
fblanc | 2:f82c6978c589 | 51 | |
fblanc | 2:f82c6978c589 | 52 | float trms::read_rms() |
fblanc | 2:f82c6978c589 | 53 | { |
fblanc | 2:f82c6978c589 | 54 | return (sqrt((float)vtrms.GetAverage())*gain-offset); |
fblanc | 2:f82c6978c589 | 55 | |
fblanc | 2:f82c6978c589 | 56 | } |
fblanc | 2:f82c6978c589 | 57 | |
fblanc | 2:f82c6978c589 | 58 | /** |
fblanc | 2:f82c6978c589 | 59 | * @brief Destructor. |
fblanc | 2:f82c6978c589 | 60 | */ |
fblanc | 2:f82c6978c589 | 61 | trms::~trms() |
fblanc | 2:f82c6978c589 | 62 | { |
fblanc | 2:f82c6978c589 | 63 | |
fblanc | 2:f82c6978c589 | 64 | flipperadc_Diff.detach(); |
fblanc | 2:f82c6978c589 | 65 | } |
fblanc | 2:f82c6978c589 | 66 | |
fblanc | 2:f82c6978c589 | 67 | void trms::start() |
fblanc | 2:f82c6978c589 | 68 | { |
fblanc | 2:f82c6978c589 | 69 | flipperadc_Diff.attach_us<trms>(this,&trms::flipadc_Diff, TSAMPLE); |
fblanc | 2:f82c6978c589 | 70 | } |
fblanc | 2:f82c6978c589 | 71 | |
fblanc | 2:f82c6978c589 | 72 | |
fblanc | 2:f82c6978c589 | 73 | |
fblanc | 2:f82c6978c589 | 74 | void trms::flipadc_Diff() |
fblanc | 2:f82c6978c589 | 75 | { |
fblanc | 2:f82c6978c589 | 76 | int16_t val_i16; |
fblanc | 2:f82c6978c589 | 77 | uint32_t val2_ui32; |
fblanc | 2:f82c6978c589 | 78 | |
fblanc | 2:f82c6978c589 | 79 | val_i16=read_raws16(); |
fblanc | 2:f82c6978c589 | 80 | |
fblanc | 2:f82c6978c589 | 81 | vtrms.Insert(val_i16*val_i16); |
fblanc | 2:f82c6978c589 | 82 | |
fblanc | 2:f82c6978c589 | 83 | val2_ui32=vtrms.GetAverage(); |
fblanc | 2:f82c6978c589 | 84 | |
fblanc | 2:f82c6978c589 | 85 | //MIN |
fblanc | 2:f82c6978c589 | 86 | if(val2_ui32<UAC_MIN2 && F_timer_min ==false) { |
fblanc | 2:f82c6978c589 | 87 | |
fblanc | 2:f82c6978c589 | 88 | timer_min.start(); |
fblanc | 2:f82c6978c589 | 89 | F_timer_min = true; |
fblanc | 2:f82c6978c589 | 90 | |
fblanc | 2:f82c6978c589 | 91 | } |
fblanc | 2:f82c6978c589 | 92 | |
fblanc | 2:f82c6978c589 | 93 | if(F_timer_min ==true) { |
fblanc | 2:f82c6978c589 | 94 | if(val2_ui32>UAC_MIN2STOP ) { |
fblanc | 2:f82c6978c589 | 95 | |
fblanc | 2:f82c6978c589 | 96 | timer_min.stop(); |
fblanc | 2:f82c6978c589 | 97 | F_timer_min = false; |
fblanc | 2:f82c6978c589 | 98 | _flag_trms=true; //????????????????? |
fblanc | 2:f82c6978c589 | 99 | _flag_min=true; |
fblanc | 2:f82c6978c589 | 100 | } |
fblanc | 2:f82c6978c589 | 101 | |
fblanc | 2:f82c6978c589 | 102 | |
fblanc | 2:f82c6978c589 | 103 | else if(timer_min.read_ms()>20) { |
fblanc | 2:f82c6978c589 | 104 | |
fblanc | 2:f82c6978c589 | 105 | _time_min=timer_min.read_ms(); |
fblanc | 2:f82c6978c589 | 106 | _min=MIN(val2_ui32,_min); |
fblanc | 2:f82c6978c589 | 107 | |
fblanc | 2:f82c6978c589 | 108 | } |
fblanc | 2:f82c6978c589 | 109 | //max |
fblanc | 2:f82c6978c589 | 110 | if(val2_ui32<UAC_MAX2STOP && F_timer_max ==true) { |
fblanc | 2:f82c6978c589 | 111 | timer_max.stop(); |
fblanc | 2:f82c6978c589 | 112 | F_timer_max = false; |
fblanc | 2:f82c6978c589 | 113 | _flag_trms=true; |
fblanc | 2:f82c6978c589 | 114 | _flag_max=true; |
fblanc | 2:f82c6978c589 | 115 | } |
fblanc | 2:f82c6978c589 | 116 | if(val2_ui32>UAC_MAX2 && F_timer_max ==false) { |
fblanc | 2:f82c6978c589 | 117 | |
fblanc | 2:f82c6978c589 | 118 | timer_max.start(); |
fblanc | 2:f82c6978c589 | 119 | F_timer_max = true; |
fblanc | 2:f82c6978c589 | 120 | |
fblanc | 2:f82c6978c589 | 121 | } |
fblanc | 2:f82c6978c589 | 122 | if(timer_max.read_ms()>20 && F_timer_max ==true) { |
fblanc | 2:f82c6978c589 | 123 | |
fblanc | 2:f82c6978c589 | 124 | _time_max=timer_max.read_ms(); |
fblanc | 2:f82c6978c589 | 125 | _max=MAX(val2_ui32,_max); |
fblanc | 2:f82c6978c589 | 126 | |
fblanc | 2:f82c6978c589 | 127 | } |
fblanc | 2:f82c6978c589 | 128 | } |
fblanc | 2:f82c6978c589 | 129 | |
fblanc | 2:f82c6978c589 | 130 | } |
fblanc | 2:f82c6978c589 | 131 | |
fblanc | 2:f82c6978c589 | 132 | bool trms::flag (float *rms, uint32_t *time) |
fblanc | 2:f82c6978c589 | 133 | { |
fblanc | 2:f82c6978c589 | 134 | bool old_flag =_flag_trms; |
fblanc | 2:f82c6978c589 | 135 | |
fblanc | 2:f82c6978c589 | 136 | if(_flag_trms==true) { |
fblanc | 2:f82c6978c589 | 137 | _flag_trms=false; |
fblanc | 2:f82c6978c589 | 138 | if(_flag_min==true) { |
fblanc | 2:f82c6978c589 | 139 | |
fblanc | 2:f82c6978c589 | 140 | *time=_time_min; |
fblanc | 2:f82c6978c589 | 141 | timer_min.reset(); |
fblanc | 2:f82c6978c589 | 142 | *rms=(sqrt((float)_min)*gain-offset); |
fblanc | 2:f82c6978c589 | 143 | _min=UAC_NON2; |
fblanc | 2:f82c6978c589 | 144 | _flag_min=false; |
fblanc | 2:f82c6978c589 | 145 | |
fblanc | 2:f82c6978c589 | 146 | } |
fblanc | 2:f82c6978c589 | 147 | |
fblanc | 2:f82c6978c589 | 148 | else if(_flag_max==true) { |
fblanc | 2:f82c6978c589 | 149 | |
fblanc | 2:f82c6978c589 | 150 | *time=_time_max; |
fblanc | 2:f82c6978c589 | 151 | timer_max.reset(); |
fblanc | 2:f82c6978c589 | 152 | *rms=(sqrt((float)_max)*gain-offset); |
fblanc | 2:f82c6978c589 | 153 | _max=UAC_NON2; |
fblanc | 2:f82c6978c589 | 154 | _flag_max=false; |
fblanc | 2:f82c6978c589 | 155 | |
fblanc | 2:f82c6978c589 | 156 | } |
fblanc | 2:f82c6978c589 | 157 | |
fblanc | 2:f82c6978c589 | 158 | } else { |
fblanc | 2:f82c6978c589 | 159 | |
fblanc | 2:f82c6978c589 | 160 | *rms=read_rms(); |
fblanc | 2:f82c6978c589 | 161 | *time=0; |
fblanc | 2:f82c6978c589 | 162 | } |
fblanc | 2:f82c6978c589 | 163 | |
fblanc | 2:f82c6978c589 | 164 | return old_flag; |
fblanc | 2:f82c6978c589 | 165 | |
fblanc | 2:f82c6978c589 | 166 | } |
fblanc | 2:f82c6978c589 | 167 | |
fblanc | 2:f82c6978c589 | 168 | |
fblanc | 2:f82c6978c589 | 169 | void trms::set_gain(float _gain) |
fblanc | 2:f82c6978c589 | 170 | { |
fblanc | 2:f82c6978c589 | 171 | gain=_gain; |
fblanc | 2:f82c6978c589 | 172 | } |
fblanc | 2:f82c6978c589 | 173 | |
fblanc | 2:f82c6978c589 | 174 | void trms::set_offset(float _offset) |
fblanc | 2:f82c6978c589 | 175 | { |
fblanc | 2:f82c6978c589 | 176 | offset=_offset; |
fblanc | 2:f82c6978c589 | 177 | } |
fblanc | 2:f82c6978c589 | 178 | float trms::get_gain() |
fblanc | 2:f82c6978c589 | 179 | { |
fblanc | 2:f82c6978c589 | 180 | return gain; |
fblanc | 2:f82c6978c589 | 181 | } |
fblanc | 2:f82c6978c589 | 182 | |
fblanc | 2:f82c6978c589 | 183 | float trms::get_offset() |
fblanc | 2:f82c6978c589 | 184 | { |
fblanc | 2:f82c6978c589 | 185 | return offset; |
fblanc | 2:f82c6978c589 | 186 | } |