Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
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)
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+