Ver código fonte

Коррекция вычислений значения измеренного тока

Vladimir N. Shilov 8 anos atrás
pai
commit
5e53eff137
1 arquivos alterados com 13 adições e 20 exclusões
  1. 13 20
      src/main.c

+ 13 - 20
src/main.c

@@ -32,6 +32,12 @@
 #define ADC_CHNL  ADC1_CHANNEL_4
 #define ADC_SCHT  ADC1_SCHMITTTRIG_CHANNEL4
 #define ADC_SMPLS 64
+// Supply voltage in mili volts
+#define ADC_VREF  3335
+// input OA multiplier -- [(3.6/0.68) + 1) * 1000]
+#define ADC_MULT  6294
+// shunt resistance in mili Ohms
+#define ADC_SHUNT 50
 
 #define BTN_PORT  (GPIOA)
 #define BTN_PINS  (GPIO_PIN_2)
@@ -180,33 +186,20 @@ void main(void)
         for(i=0; i<ADC_SMPLS; i++){
           tbuf += ConversionBuffer[i];
         }
-        /* пример:
-         ток 5А, на шунте 0.25В, на входе АЦП 2В,
-         с опорным 5В получаем код 409
-         после 64-х измерений будет 26176
-         после деления на 8 -- 3272
-         умножили на опорное напряжение -- 16360000
-         поделили на разрядность АЦП -- 1997 мВ
-         поделили на множитель ОУ -- 250 мВ
-         и поделили на сопротивление шунта -- 5000 мА
-        */
+
         if(tbuf > ADC_ZeroFix){
           tbuf -= ADC_ZeroFix;
 
-          tbuf >>= 3; // pre div
-          tbuf *= 3335; // Vref = Vcc
+          tbuf >>= 3; // предварительный делитель оверсемплинга
+          tbuf *= ADC_VREF; // Множим на опорное напряжение
           tbuf = (tbuf + 4096) / 8191; // get ADC input voltage in mV
-          tbuf *= 1000; // -- for OU divider //get voltage in uV
-          tbuf = (tbuf + 3147) / 6294; // get voltage from shunt
+          tbuf *= 1000; // компенсация коэф. усиления входного ОУ
+          tbuf *= 1000; // компенсация сопротивления шунта
+          tbuf = (tbuf + (ADC_MULT/2)) / ADC_MULT; // get voltage from shunt
           /* в Current ток в милиамперах */
-          tbuf *= 1000; // get voltage in uV
-          Current = (tbuf + 25) / 50; // shunt resistance in mOhms
+          Current = (tbuf + (ADC_SHUNT/2)) / ADC_SHUNT;
 
           SubSecondBfr += Current;
-
-        } else {
-          tbuf = 0;
-          Current = 0;
         }
 
         SubSecondCnt --;