Skip to content
This repository was archived by the owner on Feb 28, 2024. It is now read-only.

Commit 65c748c

Browse files
add fast analog input read example using Arduino_AdvancedAnalog library
1 parent 00c8404 commit 65c748c

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* Portenta Machine Control - Fast Analog In 0-10 V
3+
*
4+
* This example provides the voltage value acquired by the Machine Control using the Arduino_AdvancedAnalog library,
5+
* which is designed to offer enhanced performance in terms of acquisition speed compared to the MachineControl_AnalogIn feature.
6+
* For each channel of the ANALOG IN connector, there is a resistor divider made by a 100k and 39k; the input voltage is divided by a ratio of 0.28.
7+
* The maximum input voltage is 10V.
8+
* To use the 0V-10V functionality, a 24V supply on the PWR SUPPLY connector is necessary.
9+
*
10+
* The circuit:
11+
* - Portenta H7
12+
* - Portenta Machine Control
13+
*
14+
* Initial author: Leonardo Cavagnis @leonardocavagnis
15+
*/
16+
17+
#include <Arduino_MachineControl.h>
18+
#include <Arduino_AdvancedAnalog.h>
19+
20+
const float RES_DIVIDER = 0.28057;
21+
const float REFERENCE = 3.0;
22+
23+
//A3 is connected to PMC-AI0, A2 is connected to PMC-AI1
24+
AdvancedADC MachineControl_FastAnalogIn01(A3, A2); //A3 & A2 share the same ADC instance (ADC3)
25+
//A1 is connected to PMC-AI2
26+
AdvancedADC MachineControl_FastAnalogIn2(A1);
27+
28+
uint16_t adc_get_buf(AdvancedADC &adc);
29+
void adc_get_buf(AdvancedADC &adc, uint16_t * sample_buf, uint8_t sample_buf_size);
30+
31+
void setup() {
32+
Serial.begin(9600);
33+
while (!Serial) {
34+
; // wait for serial port to connect.
35+
}
36+
37+
// Configure the sensor type 0-10V
38+
MachineControl_AnalogIn.begin(SensorType::V_0_10);
39+
40+
// Initialize the Advanced Analog feature on PMC AI pins
41+
if (!MachineControl_FastAnalogIn01.begin(AN_RESOLUTION_16, 8000, 32, 3)) {
42+
Serial.println("AI0, AI1: Failed to start analog acquisition!");
43+
while (1);
44+
}
45+
46+
if (!MachineControl_FastAnalogIn2.begin(AN_RESOLUTION_16, 8000, 32, 3)) {
47+
Serial.println("AI2: Failed to start analog acquisition!");
48+
while (1);
49+
}
50+
}
51+
52+
void loop() {
53+
uint16_t raw_voltage_ch01[2] = {0, 0};
54+
uint16_t raw_voltage_ch2 = 0;
55+
56+
adc_get_buf(MachineControl_FastAnalogIn01, raw_voltage_ch01, 2);
57+
float voltage_ch0 = ((float)raw_voltage_ch01[0] * REFERENCE) / 65535 / RES_DIVIDER;
58+
Serial.print("Voltage CH0: ");
59+
Serial.print(voltage_ch0, 3);
60+
Serial.println("V");
61+
62+
float voltage_ch1 = ((float)raw_voltage_ch01[1] * REFERENCE) / 65535 / RES_DIVIDER;
63+
Serial.print("Voltage CH1: ");
64+
Serial.print(voltage_ch1, 3);
65+
Serial.println("V");
66+
67+
raw_voltage_ch2 = adc_get_buf(MachineControl_FastAnalogIn2);
68+
float voltage_ch2 = ((float)raw_voltage_ch2 * REFERENCE) / 65535 / RES_DIVIDER;
69+
Serial.print("Voltage CH2: ");
70+
Serial.print(voltage_ch2, 3);
71+
Serial.println("V");
72+
73+
Serial.println();
74+
delay(250);
75+
}
76+
77+
uint16_t adc_get_buf(AdvancedADC &adc) {
78+
uint16_t sample = 0;
79+
80+
if (adc.available()) {
81+
SampleBuffer buf = adc.read();
82+
83+
// Print first sample.
84+
sample = buf[0];
85+
Serial.println(sample);
86+
87+
// Release the buffer to return it to the pool.
88+
buf.release();
89+
}
90+
91+
return sample;
92+
}
93+
94+
void adc_get_buf(AdvancedADC &adc, uint16_t * sample_buf, uint8_t sample_buf_size) {
95+
if (adc.available()) {
96+
SampleBuffer buf = adc.read();
97+
98+
for (uint8_t pos = 0; pos < sample_buf_size; pos++) {
99+
sample_buf[pos] = buf[pos];
100+
Serial.println(sample_buf[pos]);
101+
}
102+
103+
// Release the buffer to return it to the pool.
104+
buf.release();
105+
}
106+
107+
return;
108+
}

0 commit comments

Comments
 (0)