Tasks work in progress

This commit is contained in:
Emanuele Trabattoni
2026-03-25 18:22:02 +01:00
parent bece80ad6c
commit f84fcfffbb
3 changed files with 73 additions and 9 deletions

View File

@@ -0,0 +1,38 @@
#pragma once
// Device Libraries
#include <ADS1256.h>
#include <AD5292.h>
#include <Adafruit_SSD1306.h>
#include <PCA95x5.h>
// 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());
}

View File

@@ -10,10 +10,8 @@
#include <pins.h> #include <pins.h>
#include <channels.h> #include <channels.h>
#include <tasks.h> #include <tasks.h>
#include <devices.h>
// Device Libraries
#include <ADS1256.h>
#include <AD5292.h>
void setup() { void setup() {
delay(250); delay(250);
@@ -70,13 +68,20 @@ void setup() {
void loop() { void loop() {
// global variables // global variables
bool running = true; 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 // Ignition A on Core 0
auto ignA_task_success = xTaskCreatePinnedToCore( auto ignA_task_success = xTaskCreatePinnedToCore(
ignitionA_task, ignitionA_task,
"ignitionA_task", "ignitionA_task",
TASK_STACK, TASK_STACK,
NULL, (void*) &dev,
TASK_PRIORITY, TASK_PRIORITY,
&trigA_TaskHandle, &trigA_TaskHandle,
CORE_0 CORE_0
@@ -87,7 +92,7 @@ void loop() {
ignitionB_task, ignitionB_task,
"ignitionB_task", "ignitionB_task",
TASK_STACK, TASK_STACK,
NULL, (void*) &dev,
TASK_PRIORITY, // priorità leggermente più alta TASK_PRIORITY, // priorità leggermente più alta
&trigA_TaskHandle, &trigA_TaskHandle,
CORE_1 CORE_1

View File

@@ -7,9 +7,15 @@
// ISR // ISR
#include "isr.h" #include "isr.h"
// DEVICES
#include "devices.h"
const auto spark_timeout_max = 1; const auto spark_timeout_max = 1;
void ignitionA_task(void *pvParameters) { void ignitionA_task(void *pvParameters) {
Devices* dev = (Devices*) pvParameters;
ADS1256* adc = dev->adc;
uint32_t pickup_flag; uint32_t pickup_flag;
uint32_t spark_flag; uint32_t spark_flag;
@@ -43,6 +49,9 @@ void ignitionA_task(void *pvParameters) {
continue; continue;
} }
bool new_data12 = false;
bool new_data34 = false;
switch (pickup_flag) { switch (pickup_flag) {
case TRIG_FLAG_A12P: { case TRIG_FLAG_A12P: {
// Timeout not occourred, expected POSITIVE edge spark OCCOURRED // 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 // Timeout occourred, expected POSITIVE edge spark NOT OCCOURRED
else if (spark_timeout == pdFAIL && expected_negative12) { else if (spark_timeout == pdFAIL && expected_negative12) {
ignA_status.trig12_start = 0;
ignA_status.trig12_end = 0;
ignA_status.soft12_engaged = false; ignA_status.soft12_engaged = false;
ignA_status.spark12_status = sparkStatus::SPARK_NEG_FAIL; ignA_status.spark12_status = sparkStatus::SPARK_NEG_FAIL;
} }
@@ -81,9 +88,8 @@ void ignitionA_task(void *pvParameters) {
ignA_status.soft12_engaged = true; ignA_status.soft12_engaged = true;
ignA_status.spark12_status = sparkStatus::SPARK_NEG_UNEXPECTED; ignA_status.spark12_status = sparkStatus::SPARK_NEG_UNEXPECTED;
} }
// Save status on circular buffer // Save status on circular buffer
new_data12 = true;
break; break;
} }
@@ -94,6 +100,21 @@ void ignitionA_task(void *pvParameters) {
LOG_ERROR("Invalid A Interrupt"); 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
}
} }
} }