Temperature Sampling

Dependencies:   mbed

Fork of Nucleo-DAC-Algorithm by Giuseppe Falagario

main.cpp

Committer:
pinofal
Date:
2018-01-23
Revision:
0:3106d3fc6696
Child:
1:ffc7a5d0f629

File content as of revision 0:3106d3fc6696:

#include "mbed.h"

AnalogIn in(A0);
Serial pc(SERIAL_TX, SERIAL_RX);

#if !DEVICE_ANALOGOUT
#error You cannot use this example as the AnalogOut is not supported on this device.
#else

AnalogOut OutLocale(PA_4);
AnalogOut OutCampagna(PA_5);
#endif
// numero di campioni che compongono un periodo della sinusoide
#define SAMPLENUM   360 // consigliabile avere  multipli di 180
// periodo in millisecondi della 83.3 Hz
#define T833   (1/83.3) 
// periodo in millisecondi della 50 Hz
#define T50    (1/50.0)
// periodo in millisecondi del Bridge tra le diverse fasi = 9,6 ms
#define T96     (0.0096)
// numero di campioni in 1/4 di periodo
#define QUARTERSAMPLENUM SAMPLENUM/4

// parametri dell'onda coseno da generare
#define PI        (3.141592653589793238462)
#define AMPLITUDE 32767 //(1.0)    // x * 3.3V
#define PHASE     (PI/2) // 2*pi is one period
//#define RANGE     (1.0) //(0x7FFF)
#define OFFSET    32767 //(0x7FFF)

// Buffer contenente la sinusoide da porre in output.
unsigned short usaSine[SAMPLENUM];

//uint16_t usaBuffer[SAMPLENUM];

void CalculateSinewave(void);


// Output LED di diagnostica
DigitalOut led(LED1);

// ticker per la generazione dell'onda
Ticker SampleTicker;


// indice per i cicli
int nIndex;
// carattere in arrivo dal PC
volatile char cReadChar;
// valore letto dall'ADC
volatile unsigned short usReadADC;

// Tipo di PSK da generare
volatile int nPSK;
// indice, nell'array, del campione da porre in output
int nSampleIndex;
// contatore dei campioni inviati
int nSampleCount;
// Periodo di generazione campioni in output DeltaT = T/NumSample
double fDeltaT;
// amplificazione per il dato da spedire sull'ADC
volatile double fAmp;
//volatile double fAmpNew;
// Step attuale e nuovo Step nella generazione di una PSK
int nStep;
int nNewStep;

// ritardo tra un campione e l'altro della generazione ADC
//volatile int nDelay;
//variabile ausiliaria
volatile unsigned short usAux;
// variabili in cui memorizzare i prossimi valori da implementare
//volatile int nDelayNew;
// flag per bloccare la generazione del segnale
volatile bool bStop;
// frequenza segnale da generare
volatile double fFreq;

//****************************
// Create the sinewave buffer
//****************************
void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
{
    // variabile contenente l'angolo in radianti
    double fRads;
    // indici per i cicli
    int nIndex;
    // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
    double fDeltaF;
    // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
    double fAngle;
    
    fDeltaF = 360.0/SAMPLENUM;
    for (nIndex = 0; nIndex < SAMPLENUM; nIndex++) 
    {
        fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
        fRads = (PI * fAngle)/180.0; // Convert degree in radian
        //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
        usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
    }
}


//***************************
// generazione sample da DAC
//***************************
void SampleOut() 
{
    
    // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
    if(bStop)
    {
    }
    else // se non è stato inviato il comando di bStop continua
    {
        // output del campione della forma d'onda
        //usAux=(usaSine[nSampleIndex])/fAmp;
        //usAux=usaSine[nSampleIndex];
        OutLocale.write_u16(usaSine[nSampleIndex]);
        OutCampagna.write_u16(usaSine[nSampleIndex]);
        
        // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSAmpleIndex va da 0 a 359
        nSampleIndex++;
        if(nSampleIndex >= SAMPLENUM) 
        {
            nSampleIndex=0; 
        }
        // incrementa il numero di campioni inviati, e individua la fase in cui ci si trova, relativamente alla modulazione PSK selezionata
        nSampleCount++;
        //pc.printf(" nSampleIndex= %3d ; nSampleCount= %5d ; nPSK = % 1d ; nNewStep = %1d \n\r",nSampleIndex, nSampleCount, nPSK, nNewStep);
        
        switch(nPSK)
        {
            case 1:
            {
                switch(nSampleCount)
                {
                    case 0: //if(nSampleCount == 0) // dopo il ciclo completo, si ritorna allo step 1
                    {
                        nNewStep = 1; // genera 23 periodi di sinusoide
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (23*SAMPLENUM): //if(nSampleCount == (23*SAMPLENUM)) // dopo 23 periodi a 83.3 Hz, passa allo step 2 in cui genera il primo Bridge
                    {
                        nNewStep = 2; // genera Bridge
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (24.25*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz
                    {
                        nNewStep = 3; // genera 15 periodi di sinusoide
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    }
                    case (39.25*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge
                    {
                        nNewStep = 4; // Genera Bridge
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (40.5*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz
                    {
                        nNewStep = 5; // genera 7 periodi di sinusoide
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (47.5*SAMPLENUM):  //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge
                    {
                        nNewStep = 6; // Genera Bridge
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (48.75*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, genera 7 periodi a 83.3Hz
                    {
                        nNewStep = 7; // genera 7 periodi di sinusoide
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (55.75*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, genera bridge
                    {
                        nNewStep =8; // genera bridge
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    case (57*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, bridge, ritorna a generare 23 periodi a 83.3Hz    
                    {
                        nNewStep =1;
                        nSampleCount =0;
                        //pc.printf(" nStep = %1d \n\r",nNewStep);
                    } break;
                    default: {} break;
                }    
            } break;
            default: break;
        }  
             
        //led = !led;
    }
}




 //*******************
 // Loop Principale
 //*******************  
int main()
{
    // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
    pc.baud(921600); //921600 bps
    pc.printf("*** SineWave Generation ***\n\r");
    
    //inizializza variabili
    fAmp = 1.0;
    cReadChar = 0;
    nSampleIndex=0;
    nSampleCount=0;
    nPSK =0;
    bStop= false;
    fFreq = 83.3;
    
    // genera sinusoide
    CalculateSinewave(32767, 32767, (PI/2.0));
        
    // avvia il ciclo di generazione sinusoide
    while(true) 
    {
                        
        // verifica se è arrivato un carattere dalla seriale del PC
        if(pc.readable())
        {
            cReadChar = pc.getc(); // Read hyperterminal
            bStop = false; // è stato inviato un comando, quindi resetta il flag di Stop: bStop = False
            
            if(cReadChar == '1') // genera sinusoide a 83.3Hz con ampiezza ridotta a metà della nominale
            {
                pc.printf("--- Selezionato PSK-I ---\n\r");
                bStop = false; // è stato inviato un comando, quindi bStop = False
                nPSK = 1;
                fAmp = 1.0;
                nSampleIndex=0;
                nSampleCount=0;
                nStep = 0; // inizializza lo step che sarà aggiornato nella routine di generazione campione
                //fAmpNew = 1.0;
                //fDeltaT= T833/SAMPLENUM; // frequenza di generazione iniziale
            }    
            if (cReadChar == 'a') // genera sinusoide a 83.3Hz con ampiezza nominale
            {
                fFreq = 83.3;
                pc.printf("--- Generazione %.1f Hz ampiezza nominale ---\n\r", fFreq);
                bStop = false; // è stato inviato un comando, quindi bStop = False                
                nPSK = 0; // nessuna PSK da generare
                fAmp = 1.0;
                fDeltaT = 1.0/(fFreq*SAMPLENUM);
                SampleTicker.attach(&SampleOut,fDeltaT);
            }
            if (cReadChar == 'b') // genera sinusoide a 50 Hz con ampiezza ridotta a metà della nominale
            {
               fFreq = 50.0;
               pc.printf("--- Generazione %.1f Hz ampiezza 1/2 della nominale ---\n\r", fFreq);
               nPSK = 0; // nessuna PSK da generare
               fAmp = 1.0;
               // genera sinusoide
               CalculateSinewave(32767, (32767/2), (PI/2.0));
               // attach ticker
               fDeltaT = 1.0/(fFreq*SAMPLENUM);
               SampleTicker.attach(&SampleOut,fDeltaT);
            }
            if (cReadChar == 'c') // genera sinusoide a 45 Hz con ampiezza ridotta a 1/4 del valore nominale
            {
               fFreq = 45.0;
               pc.printf("--- Generazione %.1f Hz ampiezza 1/4 della nominale ---\n\r", fFreq);
               nPSK = 0; // nessuna PSK da generare
               fAmp = 1.0;
               // genera sinusoide
               CalculateSinewave(32767, (32767/4), (PI/2.0));
               // attach ticker
               fDeltaT = 1.0/(fFreq*SAMPLENUM);
               SampleTicker.attach(&SampleOut,fDeltaT);
            }
            
            if (cReadChar == 'z') // Stop
            {
                pc.printf("--- Stop Generazione ---\n\r");
                bStop=true;
            }
            led.write(1);
        }  // if (pc.readable())
        
                                                    
        // In base alla PSK selezionata, ci saranno diversi step da seguire
        switch (nPSK)
        {
            case 1: // PSK-I
            {
                // Avvia il primo step della PSK selezionata. Nello Step 0 non si ritornerà più
                if(nStep == 0)
                {
                    pc.printf("*** Avvio generazione ***\n\r");
                    nNewStep = 1;
                }
                // se è stato raggiunto il numero di campioni per la variazione di Step, aggiorna il numero di Step e modifica i parametri di generazione
                if(nStep != nNewStep)
                {
                    // aggiorna il numero di Step e modifica i parametri di generazione
                    nStep = nNewStep;
                    switch (nStep)
                    {
                        case 1:
                        {
                            // genera 23 periodi a 83.3 Hz
                            //+++pc.printf("+++ 23 sinusoidi a 83,3Hz +++\n\r");
                            fDeltaT = double((double)T833/(double)SAMPLENUM);
                            SampleTicker.attach(&SampleOut,fDeltaT);
                        } break;
                        case 2:
                        {
                            // dopo 23 periodi a 83.3 Hz, genera il primo Bridge
                            //+++pc.printf("+++ Primo Bridge +++\n\r");
                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
                            SampleTicker.attach(&SampleOut,fDeltaT);
                        } break;   
                        case 3:
                        {
                            // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz
                            //+++pc.printf("+++ 15 sinusoidi a 83,3Hz +++\n\r");
                            fDeltaT = double((double)T833/(double)SAMPLENUM);
                            SampleTicker.attach(&SampleOut, fDeltaT);
                        } break;
                        case 4:
                        {
                            // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge
                            //+++pc.printf("+++ Secondo Bridge +++\n\r");
                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
                            SampleTicker.attach(&SampleOut, fDeltaT);
                        } break;
                        case 5:
                        {
                            // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz
                            //+++pc.printf("+++ 7 Sinusoidi a 83.3Hz +++\n\r");
                            fDeltaT = double((double)T833/(double)SAMPLENUM);
                            SampleTicker.attach(&SampleOut, fDeltaT);
                        } break;
                        case 6:
                        {
                            // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge
                            //+++pc.printf("+++ Terzo Bridge +++\n\r");
                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
                            SampleTicker.attach(&SampleOut, fDeltaT);
                        } break;
                        case 7:
                        {
                            // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, genera 7 periodi a 83.3Hz
                            //+++pc.printf("+++ 7 sinusoidi a 83.3Hz +++\n\r");
                            fDeltaT = double((double)T833/(double)SAMPLENUM);
                            SampleTicker.attach(&SampleOut, fDeltaT);
                        } break;
                        case 8:
                        {
                            // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, genera bridge
                            //+++pc.printf("+++ Quarto Bridge +++\n\r");
                            fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
                            SampleTicker.attach(&SampleOut, fDeltaT);
                        } break;
                        default: break;
                    } //switch (nStep)
                } // if(nStep != nNewStep) 
            } break; //case 1:
            default: {} break;
        } //switch (nPSK)    
    } // while(true)
}