|
@@ -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 --;
|