EZR
Dependencies: CRC16 FreescaleIAP FreescaleWatchdog GGSProtocol LM75B PIMA Parameters PersistentCircularQueue SerialNumberV2COM mbed-dev-watchdog_2016_03_04
Fork of smartRamalKW by
sensor.cpp@25:2c578b923ea9, 2015-11-04 (annotated)
- Committer:
- tpadovani
- Date:
- Wed Nov 04 21:47:24 2015 +0000
- Revision:
- 25:2c578b923ea9
- Parent:
- 24:69e7e7079915
Vers?o 0.13 - Envio de "announces" assincronos e sincronismo de relogio a partir da resposta do concentrador.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tpadovani | 5:1bc98277c257 | 1 | #include "sensor.h" |
tpadovani | 5:1bc98277c257 | 2 | |
tpadovani | 8:e8d86c66283c | 3 | extern AnalogIn voltage[]; |
tpadovani | 22:b66e36356dd4 | 4 | extern DigitalOut ledLoad; |
tpadovani | 5:1bc98277c257 | 5 | extern ParametersBlock APP_PARAMETERS; |
tpadovani | 5:1bc98277c257 | 6 | |
tpadovani | 8:e8d86c66283c | 7 | Ticker tickerSamples; |
tpadovani | 8:e8d86c66283c | 8 | Timeout samplesTimeout; |
tpadovani | 8:e8d86c66283c | 9 | unsigned char currentChannel; |
tpadovani | 8:e8d86c66283c | 10 | float sample[DEFAULT_SAMPLES]; |
tpadovani | 8:e8d86c66283c | 11 | int currentSample; |
tpadovani | 8:e8d86c66283c | 12 | bool finished; |
tpadovani | 8:e8d86c66283c | 13 | bool timeout; |
tpadovani | 8:e8d86c66283c | 14 | |
tpadovani | 22:b66e36356dd4 | 15 | float getInstVoltage(unsigned char channel){ |
tpadovani | 8:e8d86c66283c | 16 | currentChannel = channel; |
tpadovani | 8:e8d86c66283c | 17 | currentSample = 0; |
tpadovani | 8:e8d86c66283c | 18 | finished = false; |
tpadovani | 8:e8d86c66283c | 19 | timeout = false; |
tpadovani | 8:e8d86c66283c | 20 | tickerSamples.attach_us(&readSample, APP_PARAMETERS.SAMPLES_DELAY_US); |
tpadovani | 8:e8d86c66283c | 21 | samplesTimeout.attach_us(&timeoutReadingSamples, (DEFAULT_SAMPLES + 2) * APP_PARAMETERS.SAMPLES_DELAY_US); |
tpadovani | 8:e8d86c66283c | 22 | |
tpadovani | 8:e8d86c66283c | 23 | while(!finished && !timeout){ |
tpadovani | 8:e8d86c66283c | 24 | wait(0.1f); |
tpadovani | 8:e8d86c66283c | 25 | } |
tpadovani | 8:e8d86c66283c | 26 | |
tpadovani | 22:b66e36356dd4 | 27 | float resp = calculateRMS(APP_PARAMETERS.SAMPLES_VOLTAGE_ANG_COEF.floatValue, APP_PARAMETERS.SAMPLES_VOLTAGE_LIN_COEF.floatValue); |
tpadovani | 16:cae76dbd681f | 28 | float limit = 0; |
tpadovani | 16:cae76dbd681f | 29 | if(channel == 0){ |
tpadovani | 16:cae76dbd681f | 30 | limit = APP_PARAMETERS.LIMITE_TENSAO_ZERO_CH0_V; |
tpadovani | 16:cae76dbd681f | 31 | } else{ |
tpadovani | 16:cae76dbd681f | 32 | limit = APP_PARAMETERS.LIMITE_TENSAO_ZERO_CH1_V; |
tpadovani | 16:cae76dbd681f | 33 | } |
tpadovani | 16:cae76dbd681f | 34 | if(resp < limit){ |
tpadovani | 16:cae76dbd681f | 35 | return 0; |
tpadovani | 16:cae76dbd681f | 36 | } else{ |
tpadovani | 16:cae76dbd681f | 37 | return resp; |
tpadovani | 16:cae76dbd681f | 38 | } |
tpadovani | 8:e8d86c66283c | 39 | } |
tpadovani | 8:e8d86c66283c | 40 | |
tpadovani | 22:b66e36356dd4 | 41 | float getInstCurrent(){ |
tpadovani | 22:b66e36356dd4 | 42 | currentChannel = 2; |
tpadovani | 22:b66e36356dd4 | 43 | currentSample = 0; |
tpadovani | 22:b66e36356dd4 | 44 | finished = false; |
tpadovani | 22:b66e36356dd4 | 45 | timeout = false; |
tpadovani | 22:b66e36356dd4 | 46 | tickerSamples.attach_us(&readSample, APP_PARAMETERS.SAMPLES_DELAY_US); |
tpadovani | 22:b66e36356dd4 | 47 | samplesTimeout.attach_us(&timeoutReadingSamples, (DEFAULT_SAMPLES + 2) * APP_PARAMETERS.SAMPLES_DELAY_US); |
tpadovani | 22:b66e36356dd4 | 48 | |
tpadovani | 22:b66e36356dd4 | 49 | while(!finished && !timeout){ |
tpadovani | 22:b66e36356dd4 | 50 | wait(0.1f); |
tpadovani | 22:b66e36356dd4 | 51 | } |
tpadovani | 22:b66e36356dd4 | 52 | |
tpadovani | 22:b66e36356dd4 | 53 | float resp = calculateRMS(APP_PARAMETERS.SAMPLES_CURRENT_ANG_COEF.floatValue, APP_PARAMETERS.SAMPLES_CURRENT_LIN_COEF.floatValue); |
tpadovani | 25:2c578b923ea9 | 54 | float limit = APP_PARAMETERS.LIMITE_CORRENTE_ZERO_A.floatValue; |
tpadovani | 22:b66e36356dd4 | 55 | if(resp < limit){ |
tpadovani | 22:b66e36356dd4 | 56 | return 0; |
tpadovani | 22:b66e36356dd4 | 57 | } else{ |
tpadovani | 22:b66e36356dd4 | 58 | return resp; |
tpadovani | 22:b66e36356dd4 | 59 | } |
tpadovani | 22:b66e36356dd4 | 60 | } |
tpadovani | 22:b66e36356dd4 | 61 | |
tpadovani | 22:b66e36356dd4 | 62 | bool getSensorState(unsigned char channel){ |
tpadovani | 23:85202a52482d | 63 | unsigned char lineChannel = channel == 1 ? 0 : 1; |
tpadovani | 23:85202a52482d | 64 | float line = getInstVoltage(lineChannel); |
tpadovani | 23:85202a52482d | 65 | float load = getInstVoltage(channel); |
tpadovani | 23:85202a52482d | 66 | |
tpadovani | 24:69e7e7079915 | 67 | if((line - load) > (line*APP_PARAMETERS.LIMITE_TENSAO_SENSOR_V)/100.0){ |
tpadovani | 23:85202a52482d | 68 | ledLoad = LED_ON; |
tpadovani | 7:fe8e827f4d1b | 69 | return SENSOR_COM_FORNECIMENTO; |
tpadovani | 24:69e7e7079915 | 70 | } else if((line - load) < -(line*APP_PARAMETERS.LIMITE_TENSAO_SENSOR_V)/100.0){ |
tpadovani | 24:69e7e7079915 | 71 | ledLoad = LED_ON; |
tpadovani | 24:69e7e7079915 | 72 | return SENSOR_SEM_FORNECIMENTO; |
tpadovani | 7:fe8e827f4d1b | 73 | } else{ |
tpadovani | 23:85202a52482d | 74 | ledLoad = LED_OFF; |
tpadovani | 7:fe8e827f4d1b | 75 | return SENSOR_SEM_FORNECIMENTO; |
tpadovani | 7:fe8e827f4d1b | 76 | } |
tpadovani | 5:1bc98277c257 | 77 | } |
tpadovani | 8:e8d86c66283c | 78 | |
tpadovani | 24:69e7e7079915 | 79 | bool checkVoltageReturn(unsigned char channel){ |
tpadovani | 24:69e7e7079915 | 80 | unsigned char lineChannel = channel == 1 ? 0 : 1; |
tpadovani | 24:69e7e7079915 | 81 | float line = getInstVoltage(lineChannel); |
tpadovani | 24:69e7e7079915 | 82 | float load = getInstVoltage(channel); |
tpadovani | 24:69e7e7079915 | 83 | |
tpadovani | 24:69e7e7079915 | 84 | if(load > (line + (line*APP_PARAMETERS.LIMITE_TENSAO_SENSOR_V)/100.0)){ |
tpadovani | 24:69e7e7079915 | 85 | return SENSOR_COM_FORNECIMENTO; |
tpadovani | 24:69e7e7079915 | 86 | } else{ |
tpadovani | 24:69e7e7079915 | 87 | return SENSOR_SEM_FORNECIMENTO; |
tpadovani | 24:69e7e7079915 | 88 | } |
tpadovani | 24:69e7e7079915 | 89 | } |
tpadovani | 24:69e7e7079915 | 90 | |
tpadovani | 8:e8d86c66283c | 91 | void readSample(){ |
tpadovani | 8:e8d86c66283c | 92 | sample[currentSample++] = voltage[currentChannel]; |
tpadovani | 8:e8d86c66283c | 93 | if(currentSample == DEFAULT_SAMPLES){ |
tpadovani | 8:e8d86c66283c | 94 | finished = true; |
tpadovani | 8:e8d86c66283c | 95 | samplesTimeout.detach(); |
tpadovani | 8:e8d86c66283c | 96 | tickerSamples.detach(); |
tpadovani | 8:e8d86c66283c | 97 | } |
tpadovani | 8:e8d86c66283c | 98 | } |
tpadovani | 8:e8d86c66283c | 99 | |
tpadovani | 8:e8d86c66283c | 100 | void timeoutReadingSamples(){ |
tpadovani | 8:e8d86c66283c | 101 | tickerSamples.detach(); |
tpadovani | 8:e8d86c66283c | 102 | timeout = true; |
tpadovani | 8:e8d86c66283c | 103 | } |
tpadovani | 8:e8d86c66283c | 104 | |
tpadovani | 22:b66e36356dd4 | 105 | float calculateRMS(float angCoef, float linCoef){ |
tpadovani | 8:e8d86c66283c | 106 | float rms = 0; |
tpadovani | 8:e8d86c66283c | 107 | for(int i=0; i < DEFAULT_SAMPLES; i++){ |
tpadovani | 22:b66e36356dd4 | 108 | sample[i] = abs(sample[i]*angCoef + linCoef); |
tpadovani | 8:e8d86c66283c | 109 | rms += sample[i]*sample[i]; |
tpadovani | 8:e8d86c66283c | 110 | } |
tpadovani | 9:e501499af4ef | 111 | rms = rms / DEFAULT_SAMPLES; |
tpadovani | 8:e8d86c66283c | 112 | return sqrt(rms); |
tpadovani | 8:e8d86c66283c | 113 | } |