- Nozioni di base sul segnale PWM
- Configurazione e requisiti hardware
- Schema del circuito per la regolazione della luminosità del LED del microcontrollore Nuvoton N76E003
- Pin PWM sul microcontrollore N76E003 Nuvoton
- Registri e funzioni PWM nel microcontrollore N76E003 Nuvoton
- Modalità operative PWM nel microcontrollore Nuvoton N6E003
- Programmazione Nuvoton N76E003 per PWM
- Lampeggiante il codice e test dell'output
Pulse Width Modulation (PWM) è una tecnica comunemente utilizzata nei microcontrollori per produrre un segnale a impulsi continuo con una frequenza e un ciclo di lavoro definiti. In breve, PWM riguarda la modifica della larghezza di un impulso mentre la frequenza è costante.
Un segnale PWM viene utilizzato principalmente per controllare un servomotore o la luminosità di un LED. Inoltre, poiché i microcontrollori possono fornire solo Logic 1 (High) o Logic 0 (Low) sui suoi pin di uscita, non può fornire una tensione analogica variabile a meno che non venga utilizzato un convertitore DAC o Digital to Analog. In tal caso, il microcontrollore può essere programmato per emettere un PWM con un ciclo di lavoro variabile che può quindi essere convertito nella tensione analogica variabile. Abbiamo già utilizzato la periferica PWM in molti altri microcontrollori.
- Tutorial PWM ARM7-LPC2148: controllo della luminosità del LED
- Modulazione di larghezza di impulso (PWM) utilizzando MSP430G2: controllo della luminosità del LED
- Generazione di PWM utilizzando il microcontrollore PIC con MPLAB e XC8
- Modulazione di larghezza di impulso (PWM) in STM32F103C8: velocità di controllo della ventola CC
- Generazione di segnali PWM sui pin GPIO del microcontrollore PIC
- Tutorial PWM Raspberry Pi
- Tutorial PWM con ESP32
In questo tutorial, interfacciamo un LED che verrà controllato utilizzando questo segnale PWM dall'unità microcontrollore N76E003. Valuteremo che tipo di configurazione hardware abbiamo bisogno e come dovremmo programmare il nostro microcontrollore. Prima di ciò, comprendiamo alcune basi di un segnale PWM.
Nozioni di base sul segnale PWM
Nell'immagine sotto è mostrato un segnale PWM costante.
L'immagine sopra non è altro che un'onda quadra costante con lo stesso tempo ON e lo stesso tempo OFF. Supponiamo che il periodo totale del segnale sia di 1 secondo. Pertanto il tempo di accensione e spegnimento è di 500 ms. Se un LED è collegato a questo segnale, il LED si accenderà per 500 ms e si spegnerà per 500 ms. Pertanto, in vista prospettica, il LED si accenderà con la metà della luminosità effettiva se viene acceso con un segnale diretto a 5V senza alcun tempo di spegnimento.
Ora, come mostrato nell'immagine sopra, se il ciclo di lavoro viene modificato, il LED si accenderà con il 25% della luminosità effettiva utilizzando lo stesso principio discusso in precedenza. Se vuoi saperne di più e conoscere la modulazione di larghezza di impulso (PWM), puoi consultare l'articolo collegato.
Configurazione e requisiti hardware
Poiché il requisito di questo progetto è controllare i LED utilizzando PWM. È necessario un LED da interfacciare con N76E003. Poiché un LED è disponibile nella scheda di sviluppo N76E003, verrà utilizzato in questo progetto. Non sono necessari altri componenti.
Per non parlare del fatto che abbiamo bisogno della scheda di sviluppo basata sul microcontrollore N76E003 e del programmatore Nu-Link. Se il programmatore non viene utilizzato come fonte di alimentazione, potrebbe essere necessario un alimentatore aggiuntivo da 5 V.
Schema del circuito per la regolazione della luminosità del LED del microcontrollore Nuvoton N76E003
Come possiamo vedere nello schema seguente, il LED Test è disponibile all'interno della scheda di sviluppo ed è collegato alla porta 1.4. All'estrema sinistra viene mostrato il collegamento dell'interfaccia di programmazione.
Pin PWM sul microcontrollore N76E003 Nuvoton
L'N76E003 ha 20 pin di cui 10 possono essere utilizzati come PWM. Le immagini sottostanti mostrano i pin PWM evidenziati nella casella quadrata rossa.
Come possiamo vedere, i pin PWM evidenziati possono essere utilizzati anche per altri scopi. Tuttavia, questo altro scopo dei pin non sarà disponibile quando i pin sono configurati per l'uscita PWM. Pin 1.4 che viene utilizzato come pin di uscita PWM, perderà l'altra funzionalità. Ma questo non è un problema in quanto per questo progetto non è richiesta un'altra funzionalità.
Il motivo alla base della scelta del pin 1.4 come pin di uscita è perché il LED di test integrato è collegato a quel pin nella scheda di sviluppo, quindi non abbiamo bisogno di LED esterni. Tuttavia, in questo microcontrollore su 20 pin, 10 pin possono essere utilizzati come pin di uscita PWM e qualsiasi altro pin PWM può essere utilizzato per scopi relativi all'uscita.
Registri e funzioni PWM nel microcontrollore N76E003 Nuvoton
N76E003 utilizza l'orologio di sistema o l'overflow del timer 1 diviso per un orologio PWM con Prescaler selezionabile da 1/1 ~ 1/128. Il periodo PWM può essere impostato utilizzando il registro del periodo a 16 bit PWMPH e il registro PWMPL.
Il microcontrollore ha sei registri PWM individuali che generano sei segnali PWM chiamati PG0, PG1, PG2, PG3, PG4 e PG5. Tuttavia, il periodo è lo stesso per ogni canale PWM perché condividono lo stesso contatore del periodo a 16 bit ma il ciclo di lavoro di ogni PWM può essere diverso dagli altri poiché ogni PWM utilizza un registro del ciclo di lavoro a 16 bit diverso denominato {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} e {PWM5H, PWM5L}. Pertanto, in N76E003, sei uscite PWM possono essere generate indipendentemente con diversi cicli di lavoro.
A differenza di altri microcontrollori, l'abilitazione del PWM non imposta automaticamente i pin I / O nella loro uscita PWM. Pertanto, l'utente deve configurare la modalità di uscita I / O.
Quindi, qualunque cosa sia richiesta per l'applicazione, il primo passo è determinare o selezionare quale o due o anche più di due pin I / O come uscita PWM. Dopo averne selezionato uno, i pin I / O devono essere impostati come modalità Push-Pull o Quasi-bidirezionale per generare il segnale PWM. Questo può essere selezionato utilizzando il registro PxM1 e PxM2. Questi due registri impostano le modalità I / O dove la x sta per il numero di porta (Ad esempio, Porta P1.0 il registro sarà P1M1 e P1M2, per P3.0 sarà P3M1 e P3M2, ecc.)
La configurazione può essere vista nell'immagine sottostante-
Quindi, il passaggio successivo è abilitare il PWM in quel particolare pin di I / O. Per fare ciò, l'utente deve impostare i registri PIOCON0 o PIOCON1. Il registro dipende dalla mappatura dei pin poiché PIOCON0 e PIOCON1 controllano pin diversi a seconda dei segnali PWM. La configurazione di questi due registri può essere vista nell'immagine sottostante-
Come possiamo vedere, il registro sopra controlla 6 configurazioni. Per il resto, usa il registro PIOCON1.
Pertanto, il registro di cui sopra controlla le restanti 4 configurazioni.
Modalità operative PWM nel microcontrollore Nuvoton N6E003
Il passaggio successivo consiste nel selezionare le modalità di funzionamento PWM. Ogni PWM supporta tre modalità operative: modalità di attivazione indipendente, sincrona e tempo morto.
La modalità indipendente fornisce la soluzione in cui i sei segnali PWM possono essere generati indipendentemente. Ciò è richiesto il massimo delle volte in cui è necessario attivare e controllare le operazioni relative ai LED o ai cicalini.
La modalità sincrona imposta PG1 / 3/5 nella stessa uscita PWM in fase, la stessa di PG0 / 2/4, dove PG0 / 2/4 fornisce segnali di uscita PWM indipendenti. Ciò è principalmente richiesto per il controllo dei motori trifase.
La modalità di inserimento Dead-Time è un po 'complessa e viene applicata in applicazioni di motori reali, specialmente in applicazioni industriali. In tali applicazioni, un'uscita PWM complementare deve essere l'inserimento "tempo morto" che prevenga il danneggiamento dei dispositivi di commutazione di potenza come i GPIB. Le configurazioni sono impostate in questa modalità in modo che PG0 / 2/4 fornisca segnali di uscita PWM allo stesso modo della modalità indipendente ma PG1 / 3/5 fornisce l'uscita "segnali PWM fuori fase" di PG0 / 2/4 corrispondentemente e ignora il registro di servizio PG1 / 3/5.
È possibile selezionare le tre modalità sopra utilizzando la configurazione del registro di seguito:
La configurazione successiva è la selezione dei tipi PWM utilizzando il registro PWMCON1.
Quindi, come possiamo vedere, sono disponibili due tipi di PWM che possono essere selezionati utilizzando il registro sopra. Nell'allineamento sul fronte, il contatore a 16 bit utilizza il funzionamento a pendenza singola contando da 0000H al valore impostato di {PWMPH, PWMPL}, quindi iniziando da 0000H. La forma d'onda in uscita è allineata al bordo sinistro.
Tuttavia, in modalità allineata al centro, il contatore a 16 bit utilizza il funzionamento a doppia pendenza contando da 0000H a {PWMPH, PWMPL} e poi passa di nuovo da {PWMPH, PWMPL} a 0000H contando alla rovescia. L'uscita è allineata al centro ed è utile per generare forme d'onda non sovrapposte. Ora finalmente le operazioni di controllo PWM che possono essere verificate nei registri sottostanti-
Per impostare la sorgente del clock, utilizzare il registro di controllo del clock CKCON.
Il segnale di uscita PWM può anche essere mascherato utilizzando il registro PMEN. Utilizzando questo registro, l'utente può mascherare il segnale di uscita con 0 o 1.
Il prossimo è il registro di controllo PWM-
Il registro sopra è utile per eseguire il PWM, caricare nuovo periodo e carico di lavoro, controllare il flag PWM e azzerare il contatore PWM.
Le configurazioni dei bit associate sono mostrate di seguito:
Per impostare il divisore di clock, utilizzare il registro PWMCON1 per il divisore di clock PWM. Il quinto bit viene utilizzato per la modalità gruppo PWM raggruppata abilitata e fornisce lo stesso ciclo di lavoro per le prime tre coppie PWM.
Programmazione Nuvoton N76E003 per PWM
La codifica è semplice e il codice completo utilizzato per questo tutorial si trova in fondo a questa pagina. Il LED è collegato al pin P1.4. Pertanto è necessario utilizzare il pin P1.4 per l'uscita PWM.
Nel programma principale, le impostazioni vengono eseguite nel rispettivo ordine. Sotto le righe di codice imposta il PWM e configura il pin P1.4 come uscita PWM.
P14_PushPull_Mode;
Serve per impostare il pin P1.4 in modalità push-pull. Questo è definito nella libreria Function_define.h come-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Le righe successive utilizzate per abilitare il PWM nel pin P1.4. Questo è anche definito nella libreria Function_define.h come-
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 as Abilitazione uscita PWM1 PWM_IMDEPENDENT_MODE;
Il codice seguente viene utilizzato per impostare il PWM in modalità indipendente. Nella libreria Function_define.h , è definito come-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Quindi dobbiamo impostare l'uscita PWM di tipo EDGE. Nella libreria Function_define.h , è definito come-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Successivamente, dobbiamo cancellare il valore del contatore PWM che è disponibile nella libreria SFR_Macro.h-
#define set_CLRPWM CLRPWM = 1
Dopodiché, l'orologio PWM viene selezionato come orologio Fsys e il fattore di divisione utilizzato è la divisione 64.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Entrambi sono definiti come-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
La riga di codice sottostante viene utilizzata per mascherare il segnale PWM in uscita con 0 definito come
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Quindi dobbiamo impostare il periodo di tempo del segnale PWM. Questa funzione imposta il periodo nel registro PWMPL e PWMPH. Poiché si tratta di un registro a 16 bit, la funzione utilizza un metodo di spostamento dei bit per impostare il periodo PWM.
void set_PWM_period (unsigned int value) { PWMPL = (value & 0x00FF); PWMPH = ((value & 0xFF00) >> 8); }
Tuttavia, oltre al periodo 1023 e 8 bit, gli utenti possono anche utilizzare altri valori. Aumentando il periodo si ottengono attenuazioni o sbiadimenti graduali.
set_PWMRUN;
Questo avvierà il PWM definito nella libreria SFR_Macro.h come-
#define set_PWMRUN PWMRUN = 1
Successivamente, nel ciclo while , il LED si accende e si sbiadisce continuamente.
while (1) { for (value = 0; value <1024; value + = 10) { set_PWM1 (value); Timer1_Delay10ms (3); } for (value = 1023; value> 0; value - = 10) { set_PWM1 (value); Timer1_Delay10ms (2); } } }
Il duty cycle è impostato da set_PWM1 ();, una funzione che imposta il duty cycle nei registri PWM1L e PWM1H.
void set_PWM1 (valore int senza segno) { PWM1L = (valore & 0x00FF); PWM1H = ((value & 0xFF00) >> 8); set_LOAD; }
Lampeggiante il codice e test dell'output
Una volta che il codice è pronto, è sufficiente compilarlo e caricarlo sul controller. Se sei nuovo nell'ambiente, dai un'occhiata al tutorial su come iniziare con Nuvoton N76E003 per apprendere le basi. Come puoi vedere dal risultato seguente, il codice ha restituito 0 avvisi e 0 errori e ha lampeggiato utilizzando il metodo di lampeggiamento predefinito di Keil. L'applicazione inizia a funzionare.
Ricostruzione iniziata: Progetto: PWM Ricostruzione target 'Target 1' assemblaggio STARTUP.A51… compilazione main.c… compilazione Delay.c… collegamento… Dimensione programma: data = 35.1 xdata = 0 codice = 709 creazione file hex da ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 errori, 0 avvertenze. Tempo di costruzione trascorso: 00:00:05
L'hardware è collegato alla fonte di alimentazione e ha funzionato come previsto. Ovvero la luminosità del LED integrato ridotta e poi aumentata per indicare la variazione del duty cycle PWM.
Il funzionamento completo di questo tutorial si trova anche nel video linkato di seguito. Spero che il tutorial ti sia piaciuto e hai imparato qualcosa di utile se hai domande, lasciale nella sezione commenti o puoi usare i nostri forum per altre domande tecniche.