Преглед изворни кода

First attempt at another hardware.

Vladimir N. Shilov пре 1 година
родитељ
комит
ada929e2d4
11 измењених фајлова са 122 додато и 119 уклоњено
  1. 1 1
      ReadMe.txt
  2. BIN
      hw/BY-42A.dch
  3. BIN
      hw/CM231121-190029001.jpg
  4. BIN
      hw/CM231121-213728006.jpg
  5. 19 45
      hw/mcu.txt
  6. BIN
      hw/rear_view.webp
  7. BIN
      hw/schema.jpg
  8. 20 11
      inc/board.h
  9. 2 2
      lib/led.c
  10. 44 36
      lib/led.h
  11. 36 24
      src/main.c

+ 1 - 1
ReadMe.txt

@@ -1,2 +1,2 @@
 VA-метер
-20В, 20А, шунт 10 мОм.
+Цей бранч на фншому залізі - "BY-42A".


BIN
hw/CM231121-190029001.jpg


BIN
hw/CM231121-213728006.jpg


+ 19 - 45
hw/mcu.txt

@@ -33,52 +33,26 @@ UART - up to 1 Mbit/s
 SPI - 8 mbit/s
 I2C - 400 kBit/s
 ---
-LCD:
-OA
-Q0	Bottom  Dig.1 (12)
-Q1	Bottom  Dig.2 (9)
-Q2	Bottom  Dig.4 (6)
-Q3	Bottom  Dig.3 (8)
-Q4	Top Dig.1 (12)
-Q5	Top Dig.2 (9)
-Q6	Top Dig.4 (6)
-Q7	Top Dig.3 (8)
-A	11
-B	7
-C	4
-D	2
-E	1
-F	10
-G	5
-DP	10
----
-со стороны входа, есть не распаянный разъём вид сверху (со стороны индикаторов), отсчёт сверху
- 1 - GND
- 2 - VCC 3v
- 3 - RST
- 4 - UART-Rx
- 5 - UART-Tx
- 6 - SWIM (одно проводной интерфейм программирования)
+Делитель измеряемого напряжения
+вход -> 787 кОм + 2 кОм (подстр) + 10 кОм (GND)
+219,725 - 263,67 вольт
 
-рядом с ним 3х пиновый 
- 1 - GND
- 2 - UART-Rx
- 3 - UART-Tx (подтянут к питанию 3в)
-по UART ничего не передаётся
+Для предела изм напряжения в 15В, делитель должен быть
+4,545454545454545
+Верхний резистор - 35,45 кОм
+с учётом подстроечника берём 33 кОм.
+Uвх будет от 14,19 до 14,85 вольт. маловато.
 
-со стороны выхода 2х пиновый
- 1 - I2C-SDA (подтянуты к 3в)
- 2 - I2C-SCL (подтянуты к 3в)
----
-Дільник на ОУ
-резистори: 84B - 7.32 кОм, 01D - 100 кОм, 01B - 1 кОм, 01A - 100 Ом (±1%).
-Ku = 100/7.32 = 13,6612
-Ki = 1/7.32 = 0,136612
-Живлення 3 В.
-Max U = 40,9836 V
-Max I = 8,19672 A (Shunt = 0.05 Ohm)
+при 36 кОм - 15,18-15,84 вольт;
+при 38,3 кОм - 15,939-16,599 вольт.
 
-Потрібно: MaxU<=21V, MaxI<=21A (shunt = 0.01 Ohm)
-new Ku: 21/3 = 7, replace 84B res by 15кОм, K == 6.666.., MaxU == 20V
-new Ki: 1/(3/(0.01*21)) = 0.07, replace 01B res by 15кОм, K == 0.0666..., MaxI == 20A
 ---
+Усилитель напряжения токового шунта
+выход ОУ -> 24 кОм + 2 кОм (подстр) + 1,2 кОм (GND)
+Ку: 21 - 22,66666666666667
+Вх напряжение: 0,1571 - 0,1456 вольт
+Ток (шунт 0,01 Ом): 15,71 - 14,56 ампер
+
+Для предела тока в 20А Ку должен быть 16,5
+верхный резистор - 18,6 кОм
+с учётом подстроечника берём 18 кОм.

BIN
hw/rear_view.webp



+ 20 - 11
inc/board.h

@@ -7,20 +7,29 @@
 #define GPIO_TOGGLE(a,b)  a->ODR ^= b
 
 /* ADC */
-#define ADC_PORT  GPIOD
-#define ADC_PINU  GPIO_PIN_2
-#define ADC_CHNLU ADC1_CHANNEL_3
-#define ADC_SCHTU ADC1_SCHMITTTRIG_CHANNEL3
-#define ADC_PINI  GPIO_PIN_3
-#define ADC_CHNLI ADC1_CHANNEL_4
-#define ADC_SCHTI ADC1_SCHMITTTRIG_CHANNEL4
+#define ADC_PORTU GPIOD
+#define ADC_PINU  GPIO_PIN_3
+#define ADC_CHNLU ADC1_CHANNEL_4
+#define ADC_SCHTU ADC1_SCHMITTTRIG_CHANNEL4
+#define ADC_PORTU GPIOC
+#define ADC_PINI  GPIO_PIN_4
+#define ADC_CHNLI ADC1_CHANNEL_2
+#define ADC_SCHTI ADC1_SCHMITTTRIG_CHANNEL2
 #define ADC_SMPLS 64
 // Supply voltage in mili volts
-#define ADC_VREF  3335
+#define ADC_VREF  3333
+// Сопротивление резисторов делителя входного напряжения
+#define VOLTAGE_MULT_TOP  39300
+#define VOLTAGE_MULT_BOT  11000
 // Сопротивление резисторов ОУ усилителя сигнала шунта
-#define CURRENT_MULT_TOP  3600
-#define CURRENT_MULT_BOT  680
+#define CURRENT_MULT_TOP  19000
+#define CURRENT_MULT_BOT  1200
 // shunt resistance in mili Ohms
-#define ADC_SHUNT 50
+#define ADC_SHUNT 10
+// Current commutator
+#define SWITCH_PORT GPIOD
+#define SWITCH_PIN  GPIO_PIN_6
+#define SWITCH_ON   SWITCH_PORT->ODR |= SWITCH_PIN
+#define SWITCH_OFF  SWITCH_PORT->ODR &= ~SWITCH_PIN
 
 #endif /* __BOARD_H */

+ 2 - 2
lib/led.c

@@ -12,7 +12,7 @@
 uint8_t LedDigits[LED_DIGITS_NUM] = {1, 2, 3, 4, 5, 6, 7, 8}; // digits to dsplay
 uint8_t LedPoint[LED_DIGITS_NUM] = {0, 1, 0, 0, 0, 1, 0, 0}; // dots for digits
 
-static const uint16_t led_num[8] = {0x10, 0x20, 0x80, 0x40, 0x01, 0x02, 0x08, 0x04};
+static const uint16_t led_num[8] = {0x08, 0x04, 0x02, 0x01, 0x10, 0x20, 0x40, 0x80};
 
 static void led_SelectDigit (const uint8_t first);
 
@@ -81,7 +81,7 @@ void led_OutputValue(void) {
     case led_Off:
       break;
     default:
-      GPIOD->ODR &= ~(LED_SEG_D);
+      LED_OUT_MM;
   }
 
   if(LedPoint[ledn] != 0) {

+ 44 - 36
lib/led.h

@@ -6,7 +6,7 @@
 #define LED_ONE_PERIOD  2
 #define LED_DIGITS_NUM  8
 
-/* LED
+/* LED segments pins
  AAA
 F   B
 F   B
@@ -15,46 +15,54 @@ E   C
 E   C
  DDD P
 */
-#define LED_SEG1_PORT   GPIOA
-#define LED_SEG1_PINS   GPIO_PIN_3
-#define LED_SEG_DP      GPIO_PIN_3
+#define LED_SEG_CG_ODR    GPIOA->ODR
+#define LED_SEG_C         GPIO_PIN_1
+#define LED_SEG_G         GPIO_PIN_2
+#define LED_SEG_CG        (LED_SEG_C | LED_SEG_G)
+#define LED_SEG_CG_ON(a)  LED_SEG_CG_ODR &= ~(a)
 
-#define LED_SEG3_PORT   GPIOC
-#define LED_SEG3_PINS   (GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_3 | GPIO_PIN_5)
-#define LED_SEG_A       GPIO_PIN_3
-#define LED_SEG_F       GPIO_PIN_4
-#define LED_SEG_B       GPIO_PIN_5
-#define LED_SEG_E       GPIO_PIN_6
-#define LED_SEG_G       GPIO_PIN_7
+#define LED_SEG_DH_ODR    GPIOB->ODR
+#define LED_SEG_H         GPIO_PIN_4
+#define LED_SEG_D         GPIO_PIN_5
+#define LED_SEG_DH        (LED_SEG_D | LED_SEG_H)
+#define LED_SEG_DH_ON(a)  LED_SEG_DH_ODR &= ~(a)
 
-#define LED_SEG2_PORT   GPIOD
-#define LED_SEG2_PINS   (GPIO_PIN_1 | GPIO_PIN_4)
-#define LED_SEG_C       GPIO_PIN_1
-#define LED_SEG_D       GPIO_PIN_4
+#define LED_SEG_BE_ODR    GPIOC->ODR
+#define LED_SEG_B         GPIO_PIN_6
+#define LED_SEG_E         GPIO_PIN_7
+#define LED_SEG_BE        (LED_SEG_B | LED_SEG_E)
+#define LED_SEG_BE_ON(a)  LED_SEG_BE_ODR &= ~(a)
 
-#define LED_OUT_OFF   {LED_SEG1_PORT->ODR |= LED_SEG1_PINS; LED_SEG2_PORT->ODR |= LED_SEG2_PINS; LED_SEG3_PORT->ODR |= LED_SEG3_PINS;}
-#define LED_OUT_DP    GPIOA->ODR &= ~LED_SEG_DP
-#define LED_OUT_MM    GPIOC->ODR &= ~LED_SEG_G
-#define LED_OUT_0     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B|LED_SEG_E|LED_SEG_F); GPIOD->ODR &= ~(LED_SEG2_PINS)
-#define LED_OUT_1     GPIOC->ODR &= ~(LED_SEG_B); GPIOD->ODR &= ~(LED_SEG_C)
-#define LED_OUT_2     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B|LED_SEG_E|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG_D)
-#define LED_OUT_3     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG2_PINS)
-#define LED_OUT_4     GPIOC->ODR &= ~(LED_SEG_B|LED_SEG_F|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG_C)
-#define LED_OUT_5     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_F|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG2_PINS)
-#define LED_OUT_6     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_E|LED_SEG_F|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG2_PINS)
-#define LED_OUT_7     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B); GPIOD->ODR &= ~(LED_SEG_C)
-#define LED_OUT_8     GPIOC->ODR &= ~(LED_SEG3_PINS); GPIOD->ODR &= ~(LED_SEG2_PINS)
-#define LED_OUT_9     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B|LED_SEG_F|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG2_PINS)
-#define LED_OUT_H     GPIOC->ODR &= ~(LED_SEG_B|LED_SEG_E|LED_SEG_F|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG_C)
-#define LED_OUT_PL    GPIOC->ODR &= ~(LED_SEG_B|LED_SEG_G); GPIOD->ODR &= ~(LED_SEG_C)
-#define LED_OUT_O     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B|LED_SEG_F|LED_SEG_G);
-#define LED_OUT_U     GPIOC->ODR &= ~(LED_SEG_B|LED_SEG_F|LED_SEG_E|LED_SEG_D); GPIOD->ODR &= ~(LED_SEG_C)
-#define LED_OUT_A     GPIOC->ODR &= ~(LED_SEG_A|LED_SEG_B|LED_SEG_E|LED_SEG_F); GPIOD->ODR &= ~(LED_SEG_C)
+#define LED_SEG_AF_ODR    GPIOD->ODR
+#define LED_SEG_A         GPIO_PIN_1
+#define LED_SEG_F         GPIO_PIN_2
+#define LED_SEG_AF        (LED_SEG_A | LED_SEG_A)
+#define LED_SEG_AF_ON(a)  LED_SEG_AF_ODR &= ~(a)
+
+/* LED symbols */
+#define LED_OUT_OFF   {LED_SEG_CG_ODR |= LED_SEG_CG; LED_SEG_DH_ODR |= LED_SEG_DH; LED_SEG_BE_ODR |= LED_SEG_BE; LED_SEG_AF_ODR |= LED_SEG_AF;}
+#define LED_OUT_DP    LED_SEG_DH_ON(LED_SEG_H)
+#define LED_OUT_MM    LED_SEG_CG_ON(LED_SEG_G)
+#define LED_OUT_0     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_BE_ON(LED_SEG_BE); LED_SEG_CG_ON(LED_SEG_C); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_1     LED_SEG_BE_ON(LED_SEG_B); LED_SEG_CG_ON(LED_SEG_C)
+#define LED_OUT_2     LED_SEG_AF_ON(LED_SEG_A); LED_SEG_BE_ON(LED_SEG_BE); LED_SEG_CG_ON(LED_SEG_G); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_3     LED_SEG_AF_ON(LED_SEG_A); LED_SEG_BE_ON(LED_SEG_B); LED_SEG_CG_ON(LED_SEG_CG); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_4     LED_SEG_BE_ON(LED_SEG_B); LED_SEG_AF_ON(LED_SEG_F); LED_SEG_CG_ON(LED_SEG_CG)
+#define LED_OUT_5     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_CG_ON(LED_SEG_CG); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_6     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_BE_ON(LED_SEG_E); LED_SEG_CG_ON(LED_SEG_CG); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_7     LED_SEG_AF_ON(LED_SEG_A); LED_SEG_BE_ON(LED_SEG_B); LED_SEG_CG_ON(LED_SEG_C)
+#define LED_OUT_8     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_CG_ON(LED_SEG_CG); LED_SEG_BE_ON(LED_SEG_BE); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_9     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_BE_ON(LED_SEG_B); LED_SEG_CG_ON(LED_SEG_CG); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_H     LED_SEG_BE_ON(LED_SEG_BE); LED_SEG_AF_ON(LED_SEG_F); LED_SEG_CG_ON(LED_SEG_CG)
+#define LED_OUT_PL    LED_SEG_BE_ON(LED_SEG_B); LED_SEG_CG_ON(LED_SEG_CG)
+#define LED_OUT_O     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_BE_ON(LED_SEG_B); LED_SEG_CG_ON(LED_SEG_G);
+#define LED_OUT_U     LED_SEG_AF_ON(LED_SEG_F); LED_SEG_BE_ON(LED_SEG_BE); LED_SEG_CG_ON(LED_SEG_C); LED_SEG_DH_ON(LED_SEG_D)
+#define LED_OUT_A     LED_SEG_AF_ON(LED_SEG_AF); LED_SEG_BE_ON(LED_SEG_BE); LED_SEG_CG_ON(LED_SEG_C)
 
 /* shift register control pins */
-#define SPI_PORT      GPIOA
-#define SPI_SCK       GPIO_PIN_1
-#define SPI_DATA      GPIO_PIN_2
+#define SPI_PORT      GPIOC
+#define SPI_SCK       GPIO_PIN_5
+#define SPI_DATA      GPIO_PIN_3
 
 typedef enum {
   led_Plus = 0xa,

+ 36 - 24
src/main.c

@@ -34,7 +34,7 @@ __IO uint8_t BufferIndex = 0;
 
 /* Private function prototypes -----------------------------------------------*/
 static void boardInit(void);
-static void showU(void);
+static void showV(void);
 static void showC(void);
 
 void main(void)
@@ -46,25 +46,25 @@ void main(void)
   /* Infinite loop */
   while (1) {
     Delay(200);
-    showU();
+    showV();
     showC();
   }
 
 }
 
 /* Private functions ---------------------------------------------------------*/
-static void showU(void) {
+static void showV(void) {
   LedDigits[0] = 0;
-  LedDigits[1] = 0;
-  LedDigits[2] = 0;
-  LedDigits[3] = led_U;
+  LedDigits[1] = 1;
+  LedDigits[2] = 2;
+  LedDigits[3] = 3; //led_U;
 }
 
 static void showC(void) {
- LedDigits[4] = 0;
- LedDigits[5] = 0;
- LedDigits[6] = 0;
- LedDigits[7] = led_A;
+ LedDigits[4] = 4;
+ LedDigits[5] = 5;
+ LedDigits[6] = 6;
+ LedDigits[7] = 7; //led_A;
 }
 
 static void boardInit(void) {
@@ -85,21 +85,33 @@ static void boardInit(void) {
   /* SWIM clock */
   CLK->SWIMCCR = 0x00;
 
+  /* ІЦШЕСР pin to Push-Pull, High, Fast */
+  SWITCH_PORT->ODR |= (uint8_t)(SWITCH_PIN);
+  SWITCH_PORT->DDR |= (uint8_t)(SWITCH_PIN);
+  SWITCH_PORT->CR1 |= (uint8_t)(SWITCH_PIN);
+  SWITCH_PORT->CR2 |= (uint8_t)(SWITCH_PIN);
+  SWITCH_OFF;
+
   /* Configure GPIO used for LED to Push-Pull, High, Fast*/
-  LED_SEG1_PORT->ODR |= (uint8_t)LED_SEG1_PINS;
-  LED_SEG1_PORT->DDR |= (uint8_t)LED_SEG1_PINS;
-  LED_SEG1_PORT->CR1 |= (uint8_t)LED_SEG1_PINS;
-  LED_SEG1_PORT->CR2 |= (uint8_t)LED_SEG1_PINS;
-
-  LED_SEG2_PORT->ODR |= (uint8_t)LED_SEG2_PINS;
-  LED_SEG2_PORT->DDR |= (uint8_t)LED_SEG2_PINS;
-  LED_SEG2_PORT->CR1 |= (uint8_t)LED_SEG2_PINS;
-  LED_SEG2_PORT->CR2 |= (uint8_t)LED_SEG2_PINS;
-
-  LED_SEG3_PORT->ODR |= (uint8_t)LED_SEG3_PINS;
-  LED_SEG3_PORT->DDR |= (uint8_t)LED_SEG3_PINS;
-  LED_SEG3_PORT->CR1 |= (uint8_t)LED_SEG3_PINS;
-  LED_SEG3_PORT->CR2 |= (uint8_t)LED_SEG3_PINS;
+  GPIOA->ODR |= (uint8_t)LED_SEG_CG;
+  GPIOA->DDR |= (uint8_t)LED_SEG_CG;
+  GPIOA->CR1 |= (uint8_t)LED_SEG_CG;
+  GPIOA->CR2 |= (uint8_t)LED_SEG_CG;
+
+  GPIOB->ODR |= (uint8_t)LED_SEG_DH;
+  GPIOB->DDR |= (uint8_t)LED_SEG_DH;
+  GPIOB->CR1 |= (uint8_t)LED_SEG_DH;
+  GPIOB->CR2 |= (uint8_t)LED_SEG_DH;
+
+  GPIOC->ODR |= (uint8_t)LED_SEG_BE;
+  GPIOC->DDR |= (uint8_t)LED_SEG_BE;
+  GPIOC->CR1 |= (uint8_t)LED_SEG_BE;
+  GPIOC->CR2 |= (uint8_t)LED_SEG_BE;
+
+  GPIOD->ODR |= (uint8_t)LED_SEG_AF;
+  GPIOD->DDR |= (uint8_t)LED_SEG_AF;
+  GPIOD->CR1 |= (uint8_t)LED_SEG_AF;
+  GPIOD->CR2 |= (uint8_t)LED_SEG_AF;
 
   /* `SPI` pins to Push-Pull, High, Fast */
   SPI_PORT->ODR |= (uint8_t)(SPI_SCK|SPI_DATA);