EZR

Dependencies:   CRC16 FreescaleIAP FreescaleWatchdog GGSProtocol LM75B PIMA Parameters PersistentCircularQueue SerialNumberV2COM mbed-dev-watchdog_2016_03_04

Fork of smartRamalKW by Equipe Firmware V2COM

Committer:
fprado
Date:
Thu Jun 16 18:55:57 2016 +0000
Revision:
35:78614a27b9e6
Parent:
25:2c578b923ea9
temporary snapshot

Who changed what in which revision?

UserRevisionLine numberNew 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 }