Jelajahi Sumber

Fix voltage calculations.

Volodymyr Shylov 11 bulan lalu
induk
melakukan
3d6495b2c4
3 mengubah file dengan 17 tambahan dan 17 penghapusan
  1. 6 3
      inc/board.h
  2. 9 13
      src/main.c
  3. 2 1
      src/stm8s_it.c

+ 6 - 3
inc/board.h

@@ -17,10 +17,13 @@
 #define ADC_SCHTI ADC1_SCHMITTTRIG_CHANNEL2
 #define ADC_SMPLS 64
 // Supply voltage in mili volts
-#define ADC_VREF  3333
+#define ADC_VREF  3333UL
 // Сопротивление резисторов делителя входного напряжения
-#define VOLTAGE_MULT_TOP  39300
-#define VOLTAGE_MULT_BOT  11000
+#define VOLTAGE_MULT_TOP  39300UL
+#define VOLTAGE_MULT_BOT  11000UL
+#define VOLT_MUL_MUL      100
+#define VOLTAGE_MUL_DIV   (VOLTAGE_MULT_BOT * 1023)UL
+#define VOLTAGE_MUL       (uint16_t)((VOLT_MUL_MUL * ADC_VREF * (VOLTAGE_MULT_TOP+VOLTAGE_MULT_BOT) + (VOLTAGE_MUL_DIV / 2)) / VOLTAGE_MUL_DIV)
 // Сопротивление резисторов ОУ усилителя сигнала шунта
 #define CURRENT_MULT_TOP  19000
 #define CURRENT_MULT_BOT  1200

+ 9 - 13
src/main.c

@@ -51,16 +51,12 @@ void main(void)
       BufferIndex = 0;
       int8_t i;
       uint32_t vbuf = 0;
-      for (i=0; i<64; i++) {
+      for (i=0; i<ADC_SMPLS; i++) {
         vbuf += ConversionBuffer[i];  
       }
-      vbuf *= ADC_VREF;
-      vbuf += 512;
-      vbuf /= 1023;
-      vbuf *= 45727;
-      vbuf += 5000;
-      vbuf /= 10000;
-      Voltage = vbuf;
+      vbuf *= VOLTAGE_MUL;
+      vbuf /= VOLT_MUL_MUL;
+      Voltage = vbuf / ADC_SMPLS;
     }
     showV();
     showC();
@@ -80,10 +76,10 @@ static void showV(void) {
 }
 
 static void showC(void) {
- LedDigits[4] = 5;
- LedDigits[5] = 6;
- LedDigits[6] = 7;
- LedDigits[7] = 8;
+ LedDigits[4] = VOLTAGE_MUL / 1000;
+ LedDigits[5] = (VOLTAGE_MUL % 1000) / 100;
+ LedDigits[6] = (VOLTAGE_MUL % 100) / 10;
+ LedDigits[7] = VOLTAGE_MUL % 10;
 }
 
 static void boardInit(void) {
@@ -133,7 +129,7 @@ static void boardInit(void) {
   GPIOD->CR2 |= (uint8_t)LED_SEG_AF;
 
   /* `SPI` pins to Push-Pull, High, Fast */
-  SPI_PORT->ODR = (uint8_t)(SPI_SCK|SPI_DATA);
+  SPI_PORT->ODR |= (uint8_t)(SPI_SCK|SPI_DATA);
   SPI_PORT->DDR |= (uint8_t)(SPI_SCK|SPI_DATA);
   SPI_PORT->CR1 |= (uint8_t)(SPI_SCK|SPI_DATA);
   SPI_PORT->CR2 |= (uint8_t)(SPI_SCK|SPI_DATA);

+ 2 - 1
src/stm8s_it.c

@@ -30,6 +30,7 @@
 /* Includes ------------------------------------------------------------------*/
 #include "stm8s_it.h"
 #include "led.h"
+#include "board.h"
 #include "delay.h"
 
 /** @addtogroup Template_Project
@@ -40,7 +41,7 @@
 /* Private define ------------------------------------------------------------*/
 /* Private macro -------------------------------------------------------------*/
 /* Private variables ---------------------------------------------------------*/
-extern __IO uint16_t ConversionBuffer[64];
+extern __IO uint16_t ConversionBuffer[ADC_SMPLS];
 extern __IO uint8_t BufferIndex;
 static uint8_t LedCnt = 0;
 static __IO uint16_t TimingDelay;