From f84fcfffbb8460be80bc42df8c0616d2f6cd9d6d Mon Sep 17 00:00:00 2001 From: Emanuele Trabattoni Date: Wed, 25 Mar 2026 18:22:02 +0100 Subject: [PATCH] Tasks work in progress --- RotaxMonitor/src/devices.h | 38 ++++++++++++++++++++++++++++++++++++++ RotaxMonitor/src/main.cpp | 15 ++++++++++----- RotaxMonitor/src/tasks.h | 29 +++++++++++++++++++++++++---- 3 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 RotaxMonitor/src/devices.h diff --git a/RotaxMonitor/src/devices.h b/RotaxMonitor/src/devices.h new file mode 100644 index 0000000..53b82a8 --- /dev/null +++ b/RotaxMonitor/src/devices.h @@ -0,0 +1,38 @@ +#pragma once + +// Device Libraries +#include +#include +#include +#include + +// ADC Channel mapping +#define PICKUP_IN_A12 SING_0 +#define PICKUP_IN_A34 SING_1 +#define PICKUP_OUT_A12 SING_2 +#define PICKUP_OUT_A34 SING_3 + +#define PICKUP_IN_B12 SING_4 +#define PICKUP_IN_B34 SING_5 +#define PICKUP_OUT_B12 SING_6 +#define PICKUP_OUT_B34 SING_7 + +struct Devices { + AD5292* pot; + ADS1256* adc; + Adafruit_SSD1306* lcd; + PCA9555* io; +}; + +float adcReadChannel(ADS1256* adc, const uint32_t ch){ + adc->setMUX(PICKUP_IN_A12); + // scarta 3 conversioni + for (int i = 0; i < 3; i++) { + while (digitalRead(ADC_DRDY)); + adc->readSingle(); + } + + // ora lettura valida a 30kSPS → ~100 µs di settling + while (digitalRead(ADC_DRDY)); + return adc->convertToVoltage(adc->readSingle()); +} diff --git a/RotaxMonitor/src/main.cpp b/RotaxMonitor/src/main.cpp index 1204614..780d8bf 100644 --- a/RotaxMonitor/src/main.cpp +++ b/RotaxMonitor/src/main.cpp @@ -10,10 +10,8 @@ #include #include #include +#include -// Device Libraries -#include -#include void setup() { delay(250); @@ -70,13 +68,20 @@ void setup() { void loop() { // global variables bool running = true; + Devices dev; + + // Init devices + dev.adc = new ADS1256(ADC_DRDY, ADC_RST, ADC_SYNC, ADC_CS, 2.5, &SPI); + dev.adc->InitializeADC(); + dev.adc->setPGA(PGA_1); + dev.adc->setDRATE(DRATE_1000SPS); // Ignition A on Core 0 auto ignA_task_success = xTaskCreatePinnedToCore( ignitionA_task, "ignitionA_task", TASK_STACK, - NULL, + (void*) &dev, TASK_PRIORITY, &trigA_TaskHandle, CORE_0 @@ -87,7 +92,7 @@ void loop() { ignitionB_task, "ignitionB_task", TASK_STACK, - NULL, + (void*) &dev, TASK_PRIORITY, // priorità leggermente più alta &trigA_TaskHandle, CORE_1 diff --git a/RotaxMonitor/src/tasks.h b/RotaxMonitor/src/tasks.h index 4b8ac7c..001fb01 100644 --- a/RotaxMonitor/src/tasks.h +++ b/RotaxMonitor/src/tasks.h @@ -7,9 +7,15 @@ // ISR #include "isr.h" +// DEVICES +#include "devices.h" + const auto spark_timeout_max = 1; void ignitionA_task(void *pvParameters) { + Devices* dev = (Devices*) pvParameters; + ADS1256* adc = dev->adc; + uint32_t pickup_flag; uint32_t spark_flag; @@ -43,6 +49,9 @@ void ignitionA_task(void *pvParameters) { continue; } + bool new_data12 = false; + bool new_data34 = false; + switch (pickup_flag) { case TRIG_FLAG_A12P: { // Timeout not occourred, expected POSITIVE edge spark OCCOURRED @@ -71,8 +80,6 @@ void ignitionA_task(void *pvParameters) { } // Timeout occourred, expected POSITIVE edge spark NOT OCCOURRED else if (spark_timeout == pdFAIL && expected_negative12) { - ignA_status.trig12_start = 0; - ignA_status.trig12_end = 0; ignA_status.soft12_engaged = false; ignA_status.spark12_status = sparkStatus::SPARK_NEG_FAIL; } @@ -81,9 +88,8 @@ void ignitionA_task(void *pvParameters) { ignA_status.soft12_engaged = true; ignA_status.spark12_status = sparkStatus::SPARK_NEG_UNEXPECTED; } - // Save status on circular buffer - + new_data12 = true; break; } @@ -94,6 +100,21 @@ void ignitionA_task(void *pvParameters) { LOG_ERROR("Invalid A Interrupt"); } + vTaskDelay(pdMS_TO_TICKS(1)); // delay 1ms to allow peak detectors to charge + + if (new_data12) { + // read adc channels: pickup12, out12 [ pos + neg ] + ignA_status.volts12_pickup = adcReadChannel(adc, PICKUP_IN_A12); + ignA_status.volts12_out = adcReadChannel(adc, PICKUP_OUT_A12); + // reset peak detectors + digitalWrite(RST_A12P, HIGH); + digitalWrite(RST_A12N, HIGH); + vTaskDelay(pdMS_TO_TICKS(1)); + digitalWrite(RST_A12P, HIGH); + digitalWrite(RST_A12N, HIGH); + // save on circluar buffer 12 + } + } }