Nella prima puntata siamo partiti dall'intenzione di dare a tutti una buona infarinatura delle schede STM Discovery al fine di portare il generico neofita a padroneggiare “appieno” questa eccezionale scheda. In questa seconda puntata, continuando nel nostro intento, scopriremo le periferiche più semplici da utilizzare per completare il quadro generale di ingressi ed uscite, esplorando gli output analogici e gli ingressi digitali e analogici, in modo tale che già dopo questo secondo articolo chiunque possa iniziare a divertirsi con i sensori e gli attuatori più comuni. Completeremo il nostro articolo con un paio di progetti pratici, realizzando dapprima un dispositivo che previa attuazione è in grado di regolare la luminosità di un LED in funzione della luce ambientale, per poi concludere con il controllo di un motore in dc. Ma ora basta con le chiacchiere, facciamo parlare le periferiche.
Il PWM
Tralasciando il concetto di uscita di un sistema, concetto che dovrebbe essere già abbastanza chiaro e per il quale nel caso rimandiamo a testi specialistici, nel primo appuntamento avevano visto come fosse facile una volta assegnato ad un determinato pin, il ruolo di GPIO, settarlo ad un livello logico alto (3.3 Volt sul pin) o basso (0 Volt sul pin) tramite la funzione "HAL_GPIO_WritePin()" ora invece vedremo come impostare sul pin una tensione variabile compresa tra i 0 e i 3.3 Volt, mediante le periferiche PWM del microcontrollore.
Il termine PWM è l'acronimo di Pulse-Width Modulation (Modulazione di larghezza di impulso), trascurando i dettagli di tale tecnica per i quali rimandiamo a testi più specialistici, nell'ottica del semplice microcontrollore si tratta di un treno di impulsi di durata variabile ad una data frequenza. Ogni impulso non è altro che un onda quadra con un periodo fisso, dipendente dalla frequenza del treno, composta da una parte alta (3.3 Volt) che dura per un certo "Ton" e una parte bassa (0 Volt) che dura per un certo "Toff" come mostrato in nella figura 1.
Se la frequenza del treno è sufficientemente alta rispetto alle frequenze dei device a valle è possibile far arrivare a quest'ultimi una tensione variabile tra 0 e 3.3 Volt semplicemente cambiando i tempi di on ed off dell'onda quadra. Il tempo del treno, ovvero il tempo tra due impulsi successivi, ovviamente sarà l'inverso della frequenza di quest'ultimo o più semplicemente la somma dei tempi di on ed off, T = Ton + Toff.
Il rapporto tra il Ton e il tempo globale T, prende il nome di "duty cycle", pertanto se vogliamo creare una tensione variabile ci basterà agire su quest'ultimo, nel caso per esempio in cui vogliamo una tensione nulla, imporremo un duty cycle del 0%, ovvero solo Toff, nel caso in cui vogliamo una tensione media di 3.3 Volt, useremo il duty cycle massimo, ovvero solo Ton e nel caso in cui ad esempio vogliamo una tensione di 0.33 Volt imporremo un duty cycle del 10% in quanto 0.33 volt è esattamente il 10% della tensione massima.
Rimanendo sempre su quest'ultimo esempio se abbiamo una frequenza del treno di 100 Hz, ovvero un periodo di 10 ms tra due impulsi seguenti e vogliano una tensione di 0.33 Volt, il Ton sarà il 10% del totale e quindi 1 ms, mentre l'onda starà bassa per i restanti 9 ms, prima del nuovo impulso.
Nelle STM32 Discovery boards un segnale di tipo PWM viene generato mediante l’utilizzo dei timer interni al microcontrollore (già incontrati nella puntata precedente) ricordiamoci che il microcontrollore che stiamo utilizzando monta a bordo ben 12 timers (fig. 2), che nel nostro esempio useremo il timer 3 per la generazione del segnale pwm e che lo faremo tramite un apposita funzione che abbiamo scritto “WritePulse”. Spiegheremo il funzionamento di quest’ultima più avanti quando vedremo il codice completo del nostro esempio.
ADC
La periferica ADC, come da acronimo Analog-Digital Converter, non è altro che un convertitore analogico digitale. In questa sede tralasceremo ancora un volta i dettagli un po più tecnici per i quali come sempre rimandiamo a testi più specialistici, e ci limiteremo a dare un breve spiegazione dei concetti e delle grandezze relative a questa periferica, come la risoluzione, il sampling rate e l’aliasing.
Un convertitore analogico digitale si occupa di convertire un segnale analogico [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 4159 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
La fotoresistenza varia la sua resistenza inversamente proporzionale alla luminosità. Al buio la resistenza dovrebbe essere più grande. Anche perchè si basa sull’effetto fotoelettrico. Che tipo di fotoresistenza hai utilizzato ? Credo che i valori dovrebbero essere (almeno) invertiti.
Ciao Maurizio, ti ringrazio per la segnalazione. Come giustamente dici, i valori nell’articolo andrebbero cambiati, ovvero quando c’è luce la resistenza ha un valore inferiore e viceversa di pari passo cambiano i valori di tensione. Ed in questo punto credo sia nata la svista che hai notato, in quanto, nel primo circuito che abbiamo provato, il partitore era montato al contrario (leggevamo la tensione sulla resistenza fissa), dopo la scrittura dell’articolo abbiamo cambiato il partitore; ed a quel punto sicuramente ci è sfuggito l’errore. Ad ogni modo grazie ancora per la segnalazione, fa sempre piacere constatare che qualcuno si interessi al tuo lavoro. Grazie a presto.
Grazie a te per l’interessante articolo. Non vedo l’ora di leggere la puntata successiva 😉
Quando parli di PWM su ponte H e motore DC non è corretto dire che i transistor paralleli T1/T3 e T2/T4 non ha senso attivarli.
Per non dissipare sui diodi l’effetto indotto dall’induttanza del motore una tecnica utilizzata è Slow Decay Mode e permette un controllo più accurato del posizionamento del motore. Ti rimando a questo link per un approfonditmento (http://ebldc.com/?p=86).
Per il resto sempre bello vedere le discovery board in funzione, anche se un F4 è un mostro di potenza per queste applicazioni, ma per quello che costa è sicuramente un ottima piattaforma di development.
Ciao Daniele, ho visto il link che hai postato e sembra davvero interessante. Per il resto come dicevamo nel primo articolo le Discovery sono molto potenti e costano pochissimo, purtroppo a nostro parere non sono ancora riuscite a sfondare per la mancanza di una grossa community che le usi o che crei strumenti che facilitino il loro utilizzo, in questi termini Arduino vince a mani basse. Speriamo questi piccoli contributi possano contribuire alla crescita della community, anche se quando si inizia ad usare un nuovo hardware è sempre consigliato partire dalle cose facili :-). Ti ringrazio della segnalazione che dimostra un reale interesse nei confronti di queste schede, a presto.
Più che interesse io ci lavoro con gli STM32, e poi a casa ci smanetto.
Credo che l’ostacolo più grande sia IDE di sviluppo, io ho la fortuna che per lavoro uso Keil, ma capisco che non è un tool alla portata di tutti.
La cosa ottima però (non per fare propaganda) è che Keil rilascia la versione professional se si utilizzano gli STM32F0/L0, meno potenti degli F4, ma pur sempre ottimi strumenti (manca il trace, ma non è un grosso limite a mio avviso), oppure si rimane limitati ai 32Kb (vanno bene per test, ma non molto di più).
Di Arduino amo la semplicità e la velocità con cui si sviluppa, ma tutto questo si paga in termini di controllo ovviamente.
Buon proseguimento e divertimento con le Discovery 😀
Salve, sono uno studente di ingegneria dell’automazione della Federico II ed ho bisogno disperatamente di aiuto. Il 17 luglio devo presentare la tesi di laurea per la triennale, scrivo perché il mio professore mi ha dato come argomento della tesi chibios, chibistudio e come detto stesso da lui ” la mia proposta è quella di fare un’applicazione che, a seguito della pressione del tasto user, illumini un led con una forma d’onda Pwm a duty cycle variabile ed inoltre fare il porting da stm32f4 ad stm32f3. Per i primi due punti non ho avuto problemi , ma non sono riuscito a fare il programmino essendo un pò negato con lo schedino. Volevo chiedere se qualcuno era disponibile nel darmi una mano, preferibilmente anche su skype, riguardo il programma da fare ed ovviamente a pagamento. Grazie mille in anticipo.