LEZIONE 10. Scrivere, in ambiente mbed, il codice di una applicazione che: • Effettui una conversione A/D ad un rate di 200 Hz; • Alla pressione di un tasto calcoli il valore min e max degli ultimi 100 campioni e li invii sul monitor seriale; • Ogni 2 sec. invii tramite monitor seriale la temperatura interna del micro.

Revision:
0:a835fa07c700
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jan 18 17:17:22 2022 +0000
@@ -0,0 +1,91 @@
+#include "mbed.h"
+#include "platform/mbed_thread.h"
+#include "platform/CircularBuffer.h"
+
+AnalogIn                       ain(A0);
+BufferedSerial                 pc(USBTX, USBRX, 115200);
+Ticker                         conv;
+Thread                         t(osPriorityBelowNormal, 16 * 1024);
+EventQueue                     coda;
+CircularBuffer<uint16_t, 100>  buffer;
+uint16_t                       ADC_data;
+uint16_t                       frame_start=0xBBAA;
+uint16_t*                      ptr1;
+bool                           flag;
+
+InterruptIn                    bottone(PC_13);
+Mutex                          serial;
+
+Ticker                         temp;
+AnalogIn                       adc_temp(ADC_TEMP);
+
+
+void read_A0 (void);
+void fun (void);
+void ISR (void);
+void read_temp (void);
+void fun2 (void);
+
+int main()
+{
+    printf("Mbed OS version %d.%d.%d.\r\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
+    ptr1 = &frame_start;
+    t.start(callback(&coda, &EventQueue::dispatch_forever));
+    conv.attach(&read_A0, 5ms);
+    bottone.rise(&ISR);
+    temp.attach(&read_temp, 2s);
+    while(1) {
+        if(flag) {
+            ADC_data = ain.read_u16()>>4;
+            buffer.push(ADC_data);
+            flag = false;
+            ThisThread::sleep_for(4ms);
+        }
+    }
+}
+
+void read_A0 (void)
+{
+    flag = true;
+}
+
+void ISR (void)
+{
+    coda.call(&fun);
+}
+
+void read_temp (void)
+{
+    coda.call(&fun2);
+}
+
+void fun (void)
+{
+    uint16_t   vettore[100];
+    uint16_t   massimo;
+    uint16_t   minimo;
+
+    buffer.pop(vettore);
+    for (int i=0; i<99; i++) {
+        massimo = vettore[0];
+        if (vettore[i]>massimo) {
+           massimo = vettore[i];
+        }
+        minimo = vettore[0];
+        if (vettore[i]<minimo) {
+           minimo = vettore[i];
+        }
+    }
+    float massimo2 = massimo*3.3/4096;
+    float minimo2 = minimo*3.3/4096;
+    serial.lock();
+    printf("massimo = %1.3f,\t minimo = %1.3f\n\r" , massimo2, minimo2);
+    serial.unlock();
+}
+
+void fun2(void){
+    float tempp = adc_temp.read()*100;
+    serial.lock();
+    printf("Il valore di temperatura e': %1.3f\n\r" , tempp);   
+    serial.unlock();
+}
\ No newline at end of file