|
@@ -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; // Среднеквадратичное (дробная часть)
|