Temperature Sampling
Dependencies: mbed
Fork of Nucleo-DAC-Algorithm by
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) }