Temperature Sampling

Dependencies:   mbed

Fork of Nucleo-DAC-Algorithm by Giuseppe Falagario

Revision:
2:dbaf3140560a
Parent:
1:ffc7a5d0f629
diff -r ffc7a5d0f629 -r dbaf3140560a main.cpp
--- a/main.cpp	Tue Jan 30 16:30:54 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,452 +0,0 @@
-#include "mbed.h"
-
-AnalogIn InLocale(PA_6);
-AnalogOut OutLocale(PA_4);
-AnalogOut OutCampagna(PA_5);
-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
-#endif
-
-
-// Numero di periodi di sinusoide di cui è composto ciascuno step della PSK
-#define fPerStep1  23.0
-#define fPerStep2  1.25
-#define fPerStep3  15.0
-#define fPerStep4  1.25
-#define fPerStep5  7.0
-#define fPerStep6  1.25
-#define fPerStep7  7.0
-#define fPerStep8  1.25
-
-// numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
-#define SAMPLESINENUM   45 // consigliabile avere  multipli di 45
-// numero di campioni generati durante una intera modulazione PSK. Nominalmente la somma del numero di periodi degli step è 57. 
-#define nNumPeriodi (fPerStep1 + fPerStep2 + fPerStep3 + fPerStep4 + fPerStep5 + fPerStep6 + fPerStep7 + fPerStep8)
-#define SAMPLEOUTNUM    (SAMPLESINENUM*nNumPeriodi)
-// numero di campioni acquisiti dall'ADC e che compongono l'array
-#define SAMPLEINNUM (SAMPLESINENUM*nNumPeriodi*2)+2   // contiene una intera onda (in Byte) generata con PSK, + 2 caratteri 
-
-// 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)
-// periodo di acquisizione dall'ADC
-#define TADC (0.0048) // impostato aper avere 3 campioni nel periodo di bridge (1.25 * 9.6 ms)
-// numero di campioni in 1/4 di periodo
-#define QUARTERSAMPLEOUTNUM SAMPLESINENUM/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 è un periodo
-#define OFFSET    32767 //(0x7FFF)
-
-// Output LED di diagnostica
-DigitalOut led(LED1);
-
-// ticker per la generazione dell'onda con DAC
-Ticker SampleOutTicker;
-// ticker per l'acquisizione dell'onda con ADC
-//Ticker SampleInTicker;
-
-// Buffer contenente la sinusoide da porre in output.
-unsigned short usaSine[SAMPLESINENUM];
-
-// array con i dati acquisiti dall'ADC Locale
-//volatile unsigned short usaLocaleADC[SAMPLEINNUM];
-volatile char caTxPacket[(int)SAMPLEINNUM];
-
-// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
-void CalculateSinewave(void);
-
-// 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
-volatile int nSampleOutIndex;
-// indice, nell'array, del campione acquisito in input
-volatile int nSampleInIndex;
-// contatore dei campioni in output sul DAC
-volatile int nSampleOutCount;
-// contatore dei campioni in input dall'ADC
-volatile int nSampleInCount;
-// 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
-volatile int nStep;
-volatile int nNewStep;
-//variabili ausiliarie
-volatile unsigned short usAux;
-volatile char cAux;
-// 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/SAMPLESINENUM;
-    for (nIndex = 0; nIndex < SAMPLESINENUM; 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[nSampleOutIndex])/fAmp;
-        //usAux=usaSine[nSampleOutIndex];
-        OutLocale.write_u16(usaSine[nSampleOutIndex]);
-        OutCampagna.write_u16(usaSine[nSampleOutIndex]);
-        
-        // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359
-        nSampleOutIndex++;
-        if(nSampleOutIndex >= SAMPLESINENUM) 
-        {
-            nSampleOutIndex=0; 
-        }
-        
-        // acquisisce dato da ADC
-        usReadADC = InLocale.read_u16();
-        // prepara il pacchetto di dati acquisiti  da restituire al PC
-        caTxPacket[nSampleInCount]= (char)(usReadADC&0xFF);
-        //+++caTxPacket[nSampleInCount]= 'a';
-        nSampleInCount++;
-        caTxPacket[nSampleInCount] = (char)((usReadADC>>8)&0xFF);
-        //++++caTxPacket[nSampleInCount]= 'b';
-        
-        // incrementa il numero di campioni inviati, e individua la fase in cui ci si trova, relativamente alla modulazione PSK selezionata
-        nSampleOutCount++;
-        nSampleInCount = nSampleOutCount*2;
-        
-                
-        switch(nPSK)
-        {
-            case 0: 
-            {
-                // in questo caso sto generando sinusoidi a frequenza fissa, senza PSK; reinizializza gli indici degli array di campioni acquisiti e generati
-                if(nSampleOutCount >= SAMPLEOUTNUM) // nSampleInCount è sempre pari a nSampleOutCount*2
-                {
-                    nSampleOutCount=0;
-                }
-            } break;
-            case 1:
-            {
-                switch(nSampleOutCount)
-                {
-                    case 0: //if(nSampleOutCount == 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 (fPerStep1*SAMPLESINENUM): //if(nSampleOutCount == (23*SAMPLESINENUM)) // 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 ((fPerStep1+fPerStep2)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // 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 ((fPerStep1+fPerStep2+fPerStep3)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM))) // 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 ((fPerStep1+fPerStep2+fPerStep3+fPerStep4)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SSAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // 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 ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5)*SAMPLESINENUM):  //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM))) // 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 ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5+fPerStep6)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // 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 ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5+fPerStep6+fPerStep7)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM))) // 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 ((fPerStep1+fPerStep2+fPerStep3+fPerStep4+fPerStep5+fPerStep6+fPerStep7+fPerStep8)*SAMPLESINENUM): //if(nSampleOutCount == ((23*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(15*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM)+(7*SAMPLESINENUM)+(1.25*SAMPLESINENUM))) // 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;
-                        nSampleOutCount =0;
-                        //pc.printf(" nStep = %1d \n\r",nNewStep);
-                    } break;
-                    default: {} break;
-                }    
-            } break;
-            default:{} break;
-        }
-    }
-}
-
-
-
-
- //*******************
- // Loop Principale
- //*******************  
-int main()
-{
-    // indice per i cicli
-    int nIndex;
-    
-    // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
-    pc.baud(921600); //921600 bps
-    //pc.baud(256000); //256000 bps
-    pc.printf("*** SineWave Generation ***\n\r");
-    
-    //inizializza variabili
-    nSampleInIndex =0;
-    fAmp = 1.0;
-    cReadChar = 0;
-    nSampleOutIndex=0;
-    nSampleOutCount=0;
-    nPSK =0;
-    bStop= false;
-    fFreq = 83.3;
-    for(nIndex =0; nIndex < SAMPLEINNUM; nIndex++)
-    {
-        caTxPacket[nIndex]='\0';
-    }
-    
-    
-    
-        
-    // genera sinusoide
-    //+++SampleInTicker.attach(&SampleIn,TADC);  // Ticker di acquisizione dall'ADC  
-    // 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("\n\r--- Selezionato PSK-I ---\n\r");
-                bStop = false; // è stato inviato un comando, quindi bStop = False
-                nPSK = 1;
-                fAmp = 1.0;
-                nSampleOutIndex=0;
-                nSampleOutCount=0;
-                // generazione della sinusoide con valori nominali
-                CalculateSinewave(32767, 32767, (PI/2.0));
-                nStep = 0; // inizializza lo step che sarà aggiornato nella routine di generazione campione
-                //fAmpNew = 1.0;
-                //fDeltaT= T833/SAMPLEOUTNUM; // frequenza di generazione iniziale
-            }    
-            if (cReadChar == 'a') // genera sinusoide a 83.3Hz con ampiezza nominale
-            {
-                bStop = true;
-                nPSK = 0; // nessuna PSK da generare
-                fFreq = 83.3;
-                pc.printf("\n\r--- Generazione %.1f Hz ampiezza nominale ---\n\r", fFreq);
-                //nSampleOutIndex=0;
-                //nSampleOutCount=0;
-                fAmp = 1.0;
-                // generazione della sinusoide con valori nominali
-                CalculateSinewave(32767, 32767, (PI/2.0));
-                fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-                bStop = false;
-                SampleOutTicker.attach(&SampleOut,fDeltaT);
-            }
-            if (cReadChar == 'b') // genera sinusoide a 50 Hz con ampiezza ridotta a metà della nominale
-            {
-                bStop = true;
-                nPSK = 0; // nessuna PSK da generare
-                fFreq = 50.0;
-                pc.printf("\n\r--- Generazione %.1f Hz ampiezza 1/2 della nominale ---\n\r", fFreq);
-                //nSampleOutIndex=0;
-                //nSampleOutCount=0;
-                fAmp = 1.0;
-                // genera sinusoide
-                CalculateSinewave(32767, (32767/2), (PI/2.0));
-                // attach ticker
-                fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
-                bStop = false;
-                SampleOutTicker.attach(&SampleOut,fDeltaT);
-            }
-            if (cReadChar == 'c') // genera sinusoide a 45 Hz con ampiezza ridotta a 1/4 del valore nominale
-            {
-                bStop = true;
-                nPSK = 0; // nessuna PSK da generare
-                fFreq = 45.0;
-                pc.printf("\n\r--- Generazione %.1f Hz ampiezza 1/4 della nominale ---\n\r", fFreq);
-                //nSampleOutIndex=0;
-                //nSampleOutCount=0;
-                fAmp = 1.0;
-                // genera sinusoide
-                CalculateSinewave(32767, (32767/4), (PI/2.0));
-                // attach ticker
-                fDeltaT = (double)(1.0/((double)fFreq*(double)SAMPLESINENUM));
-                bStop = false; // è stato inviato un comando, quindi bStop = False     
-                SampleOutTicker.attach(&SampleOut,fDeltaT);
-            }
-            
-            if (cReadChar == 'z') // Stop
-            {
-                nPSK = 0; // nessuna PSK da generare
-                pc.printf("\n\r--- 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 0: {} break;
-            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:
-                        {
-                            // invia il buffer di campioni relativi ad una intera generazione PSK con sfasamento totale di 360°
-                            pc.printf("%s", caTxPacket); // 50 caratteri
-
-                            // genera 23 periodi a 83.3 Hz
-                            //+++pc.printf("+++ 23 sinusoidi a 83,3Hz +++\n\r");
-                            fDeltaT = double((double)T833/(double)SAMPLESINENUM);
-                            SampleOutTicker.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)(SAMPLESINENUM));
-                            SampleOutTicker.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)SAMPLESINENUM);
-                            SampleOutTicker.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)(SAMPLESINENUM));
-                            SampleOutTicker.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)SAMPLESINENUM);
-                            SampleOutTicker.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)(SAMPLESINENUM));
-                            SampleOutTicker.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)SAMPLESINENUM);
-                            SampleOutTicker.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)(SAMPLESINENUM));
-                            SampleOutTicker.attach(&SampleOut, fDeltaT);
-                        } break;
-                        default: break;
-                    } //switch (nStep)
-                } // if(nStep != nNewStep) 
-            } break; //case 1:
-            default: {} break;
-        } //switch (nPSK)    
-    } // while(true)
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-