Ver Fonte

Борьба за точность показаний.

Vladimir N. Shilov há 8 anos atrás
pai
commit
f0b891e08e
3 ficheiros alterados com 81 adições e 21 exclusões
  1. 50 0
      ReadMe.txt
  2. 17 14
      lib/adc.c
  3. 14 7
      src/main.c

+ 50 - 0
ReadMe.txt

@@ -337,3 +337,53 @@ Factory_VREFINT у меня == 0x7E, т.е. полное значение 0x067E
 Чуть упростил вычисления напряжения на шунте -- я уже вообще не помню, что 
 там и как...
 БП у меня может выдавать до 16 А, а настроен вроде на 6.6А...
+
+---
+2017.06.06
+
+Рассматривая плату...
+Дорожки обрывал...
+
+Делитель по напряжению -- 100 и 10 кОм. (Кд = 11)
+
+Усилитель шунта - 1 и 10 кОм, Ку = 10.
+Шунт на БП = 0.05 Ом, максимальный ток - 6.6 А.
+Если не менять шунт (а этого не хочеться), то для тока
+16А -- Ку=4.125, шаг ~4мА
+12А -- Ку=5.5, шаг ~3мА
+10А -- Ку=6.6, шаг ~2.4мА
+ 8А -- Ку=8.25, шаг ~2мА
+
+Есть такие резисторы 1%:
+	Ку	мах А	шаг ~ мА
+3.9К	3.9	16.923	4.1
+5.62К	5.62	11.744	2.9
+6.8К	6.8	 9.706	2.4
+9.1К	9.1	 7.253	1.8
+
+Если 1К заменить на 2К 0.5%, то:
+	Ку	мах А	шаг
+11К	5.5	12.00	2.9
+12К	6	11.00	2.7
+15К	7.5	 8.8	2.1
+18К	9	 7.333	1.8
+
+Пока больше склоняюсь к варианту 2/11 - 12А.
+
+И нужно будет увешать всё фильтрующими дроселями.
+
+---
+22.06.2017
+
+Вместо 10 кОм поставил пару резисторов по 5.624 кОм.
+
+Итоговй Ку мерял своим UT61E.
+Также по току пришлось ввести поправочный коэфф., иначе показания заметно 
+отличались от UT61E.
+
+По напряжению -- вполне нормально.
+
+Осталось в самом БП поправить резисторы под 12А макс. тока и пора 
+корпусировать.
+
+Так и не понял почему тормозили показания. Нужно попытаться разобраться.

+ 17 - 14
lib/adc.c

@@ -27,19 +27,24 @@
 #define ADC1_DR_ADDRESS     ((uint16_t)0x5344)
 #define ADC_BUFFER_ADDRESS  ((uint16_t)(&ADC_Buffer))
 
-// Suply voltage
+// Supply voltage
 #define ADC_REF             3306
-// Normal K for current channel = 4095 * 10 (Ку ОУ) * 0.05 (Rш)
-#define ADC_DIV             2048
-#define ADC_DIV_H           1024
-// Oversampl K for current channel = 32760 * 10 (Ку ОУ) * 0.05 (Rш)
-#define ADC_ODIV            16380
-#define ADC_ODIV_H          8190
-// for shunt voltage calcuation
+
+// Normal K for current channel = 4095 * 5.43 (Ку ОУ) * 0.05 (Rш)
+//#define ADC_DIV             1151
+//#define ADC_DIV_H           575
+
+// Oversampled K for current channel = (4095 * 64 / 8) * 5.43 (Ку ОУ) * 0.0501877 (Rш) * 0.937163 (Compensation)
+#define ADC_ODIV            8366
+#define ADC_ODIV_H          4183
+// for voltage calculation == 4095 * 64 / 8
 #define ADC_ORES            32760
 #define ADC_ORES_H          16380
-#define ADC_OU_MUL          10
-#define ADC_OU_ZERO_DRIFT   41
+// OU parameters
+#define ADC_OU_MUL          543
+#define ADC_OU_MUL_DIV      100
+#define ADC_OU_ZERO_DRIFT   40
+
 // Input Voltage divider
 #define ADC_VOLT_K          11
 
@@ -243,11 +248,9 @@ uint16_t * ADC_GetValues(void) {
 
     /* так как шунт стоит в разрыве земли до выхода из БП
        компенсируем падение напряжения на нём. */
+    shunt_volt *= ADC_OU_MUL_DIV;
     shunt_volt += (ADC_OU_MUL/2);
-    shunt_volt /= ADC_OU_MUL;
-//    shunt_volt += ADC_ORES_H;
-//    shunt_volt /= ADC_ORES; // мВ на входе ОУ
-//    volt -= shunt_volt; // получили напряжение на клемах
+    shunt_volt /= ADC_OU_MUL; // значение с выхода ОУ преобразуем в значение со входа ОУ
   } else {
     curr = 0;
   }

+ 14 - 7
src/main.c

@@ -202,8 +202,11 @@ static void getADCValues(void) {
 
   avgVal = ADC_GetValues();
 
-  slowBuf.Voltage[slowBuf.idx] = *avgVal;
-  slowBuf.Current[slowBuf.idx] = *(avgVal + 1);
+  Voltage = *avgVal;
+  Current = *(avgVal + 1);
+
+  slowBuf.Voltage[slowBuf.idx] = Voltage;
+  slowBuf.Current[slowBuf.idx] = Current;
 
   slowBuf.idx ++;
   if (slowBuf.idx >= VALUES_BUFFER_SIZE) {
@@ -225,12 +228,13 @@ static void calculateValues(void) {
     c += slowBuf.Current[i];
   }
 
-  Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
-  Voltage = (v + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
+  v = (v + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
+  c = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
 
   if (Current > 0) {
 
-    Power = ((Voltage * Current) + 500) / 1000;
+    // millivolt * milliamper = microwatt, convert to milliwatt
+    Power = ((v * c) + 500) / 1000;
 
     CapacityAH += Current;
     CapacityWH += Power;
@@ -240,6 +244,7 @@ static void calculateValues(void) {
       Timer.ss = 0;
       Timer.mm ++;
       if (Timer.mm > 59) {
+        Timer.mm = 0;
         Timer.hh ++;
       }
     }
@@ -412,7 +417,8 @@ void blankLine(uint8_t pos) {
   * any other for bottom.
   */
 static void showU(uint8_t pos) {
-  showValue(slowBuf.Voltage[slowBuf.idx], pos);
+  //showValue(slowBuf.Voltage[slowBuf.idx], pos);
+  showValue(Voltage, pos);
 }
 
 /**
@@ -421,7 +427,8 @@ static void showU(uint8_t pos) {
   * any other for bottom.
   */
 static void showI(uint8_t pos) {
-  showValue(slowBuf.Current[slowBuf.idx], pos);
+  //showValue(slowBuf.Current[slowBuf.idx], pos);
+  showValue(Current, pos);
 }
 
 /**