From a2d0afa0c92e2fde91c08c9b5e4f4e84c9f9c166 Mon Sep 17 00:00:00 2001 From: Emanuele Trabattoni Date: Sun, 5 Apr 2026 11:16:10 +0200 Subject: [PATCH] adc read ok, very slow --- RotaxMonitor/platformio.ini | 2 +- RotaxMonitor/src/devices.h | 3 +++ RotaxMonitor/src/main.cpp | 51 ++++++++++++++++++++++--------------- RotaxMonitor/src/pins.h | 10 +++----- RotaxMonitor/src/tasks.cpp | 7 +++-- 5 files changed, 43 insertions(+), 30 deletions(-) diff --git a/RotaxMonitor/platformio.ini b/RotaxMonitor/platformio.ini index 4803271..f1dd197 100644 --- a/RotaxMonitor/platformio.ini +++ b/RotaxMonitor/platformio.ini @@ -49,7 +49,7 @@ upload_port = /dev/ttyACM2 upload_speed = 921600 ;Monitor configuration -monitor_speed = 115200 +monitor_speed = 921600 monitor_port = /dev/ttyACM2 ; Debug configuration diff --git a/RotaxMonitor/src/devices.h b/RotaxMonitor/src/devices.h index 869729f..e6027e5 100644 --- a/RotaxMonitor/src/devices.h +++ b/RotaxMonitor/src/devices.h @@ -1,5 +1,8 @@ #pragma once +// Library defines +#define ADS1256_SPI_ALREADY_STARTED + // Device Libraries #include #include diff --git a/RotaxMonitor/src/main.cpp b/RotaxMonitor/src/main.cpp index 70977b6..a149e9e 100644 --- a/RotaxMonitor/src/main.cpp +++ b/RotaxMonitor/src/main.cpp @@ -19,7 +19,13 @@ // #define CH_B_ENABLE #define TEST -void printTaskStats() { +float freqToRPM(float freq) +{ + return freq * 60.0f; // 1 pulse per revolution +} + +void printTaskStats() +{ char buffer[1024]; vTaskGetRunTimeStats(buffer); Serial.println(buffer); @@ -102,14 +108,15 @@ void loop() bool spiA_ok = true; bool spiB_ok = true; -#ifndef TEST // Init 2 SPI interfaces SPIClass SPI_A(FSPI); spiA_ok = SPI_A.begin(SPI_A_SCK, SPI_A_MISO, SPI_A_MOSI); + SPI_A.setDataMode(SPI_MODE1); // ADS1256 requires SPI mode 1 + #ifndef TEST SPIClass SPI_B(HSPI); spiB_ok = SPI_B.begin(SPI_B_SCK, SPI_B_MISO, SPI_B_MOSI); -#endif - + SPI_B.setDataMode(SPI_MODE1); // ADS1256 requires SPI mode 1 + #endif if (!spiA_ok || !spiB_ok) { LOG_ERROR("Unable to Initialize SPI Busses"); @@ -119,13 +126,13 @@ void loop() } LOG_INFO("Init SPI OK"); -#ifndef TEST // Init ADC_A - dev.adc_a = new ADS1256(ADC_A_DRDY, ADC_A_RST, ADC_A_SYNC, ADC_A_CS, 2.5, &SPI_A); + dev.adc_a = new ADS1256(ADC_A_DRDY, ADS1256::PIN_UNUSED, ADC_A_SYNC, ADC_A_CS, 2.5, &SPI_A); dev.adc_a->InitializeADC(); dev.adc_a->setPGA(PGA_1); - dev.adc_a->setDRATE(DRATE_1000SPS); + dev.adc_a->setDRATE(DRATE_30000SPS); +#ifndef TEST // Init ADC_B dev.adc_a = new ADS1256(ADC_B_DRDY, ADC_B_RST, ADC_B_SYNC, ADC_B_CS, 2.5, &SPI_B); dev.adc_a->InitializeADC(); @@ -185,7 +192,7 @@ void loop() if (ignA.coils12.spark_status == sparkStatus::SPARK_NEG_FAIL || ignA.coils12.spark_status == sparkStatus::SPARK_POS_FAIL) missed_firings12++; if (ignA.coils34.spark_status == sparkStatus::SPARK_POS_FAIL || ignA.coils34.spark_status == sparkStatus::SPARK_NEG_FAIL) - missed_firings34++; + missed_firings34++; clearScreen(); setCursor(0, 0); printField("++ Timestamp", (uint32_t)ignA.timestamp, 0, 0); @@ -194,10 +201,10 @@ void loop() printField("Missed Firing", missed_firings12, 0, 2); printField("Spark Dly", (uint32_t)ignA.coils12.spark_delay, 0, 3); printField("Spark Sts", sparkStatusNames.at(ignA.coils12.spark_status), 0, 4); - // printField("Peak P_IN", ignA.coils12.peak_p_in, 0, 5); - // printField("Peak P_OUT", ignA.coils12.peak_p_out, 0, 6); - // printField("Peak N_IN", ignA.coils12.peak_n_in, 0, 7); - // printField("Peak N_OUT", ignA.coils12.peak_n_out, 0, 8); + printField("Peak P_IN", ignA.coils12.peak_p_in, 0, 5); + printField("Peak N_IN", ignA.coils12.peak_n_in, 0, 7); + printField("Peak P_OUT", ignA.coils12.peak_p_out, 0, 6); + printField("Peak N_OUT", ignA.coils12.peak_n_out, 0, 8); printField("Soft Start ", softStartStatusNames.at(ignA.coils12.sstart_status), 0, 9); Serial.println("========== Coils 34 ============="); @@ -205,22 +212,24 @@ void loop() printField("Missed Firing", missed_firings34, 0, 12); printField("Spark Dly", (uint32_t)ignA.coils34.spark_delay, 0, 13); printField("Spark Sts", sparkStatusNames.at(ignA.coils34.spark_status), 0, 14); - // printField("Peak P_IN", ignA.coils34.peak_p_in, 0, 15); - // printField("Peak P_OUT", ignA.coils34.peak_p_out, 0, 16); - // printField("Peak N_IN", ignA.coils34.peak_n_in, 0, 17); - // printField("Peak N_OUT", ignA.coils34.peak_n_out, 0, 18); + printField("Peak P_IN", ignA.coils34.peak_p_in, 0, 15); + printField("Peak N_IN", ignA.coils34.peak_n_in, 0, 17); + printField("Peak P_OUT", ignA.coils34.peak_p_out, 0, 16); + printField("Peak N_OUT", ignA.coils34.peak_n_out, 0, 18); printField("Soft Start ", softStartStatusNames.at(ignA.coils34.sstart_status), 0, 19); Serial.println("========== END ============="); Serial.println(); - auto delta = (esp_timer_get_time() - last) / 1000000.0f; //in seconds - delta = delta > 0 ? 1.0f / delta : 0; // Calculate frequency (Hz) - printField("Frequency (Hz)", delta, 0, 21); + auto freq = (esp_timer_get_time() - last) / 1000000.0f; // in seconds + freq = freq > 0 ? 1.0f / freq : 0; // Calculate frequency (Hz) + printField("Engine RPM", freqToRPM(freq), 0, 21); printField("Queue Errors", (uint32_t)ignA.n_queue_errors, 0, 22); last = esp_timer_get_time(); - } else + } + else { - Serial.println("Waiting for data... ");; + Serial.println("Waiting for data... "); + delay(500); } } diff --git a/RotaxMonitor/src/pins.h b/RotaxMonitor/src/pins.h index a818b89..62a3ded 100644 --- a/RotaxMonitor/src/pins.h +++ b/RotaxMonitor/src/pins.h @@ -48,19 +48,17 @@ // ===================== #define ADC_A_CS 4 #define ADC_A_DRDY 5 -#define ADC_A_RST 6 -#define ADC_A_SYNC 7 +#define ADC_A_SYNC 6 #define ADC_B_CS 14 #define ADC_B_DRDY 15 -#define ADC_B_RST 16 -#define ADC_B_SYNC 17 +#define ADC_B_SYNC 16 // ===================== // DIGITAL POT // ===================== -//#define POT_A_CS 1 -//#define POT_B_CS 2 +#define POT_A_CS 7 +#define POT_B_CS 17 // ===================== // TRIGGER INPUT INTERRUPTS diff --git a/RotaxMonitor/src/tasks.cpp b/RotaxMonitor/src/tasks.cpp index 6b5606a..7f3348d 100644 --- a/RotaxMonitor/src/tasks.cpp +++ b/RotaxMonitor/src/tasks.cpp @@ -162,6 +162,7 @@ void rtIgnitionTask(void *pvParameters) continue; } + // Select coil status reference based on pickup_flag coilsStatus *coils; switch (pickup_flag) { @@ -176,6 +177,7 @@ void rtIgnitionTask(void *pvParameters) break; } + // Select logic based on pickup and spark flags switch (pickup_flag) { case TRIG_FLAG_12P: @@ -249,7 +251,6 @@ void rtIgnitionTask(void *pvParameters) { cycle12 = false; cycle34 = false; - // vTaskDelay(pdMS_TO_TICKS(1)); // delay 1ms to allow peak detectors to charge for negative cycle // read adc channels: pickup12, out12 [ pos + neg ] if (adc) // read only if adc initialized { @@ -283,7 +284,9 @@ void rtIgnitionTask(void *pvParameters) ign_box_sts.timestamp = esp_timer_get_time(); // update data timestamp if (xQueueSendToBack(rt_queue, (void *)&ign_box_sts, 0) != pdPASS) { - ign_box_sts.n_queue_errors++; + static uint32_t n_errors = 0; + n_errors++; + ign_box_sts.n_queue_errors = n_errors; LOG_ERROR("Failed to send to rt_queue"); } }