Sommario:

Generazione del segnale PWM ad alta risoluzione per servocomandi RC con dispositivi STM32: 3 passaggi
Generazione del segnale PWM ad alta risoluzione per servocomandi RC con dispositivi STM32: 3 passaggi

Video: Generazione del segnale PWM ad alta risoluzione per servocomandi RC con dispositivi STM32: 3 passaggi

Video: Generazione del segnale PWM ad alta risoluzione per servocomandi RC con dispositivi STM32: 3 passaggi
Video: Generare segnali PWM con Arduino : come controllare la velocità di un motore DC! 2024, Luglio
Anonim
Generazione di segnali PWM ad alta risoluzione per servocomandi RC con dispositivi STM32
Generazione di segnali PWM ad alta risoluzione per servocomandi RC con dispositivi STM32
Generazione di segnali PWM ad alta risoluzione per servocomandi RC con dispositivi STM32
Generazione di segnali PWM ad alta risoluzione per servocomandi RC con dispositivi STM32
Generazione di segnali PWM ad alta risoluzione per servocomandi RC con dispositivi STM32
Generazione di segnali PWM ad alta risoluzione per servocomandi RC con dispositivi STM32

Attualmente sto costruendo un trasmettitore/ricevitore RC basato sul chip RF SX1280. Uno degli obiettivi del progetto è che voglio una risoluzione del servo a 12 bit dagli stick fino ai servo. In parte perché i moderni servi digitali hanno una risoluzione di 12 bit, in secondo luogo un trasmettitore di fascia alta utilizza comunque 12 bit. Stavo studiando come posso generare segnali PWM ad alta risoluzione su dispositivi STM32. Sto usando la pillola nera (STM32F103C8T8) al momento per il prototipo.

Passaggio 1: elenco delle parti

Hardware

  • Qualsiasi scheda di sviluppo STM32F103 (pillola blu, pillola nera, ecc.)
  • Un power bank USB come alimentatore
  • Programmatore STM32 (Segger j-links, ST-LINK/V2, o semplicemente un clone di st-link)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO per STM32
  • Fonte del progetto da github

Passaggio 2: la soluzione ovvia

La soluzione ovvia
La soluzione ovvia
La soluzione ovvia
La soluzione ovvia
La soluzione ovvia
La soluzione ovvia

Probabilmente la soluzione più semplice è utilizzare uno dei timer in grado di generare segnali PWM, come TIM1-3 su un STM32F103. Per un moderno servo digitale il frame rate può scendere a circa 5 ms, ma per un vecchio servo analogico dovrebbe essere di 20 ms o 50 Hz. Quindi, come scenario peggiore, generiamolo. Con un clock di 72 MHz e una risoluzione del contatore del timer a 16 bit, è necessario impostare il prescaler del timer su un minimo di 23 per coprire il frame rate di 20 ms. Ho selezionato 24 perché quindi per 20 ms ho bisogno di impostare il contatore esattamente su 60000. Puoi vedere l'impostazione CubeMX e i segnali PWM generati da 1 e 1,5 ms negli screenshot. Sfortunatamente, per 1 ms il contatore del timer dovrebbe essere impostato su 3000, il che ci darebbe solo una risoluzione di 11 bit. Non male, ma l'obiettivo era 12 bit, quindi proviamo qualcos'altro.

Ovviamente se scegliessi un micro controller con timer a 32 bit, come STM32L476 questa risoluzione può essere molto più alta e il problema sarebbe risolto.

Ma qui vorrei proporre una soluzione alternativa che aumenterà ulteriormente la risoluzione anche sull'STM32F103.

Passaggio 3: timer a cascata per una risoluzione più elevata

Timer a cascata per una risoluzione più elevata
Timer a cascata per una risoluzione più elevata
Timer a cascata per una risoluzione più elevata
Timer a cascata per una risoluzione più elevata
Timer a cascata per una risoluzione più elevata
Timer a cascata per una risoluzione più elevata

Il problema principale con la soluzione precedente è che il frame rate (20 ms) è relativamente alto rispetto al segnale PWM effettivamente generato (tra 1 e 2 ms), quindi stiamo sprecando alcuni bit di valore per i restanti 18 ms quando stiamo aspettando il fotogramma successivo. Questo può essere risolto collegando i timer a cascata utilizzando la funzione di collegamento timer per la sincronizzazione.

L'idea è che userò TIM1 come master per generare il frame rate (20 ms) e TIM2, TIM3 per far fronte ai segnali PWM come slave. Quando il master attiva gli slave, questi generano solo un segnale PWM in una modalità a impulsi. Quindi ho solo bisogno di coprire 2 ms in quei timer. Fortunatamente puoi mettere in cascata quei timer nell'hardware, quindi questa sincronizzazione non richiede alcun intervento da parte del processore ed è anche molto precisa, il jitter è nella regione di ps. Puoi vedere la configurazione di CubeMX negli screenshot.

Come puoi vedere ho selezionato 3 come prescalare, quindi per i 2 ms ho bisogno di impostare 48000 nel contatore del timer. Questo ci dà 24000 per 1 ms, che in realtà è più di quello di cui abbiamo bisogno per una risoluzione a 14 bit. Tadaaaa…

Si prega di dare un'occhiata agli screenshot dell'oscilloscopio nell'introduzione per il risultato finale. Il canale 3 (viola) è l'interrupt del timer principale che attiverà i salvataggi per generare un impulso. I canali 1 e 4 (raggio giallo e verde) sono i segnali PWM effettivi generati da diversi timer. Nota che sono sincronizzati ma sono sincronizzati ai bordi d'uscita, questo a causa della modalità PWM 2. Questo non è un problema, perché la frequenza PWM per il particolare servo è ancora corretta.

Altro vantaggio di questa soluzione è che cambiare il frame rate significherebbe cambiare il periodo solo in TIM1. Per i moderni servi digitali puoi scendere anche a 200-300 Hz, ma per favore consulta il manuale del servo se vuoi regolarlo.

Consigliato: