Parcourir la source

Everything is complete. But will it work? Hardly...

Vladimir N. Shilov il y a 1 an
Parent
commit
bd7f7c142c
9 fichiers modifiés avec 83 ajouts et 27 suppressions
  1. 1 1
      Makefile
  2. 3 2
      board/board.h
  3. 4 4
      cfg/halconf.h
  4. 2 2
      cfg/mcuconf.h
  5. 6 5
      lib/st7735/st7735.c
  6. 4 2
      lib/st7735/st7735.h
  7. 51 10
      lib/stab/stab.c
  8. 4 0
      lib/stab/stab_param.h
  9. 8 1
      main.c

+ 1 - 1
Makefile

@@ -25,7 +25,7 @@ endif
 
 # Linker extra options here.
 ifeq ($(USE_LDOPT),)
-  USE_LDOPT = 
+  USE_LDOPT =
 endif
 
 # Enable this if you want link time optimizations (LTO).

+ 3 - 2
board/board.h

@@ -93,7 +93,7 @@
 #define GPIOA_SPI1_MISO         6       // pin 11 LCD_DC
 #define GPIOA_SPI1_MOSI         7       // pin 12 LCD_SDA
 #define GPIOB_ADC12_IN8         0       // pin 13
-#define GPIOB_ADC12_IN9         1       // pin 14
+#define GPIOB_ADC12_IN9         1       // pin 14 ADC_IN
 #define GPIOB_I2C2_SCL          10      // pin 15
 #define GPIOB_I2C2_SDA          11      // pin 16
 // pin 17:       RESET
@@ -168,12 +168,13 @@
 /*
  * Port B setup.
  * Everything input with pull-up except:
+ * PB1  - Analog Input       (ADC_IN)
  * PB15 - Input with Pull-Up (BTN_2)
  * PB14 - Input with Pull-Up (BTN_3)
  * PB13 - Input with Pull-Up (BTN_4)
  * PB12 - Push Pull output   (BTN_G)
  */
-#define VAL_GPIOBCRL            0x88888888      /*  PB7...PB0 */
+#define VAL_GPIOBCRL            0x88888808      /*  PB7...PB0 */
 #define VAL_GPIOBCRH            0x88888888      /* PB15...PB8 */
 #define VAL_GPIOBODR            0xFFFFFFFF
 

+ 4 - 4
cfg/halconf.h

@@ -44,7 +44,7 @@
  * @brief   Enables the ADC subsystem.
  */
 #if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
-#define HAL_USE_ADC                         FALSE
+#define HAL_USE_ADC                         TRUE
 #endif
 
 /**
@@ -79,7 +79,7 @@
  * @brief   Enables the GPT subsystem.
  */
 #if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
-#define HAL_USE_GPT                         FALSE
+#define HAL_USE_GPT                         TRUE
 #endif
 
 /**
@@ -230,7 +230,7 @@
  * @note    Disabling this option saves both code and data space.
  */
 #if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
-#define ADC_USE_WAIT                        TRUE
+#define ADC_USE_WAIT                        FALSE
 #endif
 
 /**
@@ -238,7 +238,7 @@
  * @note    Disabling this option saves both code and data space.
  */
 #if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define ADC_USE_MUTUAL_EXCLUSION            TRUE
+#define ADC_USE_MUTUAL_EXCLUSION            FALSE
 #endif
 
 /*===========================================================================*/

+ 2 - 2
cfg/mcuconf.h

@@ -74,7 +74,7 @@
 /*
  * ADC driver system settings.
  */
-#define STM32_ADC_USE_ADC1                  FALSE
+#define STM32_ADC_USE_ADC1                  TRUE
 #define STM32_ADC_ADC1_DMA_PRIORITY         2
 #define STM32_ADC_ADC1_IRQ_PRIORITY         6
 
@@ -89,7 +89,7 @@
  */
 #define STM32_GPT_USE_TIM1                  FALSE
 #define STM32_GPT_USE_TIM2                  FALSE
-#define STM32_GPT_USE_TIM3                  FALSE
+#define STM32_GPT_USE_TIM3                  TRUE
 #define STM32_GPT_USE_TIM4                  FALSE
 #define STM32_GPT_USE_TIM5                  FALSE
 #define STM32_GPT_USE_TIM8                  FALSE

+ 6 - 5
lib/st7735/st7735.c

@@ -380,7 +380,7 @@ void ST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16
 
   ST7735_Unselect();
 }
-
+#ifdef USER_MALLOC
 void ST7735_FillRectangleFast(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) {
   // clipping
   if ((x >= ST7735_WIDTH) || (y >= ST7735_HEIGHT)) {
@@ -411,13 +411,14 @@ void ST7735_FillRectangleFast(uint16_t x, uint16_t y, uint16_t w, uint16_t h, ui
   ST7735_Unselect();
 }
 
-void ST7735_FillScreen(uint16_t color) {
-  ST7735_FillRectangle(0, 0, ST7735_WIDTH, ST7735_HEIGHT, color);
-}
-
 void ST7735_FillScreenFast(uint16_t color) {
     ST7735_FillRectangleFast(0, 0, ST7735_WIDTH, ST7735_HEIGHT, color);
 }
+#endif /* USE_MALLOC*/
+
+void ST7735_FillScreen(uint16_t color) {
+  ST7735_FillRectangle(0, 0, ST7735_WIDTH, ST7735_HEIGHT, color);
+}
 
 void ST7735_DrawImage(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint16_t* data) {
   if ((x >= ST7735_WIDTH) || (y >= ST7735_HEIGHT)) {

+ 4 - 2
lib/st7735/st7735.h

@@ -249,13 +249,15 @@ void ST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color);
 void ST7735_WriteString(uint16_t x, uint16_t y, const char* str, FontDef font, uint16_t color, uint16_t bgcolor);
 void ST7735_WriteStringV(uint16_t x, uint16_t y, const char* str, FontDefV font, uint16_t color, uint16_t bgcolor);
 void ST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
-void ST7735_FillRectangleFast(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
 void ST7735_FillScreen(uint16_t color);
-void ST7735_FillScreenFast(uint16_t color);
 void ST7735_DrawImage(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint16_t* data);
 void ST7735_InvertColors(bool invert);
 void ST7735_SetGamma(GammaDef gamma);
 void ST7735_Test(void);
+#ifdef USER_MALLOC
+void ST7735_FillRectangleFast(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
+void ST7735_FillScreenFast(uint16_t color);
+#endif
 
 #ifdef __cplusplus
 }

+ 51 - 10
lib/stab/stab.c

@@ -1,4 +1,3 @@
-#include <math.h>
 #include "ch.h"
 #include "hal.h"
 #include "chprintf.h"
@@ -72,6 +71,9 @@ static uint8_t cnt_PDMcount;    // Счетчик для перебора уст
 static uint8_t cnt_menuWDT;     // Счетчик секунд для организации отсчета ожидания выхода из меню
 static uint8_t cnt_dspMenu;     // Индикатор режима меню
 
+//static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
+static adcsample_t sample1;
+
 /* Functions */
 static uint8_t X_position(const uint8_t x, const uint16_t arg, const uint8_t pix); // Функция возвращает начальную позицию по Х для десятичного числа, в зависимости от количества знаков в нём.
 static uint8_t X_centred(const uint8_t len); // Функция возвращает начальную позицию по Х для текста длинной len знаков, для размещения оного по центру дисплея.
@@ -79,6 +81,31 @@ static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multi
 static void Buttons_(void);
 static void second_new_cb(virtual_timer_t *vtp, void *p);
 static void hz50_cb(virtual_timer_t *vtp, void *p);
+static void ADC_cb(ADCDriver *adcp);
+static void gpt_cb(GPTDriver *drv);
+
+/*
+ * Perephireal
+ */
+static const ADCConversionGroup adcgrpcfg1 = {
+  FALSE,
+  ADC_GRP1_NUM_CHANNELS,
+  ADC_cb,
+  NULL,
+  0, 0,                         /* CR1, CR2 */
+  ADC_SMPR1_SMP_AN10(ADC_SAMPLE_239P5), /* smpr1 */
+  0,                            /* SMPR2 */
+  ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), /* sqr1 */
+  0,                            /* SQR2 */
+  ADC_SQR3_SQ1_N(ADC_CHANNEL_NUM) /* sqr3 */
+};
+
+static const GPTConfig gptcfg1 = {
+  .frequency    =  5000U, /* 50 Hz * 100, 200 us */
+  .callback     =  gpt_cb,
+  .cr2          =  0, /* TIM_CR2_MMS_1,   MMS = 010 = TRGO on Update Event. */
+  .dier         =  0U
+};
 
 /*
  * Threads
@@ -630,20 +657,30 @@ static void Buttons_(void) {
   }
 }
 
+/**
+ * @brief GPT callback function
+ * 
+ * @param drv 
+ */
+static void gpt_cb(GPTDriver *drv) {
+  (void)drv;
+  adcStartConversion(&ADCD1, &adcgrpcfg1, &sample1, ADC_GRP1_BUF_DEPTH);
+}
 
 /**
  * @brief Обработчик окончания преобразования АЦП
  */
-static void ADC_cb(void) {
-  static uint8_t TM2_current;
+static void ADC_cb(ADCDriver *adcp) {
+  (void)adcp;
+
+  static uint16_t TM2_current;
   static int16_t Ufir = 0;   // Буферная переменная для НЧ-фильтрации
   static int16_t Udelta = 0; // Буферная переменная для НЧ-фильтрации
   {
-    int16_t U_adc;
+    int32_t U_adc;
     uint8_t TM2_tmp;
-    //!!! TM2_tmp = TCNT2;  // забрали значение из таймера синхронизации с сетью
-    //!U_adc = ADCL;
-    //!U_adc += ADCH << 8; // забрали результат преобразования АЦП
+    //TM2_tmp = TCNT2;  // забрали значение из таймера синхронизации с сетью
+    U_adc = sample1; // забрали результат преобразования АЦП
     U_adc -= U_ZERO;  // Убираем постоянную составляющую из оцифрованного сигнала
     { //Суммирование квадратов
       sum += (long)U_adc * U_adc; // Возводим в квадрат выборку АЦП и суммируем с предыдущими
@@ -794,7 +831,11 @@ void Stab_Init(void) {
   TURN_SSR_OFF;   // Выключаем ТЭН (твердотельное реле)
   BTNS_ON;  // Activate buttons
 
-  // !!! TODO !!! Инициализируем АЦП
+  /* Activates the ADC1 driver and the temperature sensor. */
+  adcStart(&ADCD1, NULL);
+
+  /* Starting GPT3 driver, it is used for triggering the ADC. */
+  gptStart(&GPTD3, &gptcfg1);
 
   /* Starting a virtual timers. */
   chVTSetContinuous(&hz50_vt, TIME_MS2I(LINE_PERIOD), hz50_cb, NULL);
@@ -812,7 +853,7 @@ void Stab_Init(void) {
   pp_Delay(10);   // Подождем 10 полупериодов для гарантированного разрешения
 
   //ST7735_Init(); // done in main()
-  ST7735_FillScreenFast(ST7735_BLACK);
+  ST7735_FillScreen(ST7735_BLACK);
   ST7735_WriteString(X_centred(21), 0, "Стабилизатор мощности", Font_7x10, ST7735_BLUE, ST7735_BLACK);
   ST7735_WriteString(X_centred(4), 1, "ТЭНа", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #ifdef INTERFACE_ALT
@@ -875,7 +916,7 @@ void Stab_WorkCycle(void) {
 
     // Проверяем величину напряжения
     U_sum *= (long)400;      // Произведем некоторое математическое колдунство,
-    U_sum = sqrt(U_sum);     // чтобы получить один знак после запятой без float
+    U_sum *= (U_sum);     // чтобы получить один знак после запятой без float
     U_sum ++;
     U_sum /= 2;    // и с правильным округлением.
     U_real_dec = U_sum % 10; // Среднеквадратичное (дробная часть)

+ 4 - 0
lib/stab/stab_param.h

@@ -90,6 +90,10 @@
 #define T_MIN 100 // ограничение минимальной длительности полупериода в тиках таймера
 
 //================прочие константы===============
+#define ADC_GRP1_NUM_CHANNELS   1
+#define ADC_GRP1_BUF_DEPTH      1
+#define ADC_CHANNEL_NUM         ADC_CHANNEL_IN9
+
 #define ZSUM_MAX 5000 // Количество отсчетов АЦП без детекции ноля (5000 отсчетов это порядка 1 сек)
 #define U_ZERO 512    // Значение нуля АЦП для двуполярного сигнала с постоянной составляющей на выходе ОУ
 #define T_ADC 49    // Определяет интервал между запусками АЦП (200 мкс) f_OCn = f_clk / 2*N*(1 + X), где N - коэффициент деления предделителя, X- содержимое регистра OCRnA

+ 8 - 1
main.c

@@ -23,6 +23,7 @@
 #include "chprintf.h"
 
 #include "st7735.h"
+#include "stab.h"
 
 /* Private variables */
 
@@ -95,10 +96,16 @@ int main(void) {
   ST7735_WriteString(0, 32, "Font_7x10, green on black, lorem ipsum dolor sit amet", Font_7x10, ST7735_GREEN, ST7735_BLACK);
   ST7735_WriteString(0, 82, "Font_7x10, blue on black, lorem ipsum dolor sit amet", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 
+  /* 
+   * Launch Stab
+   */
+  Stab_Init();
+
   /*
    * Normal main() thread activity.
    */
   while (true) {
-    chThdSleepMilliseconds(500);
+    Stab_WorkCycle();
+    //chThdSleepMilliseconds(500);
   }
 }