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.

main.cpp

Committer:
domemort
Date:
2022-01-18
Revision:
0:a835fa07c700

File content as of revision 0:a835fa07c700:

#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();
}