Traccia svolta schedino 16/03/2018

richardino

Membro attivo
22 Settembre 2015
23
10
3
Traccia: Generare col DAC su PA4 un' onda quadra avente periodo pari alla seconda parte della propria matricola, e che vada da 0 a 3V.

Allora, ve la commento pure, perché piazzarvi solo il codice non penso serva a molto.

1] Un' onda quadra è per definizione un segnale che può assumere DUE valori, un valore basso e un valore alto. Nel nostro caso, il valore basso è 0 V, e quello alto è 3 V.
Generarla col DAC, significa che mi devo prima mettere in memoria i due codici corrispondenti alle due tensioni 0 e 3, per poi prelevarli una volta uno e una volta un altro e convertirli
in tensione. Allora che faccio.. mi metto in memoria un vettore di dimensione pari a 2, quindi contenente due elementi... il primo sarà il codice corrispondente a 3 V (4095)
l'altro sarà il codice corrispondente a 0 V (0).

2] Se l'onda ha periodo pari alla seconda parte della mia matricola, significa che la generazione dell'onda sarà regolata da un timer. Mettiamo caso che la seconda parte della mia matricola sia 3000.
Allora posso assumere come periodo T=3.00. Devo settare l'ARR in modo tale che ogni 3 secondi verrà convertito un periodo della mia onda. Un periodo dell'onda è composto
da VALORE ALTO+VALORE BASSO. Quindi se l'onda in totale ha periodo 3, per convertire un valore ALTO ci mette 1.5 sec e per convertire un valore basso altrettanto. Mi conviene
settare l'ARR in modo tale che ogni 1.5 mi converte un campione (cosicché in 3 secondi me ne ha convertiti 2 e quindi mi ha convertito un periodo intero).
Allora l'ARR lo devo settare così: ARR = 1.5 / Tck = 1.5 * 8 000 000 = 12 000 000.

3] Quel while(1) nel main caratterizza un ciclo infinito (la condizione in parentesi è sempre vera), proprio perché l'onda deve essere generata infinitamente.
Ma non è finita qui. Per generarla infinitamente è essenziale ad ogni conversione di campione incrementare un indice, e l'incremento dev'essere fatto
in modulo N. In modulo N significa che una volta arrivato all'ultimo valore del vettore in memoria, riparte dal primo. In questo modo io mi vado sempre a convertire
quei due campioni in memoria in maniera alternata (cioè nel senso una volta uno, una volta l'altro) e ottengo proprio l'onda infinita che voglio.

Cioè in pratica succede questo. Mettiamo caso che i parta da zero:

DAC->DHR12R1=LUT[0]; // il DAC copia nel suo registro per la conversione il primo valore del vettore in memoria, cioè quello ALTO (4095).
...... // aspetta il timer che gli da l'ok per convertire.
i=(i+1)%N -> ovvero i=1;

DAC->DHR12R1=LUT[1]; // il DAC copia nel suo registro per la conversione il secondo ed ultimo valore del vettore in memoria, cioè quello BASSO (0).
...... // aspetta il timer che gli da l'ok.
i=(i+1)%N -> ovvero i=0;

Adesso riparte dal primo valore del vettore, e continua così all'infinito perché dal while(1) non uscirà mai.

Spero di essere stato abbastanza chiaro.
 

Allegati

  • Onda.zip
    513 bytes · Visualizzazioni: 40
Ultima modifica:

Seguici su Facebook