From 3a148023d2a9727764c3745f9ec832b5b7db08b5 Mon Sep 17 00:00:00 2001 From: Harvey Bates Date: Thu, 4 Mar 2021 21:50:14 +1100 Subject: [PATCH] increased sampling rate --- Firmware/v0.3/Teensy_3.6/Teensy_3.6.ino | 10 ++++++++-- Firmware/v0.3/Teensy_3.6/fluorescence.cpp | 20 ++++++++++---------- Firmware/v0.3/Teensy_3.6/fluorescence.h | 4 ++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Firmware/v0.3/Teensy_3.6/Teensy_3.6.ino b/Firmware/v0.3/Teensy_3.6/Teensy_3.6.ino index 4e7de71..88dd573 100644 --- a/Firmware/v0.3/Teensy_3.6/Teensy_3.6.ino +++ b/Firmware/v0.3/Teensy_3.6/Teensy_3.6.ino @@ -20,6 +20,9 @@ #include "sensitivity.h" #include "actinic.h" #include "fluorescence.h" +#include + +ADC *adc = new ADC(); Fluorescence fluorescence; Sensitivity sensitivity; @@ -27,7 +30,10 @@ Actinic actinic; void setup() { Serial.begin(115200); // Initalise serial communications at specific baud rate - analogReadResolution(12); // Set the resolution of the microcontroller in bits + adc->adc0->setAveraging(0); + adc->adc0->setResolution(12); + adc->adc0->setConversionSpeed(ADC_CONVERSION_SPEED::VERY_HIGH_SPEED); + adc->adc0->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED); pinMode(13, OUTPUT); // Sets the microcontrollers LED pin as an output sensitivity.refresh(); // Switch off all gain pathways @@ -41,7 +47,7 @@ void loop(){ if(Serial.available()){ String command = Serial.readStringUntil('\n'); if(command.equals("MF")){ - fluorescence.measure_fluorescence(actinic.intensity_pin); + fluorescence.measure_fluorescence(actinic.intensity_pin, adc); } else if(command.startsWith("A")){ unsigned int intensity = command.substring(1, command.length()).toInt(); diff --git a/Firmware/v0.3/Teensy_3.6/fluorescence.cpp b/Firmware/v0.3/Teensy_3.6/fluorescence.cpp index 18c2de9..cfd9b2e 100644 --- a/Firmware/v0.3/Teensy_3.6/fluorescence.cpp +++ b/Firmware/v0.3/Teensy_3.6/fluorescence.cpp @@ -91,7 +91,7 @@ void Fluorescence::wave(Actinic actinic){ } } -void Fluorescence::measure_fluorescence(unsigned int actinicPin) { +void Fluorescence::measure_fluorescence(unsigned int actinicPin, ADC *adc) { digitalWrite(actinicPin, HIGH); long long timer = micros(); // Start timer @@ -99,14 +99,14 @@ void Fluorescence::measure_fluorescence(unsigned int actinicPin) { // Read microsecond fluorescence values and corresponding timestamps for (unsigned int i = 0; i < sizeof(microRead) / sizeof(int); i++) { - microRead[i] = analogRead(readPin); + microRead[i] = adc->adc0->analogRead(readPin); microTime[i] = micros() - timer; } // Read millisecond fluorescence values and corresponding timestamps for (unsigned int i = 0; i < sizeof(milliRead) / sizeof(int); i++) { - milliRead[i] = analogRead(readPin); + milliRead[i] = adc->adc0->analogRead(readPin); milliTime[i] = micros() - timer; delay(1); } @@ -117,32 +117,32 @@ void Fluorescence::measure_fluorescence(unsigned int actinicPin) { // Convert micros() to milliseconds (ms) for microsecond values and convert bits to voltage for (unsigned int i = 0; i < sizeof(microRead) / sizeof(int); i++) { - float milliReal = microTime[i]/1000; // Convert micros() to ms - // Find fm value, we do this here while data are still ints + float milliReal = microTime[i]/1000.0; // Convert micros() to ms + // Find fm value, we do this here while the data is an interger if (microRead[i] > fm){ fm = microRead[i]; } - fluorescenceValues[i] = (microRead[i] * refVoltage) / 4096; // Convert to volts and append to final array + fluorescenceValues[i] = (microRead[i] * refVoltage) / 4096.0; // Convert to volts and append to final array timeStamps[i] = milliReal; // Append time to final array Serial.print(milliReal, 3); Serial.print("\t"); - Serial.println((microRead[i] * refVoltage) / 4096, 4); + Serial.println((microRead[i] * refVoltage) / 4096.0, 4); delay(1); } // Convert micros() to milliseconds for millsecond values and convert bits to voltage for (unsigned int i = 0; i < sizeof(milliRead) / sizeof(int); i++) { - float milliReal = milliTime[i]/1000; // Convert micros() to ms + float milliReal = milliTime[i]/1000.0; // Convert micros() to ms // Find fm value if not in microsecond range if (milliRead[i] > fm){ fm = milliRead[i]; } - fluorescenceValues[i + microLength] = (milliRead[i] * refVoltage) / 4096; // Convert to V and append + fluorescenceValues[i + microLength] = (milliRead[i] * refVoltage) / 4096.0; // Convert to V and append timeStamps[i + microLength] = milliReal; // Append to timestamps after microRead data Serial.print(milliReal, 3); Serial.print("\t"); - Serial.println((milliRead[i] * refVoltage) / 4096, 4); + Serial.println((milliRead[i] * refVoltage) / 4096.0, 4); delay(1); } } diff --git a/Firmware/v0.3/Teensy_3.6/fluorescence.h b/Firmware/v0.3/Teensy_3.6/fluorescence.h index be6792b..216cdc2 100644 --- a/Firmware/v0.3/Teensy_3.6/fluorescence.h +++ b/Firmware/v0.3/Teensy_3.6/fluorescence.h @@ -21,10 +21,10 @@ #ifndef Fluorescence_H #define Fluorescence_H -#pragma once #include #include "actinic.h" #include "sensitivity.h" +#include /* Fluorescence analogread pin */ #define readPin 14 @@ -102,7 +102,7 @@ class Fluorescence{ void measure_j_step(Actinic actinic); void calculate_parameters(); void wave(Actinic actinic); - void measure_fluorescence(unsigned int actinicPin); + void measure_fluorescence(unsigned int actinicPin, ADC *adc); // Debugging commands void calibrate_fo(Actinic actinic);