Temperature Sampling
Dependencies: mbed
Fork of Nucleo-DAC-Algorithm by
Diff: main.cpp
- Revision:
- 0:3106d3fc6696
- Child:
- 1:ffc7a5d0f629
diff -r 000000000000 -r 3106d3fc6696 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jan 23 10:19:50 2018 +0000 @@ -0,0 +1,379 @@ +#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) +} + + + + + + + + + + + + + +