- Noções básicas de sinal PWM
- Configuração e requisitos de hardware
- Diagrama de circuito do microcontrolador Nuvoton N76E003 com dimerização de LED
- Pinos PWM no microcontrolador N76E003 Nuvoton
- Registros e funções PWM no microcontrolador N76E003 Nuvoton
- Modos de operação PWM no microcontrolador Nuvoton N6E003
- Programando Nuvoton N76E003 para PWM
- Atualizando o código e testando a saída
A modulação por largura de pulso (PWM) é uma técnica comumente usada em microcontroladores para produzir um sinal de pulso contínuo com uma frequência e ciclo de trabalho definidos. Resumindo, PWM trata de alterar a largura de um pulso enquanto a frequência é constante.
Um sinal PWM é usado principalmente no controle de um servo motor ou no brilho de um LED. Além disso, como os microcontroladores podem fornecer apenas Lógica 1 (Alta) ou Lógica 0 (Baixa) em seus pinos de saída, eles não podem fornecer uma tensão analógica variável, a menos que um conversor DAC ou Digital para Analógico seja usado. Nesse caso, o microcontrolador pode ser programado para emitir um PWM com um ciclo de trabalho variado que pode então ser convertido para a voltagem analógica variável. Anteriormente, usamos periféricos PWM em muitos outros microcontroladores também.
- ARM7-LPC2148 PWM Tutorial: Controlando o brilho do LED
- Modulação de largura de pulso (PWM) usando MSP430G2: Controlando o brilho do LED
- Gerando PWM usando Microcontrolador PIC com MPLAB e XC8
- Modulação de largura de pulso (PWM) em STM32F103C8: Velocidade de controle do ventilador DC
- Gerando sinais PWM nos pinos GPIO do microcontrolador PIC
- Tutorial Raspberry Pi PWM
- Tutorial PWM com ESP32
Neste tutorial, faremos a interface com um LED que será controlado usando este sinal PWM da unidade de microcontrolador N76E003. Avaliaremos que tipo de configuração de hardware exigimos e como devemos programar nosso microcontrolador. Antes disso, vamos entender alguns fundamentos de um sinal PWM.
Noções básicas de sinal PWM
Na imagem abaixo, um sinal PWM constante é mostrado.
A imagem acima nada mais é do que uma onda quadrada constante com o mesmo tempo ON e o mesmo tempo OFF. Suponha que o período total do sinal seja de 1 segundo. Portanto, o tempo de ativação e desativação é de 500 ms. Se um LED estiver conectado a este sinal, o LED acenderá por 500 ms e apagará por 500 ms. Portanto, na vista em perspectiva, o LED acenderá com metade do brilho real se for ligado a um sinal direto de 5 V sem nenhum tempo de desligamento.
Agora, conforme mostrado na imagem acima, se o ciclo de trabalho for alterado, o LED acenderá com 25% do brilho real usando o mesmo princípio discutido antes. Se você quiser saber mais e aprender sobre modulação por largura de pulso (PWM), você pode verificar o artigo no link.
Configuração e requisitos de hardware
Como o requisito deste projeto é controlar o LED usando PWM. É necessário um LED para fazer a interface com o N76E003. Como um LED está disponível na placa de desenvolvimento N76E003, ele será usado neste projeto. Nenhum outro componente é necessário.
Sem mencionar que precisamos da placa de desenvolvimento baseada em microcontrolador N76E003, bem como do programador Nu-Link. Uma fonte de alimentação de 5 V adicional pode ser necessária se o programador não for usado como fonte de alimentação.
Diagrama de circuito do microcontrolador Nuvoton N76E003 com dimerização de LED
Como podemos ver no esquema abaixo, o LED de teste está disponível dentro da placa de desenvolvimento e está conectado na porta 1.4. Na extrema esquerda, a conexão da interface de programação é mostrada.
Pinos PWM no microcontrolador N76E003 Nuvoton
O N76E003 possui 20 pinos, dos quais 10 podem ser usados como PWM. As imagens abaixo mostram os pinos PWM destacados na caixa do quadrado vermelho.
Como podemos ver, os pinos PWM destacados também podem ser usados para outros fins. No entanto, essa outra finalidade dos pinos não estará disponível quando os pinos forem configurados para saída PWM. O pino 1.4, que é usado como um pino de saída PWM, perderá a outra funcionalidade. Mas, isso não é um problema, pois outra funcionalidade não é necessária para este projeto.
A razão para escolher o pino 1.4 como um pino de saída é porque o LED de teste embutido é conectado a esse pino na placa de desenvolvimento, portanto, não exigimos LEDs externos. No entanto, neste microcontrolador de 20 pinos, 10 pinos podem ser usados como um pino de saída PWM e quaisquer outros pinos PWM podem ser usados para fins relacionados à saída.
Registros e funções PWM no microcontrolador N76E003 Nuvoton
O N76E003 usa o relógio do sistema ou estouro do Timer 1 dividido por um relógio PWM com Prescaler selecionável de 1/1 ~ 1/128. O período PWM pode ser definido usando o registro de período de 16 bits PWMPH e o registro PWMPL.
O microcontrolador tem seis registros PWM individuais que geram seis sinais PWM chamados PG0, PG1, PG2, PG3, PG4 e PG5. No entanto, o período é o mesmo para cada canal PWM porque eles compartilham o mesmo contador de período de 16 bits, mas o ciclo de trabalho de cada PWM pode ser diferente dos outros, pois cada PWM usa um registro de ciclo de trabalho de 16 bits diferente denominado {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} e {PWM5H, PWM5L}. Assim, no N76E003, seis saídas PWM podem ser geradas independentemente com diferentes ciclos de trabalho.
Ao contrário de outros microcontroladores, habilitar o PWM não define os pinos de E / S em sua saída PWM automaticamente. Portanto, o usuário precisa configurar o modo de saída de E / S.
Portanto, seja o que for necessário para a aplicação, a primeira etapa é determinar ou selecionar qual um ou dois ou até mais de dois pinos de I / O como saída PWM. Depois de selecionar um, os pinos de E / S precisam ser configurados como modo Push-Pull ou Quasi-bidirecional para gerar o sinal PWM. Isso pode ser selecionado usando os registros PxM1 e PxM2. Esses dois registros definem os modos de E / S onde x representa o número da porta (por exemplo, porta P1.0 o registro será P1M1 e P1M2, para P3.0 será P3M1 e P3M2, etc.)
A configuração pode ser vista na imagem abaixo
Em seguida, a próxima etapa é habilitar o PWM naquele (s) pino (s) de E / S específico. Para fazer isso, o usuário precisa definir os registros PIOCON0 ou PIOCON1. O registro é dependente do mapeamento do pino, já que PIOCON0 e PIOCON1 controlam diferentes pinos dependentes dos sinais PWM. A configuração desses dois registros pode ser vista na imagem abaixo
Como podemos ver, o registro acima controla 6 configurações. Para o resto, use o registro PIOCON1.
Assim, o registro acima controla as demais 4 configurações.
Modos de operação PWM no microcontrolador Nuvoton N6E003
A próxima etapa é selecionar os modos de operação PWM. Cada PWM suporta três modos de operação - Independent, Synchronous e Dead-Time enable mode.
O modo independente fornece a solução em que os seis sinais PWM podem ser gerados independentemente. Isso é necessário no máximo de vezes quando as operações relacionadas a LED ou campainhas precisam ser ligadas e controladas.
O modo Síncrono define o PG1 / 3/5 na mesma saída PWM em fase, o mesmo que PG0 / 2/4, onde o PG0 / 2/4 fornece sinais de saída PWM independentes. Isso é necessário principalmente para controlar motores trifásicos.
O modo de inserção Dead-Time é um pouco complexo e aplicado em aplicações reais de motores, especialmente em aplicações industriais. Em tais aplicações, uma saída PWM complementar precisa ser uma inserção de “tempo morto” que evita danos aos dispositivos de comutação de energia, como GPIBs. As configurações são definidas neste modo de forma que PG0 / 2/4 forneça sinais de saída PWM da mesma forma que o modo independente, mas PG1 / 3/5 fornece saída de "sinais PWM fora de fase" de PG0 / 2/4 correspondentemente e ignorar o registro de dever PG1 / 3/5.
Os três modos acima podem ser selecionados usando a configuração de registro abaixo
A próxima configuração é a seleção dos tipos de PWM usando o registro PWMCON1.
Assim, como podemos ver, estão disponíveis dois tipos de PWM que podem ser selecionados usando o registro acima. No alinhamento de borda, o contador de 16 bits usa a operação de inclinação única contando de 0000H até o valor definido de {PWMPH, PWMPL} e, em seguida, iniciando de 0000H. A forma de onda de saída é alinhada à esquerda.
Mas, no modo alinhado ao centro, o contador de 16 bits usa a operação de inclinação dupla, contando de 0000H a {PWMPH, PWMPL} e depois vai de {PWMPH, PWMPL} a 0000H por contagem regressiva. A saída é alinhada ao centro e é útil para gerar formas de onda não sobrepostas. Agora, finalmente, as operações de controle PWM que podem ser verificadas nos registros abaixo -
Para definir a fonte do relógio, use o registrador de controle de relógio CKCON.
O sinal de saída PWM também pode ser mascarado usando o registro PMEN. Usando este registro, o usuário pode mascarar o sinal de saída em 0 ou 1.
A seguir está o Registro de Controle PWM-
O registro acima é útil para executar o PWM, carregar um novo período e carga de trabalho, controlar o Sinalizador PWM e limpar o Contador PWM.
As configurações de bits associadas são mostradas abaixo-
Para definir o divisor de relógio, use o registrador PWMCON1 para o divisor de relógio PWM. O quinto bit é usado para o PWM agrupado habilitado para o modo de Grupo e fornece o mesmo ciclo de trabalho para os três primeiros pares de PWM.
Programando Nuvoton N76E003 para PWM
A codificação é simples e o código completo usado neste tutorial pode ser encontrado na parte inferior desta página. O LED está conectado ao pino P1.4. Portanto, o pino P1.4 é necessário para ser usado para a saída PWM.
No programa principal, as configurações são feitas na respectiva ordem. As linhas de código abaixo definem o PWM e configura o pino P1.4 como saída PWM.
P14_PushPull_Mode;
Isso é usado para definir o pino P1.4 no modo push-pull. Isso é definido na biblioteca Function_define.h como-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
As próximas linhas são usadas para habilitar o PWM no pino P1.4. Isso também é definido na biblioteca Function_define.h como-
#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 como Saída PWM1 habilitar PWM_IMDEPENDENT_MODE;
O código abaixo é usado para definir o PWM no modo independente. Na biblioteca Function_define.h , é definido como-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Então temos que definir a saída PWM do tipo EDGE. Na biblioteca Function_define.h , é definido como-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Em seguida, temos que limpar o valor do contador PWM que está disponível na biblioteca SFR_Macro.h
#define set_CLRPWM CLRPWM = 1
Depois disso, o relógio PWM é selecionado como o relógio Fsys e o fator de divisão usado é a divisão 64.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Ambos são definidos como-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
A linha de código abaixo é usada para mascarar o sinal PWM de saída por 0 definido como-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Então, temos que definir o período de tempo do sinal PWM. Esta função define o período no registro PWMPL e PWMPH. Como este é um registro de 16 bits, a função usa um método de deslocamento de bits para definir o período PWM.
void set_PWM_period (valor int sem sinal) { PWMPL = (valor & 0x00FF); PWMPH = ((valor & 0xFF00) >> 8); }
No entanto, além do período de 1023 e 8 bits, os usuários também podem usar outros valores. Aumentar o período resulta em escurecimento ou desbotamento suave.
set_PWMRUN;
Isso iniciará o PWM que está definido na biblioteca SFR_Macro.h como-
#define set_PWMRUN PWMRUN = 1
Em seguida, no loop while , o LED é ligado e desbotado continuamente.
while (1) { para (valor = 0; valor <1024; valor + = 10) { set_PWM1 (valor); Timer1_Delay10ms (3); } para (valor = 1023; valor> 0; valor - = 10) { set_PWM1 (valor); Timer1_Delay10ms (2); } } }
O ciclo de trabalho é definido pelo set_PWM1 ();, uma função que define o ciclo de trabalho no registro PWM1L e PWM1H.
void set_PWM1 (valor int sem sinal) { PWM1L = (valor & 0x00FF); PWM1H = ((valor & 0xFF00) >> 8); set_LOAD; }
Atualizando o código e testando a saída
Quando o código estiver pronto, basta compilá-lo e carregá-lo no controlador. Se você é novo no ambiente, confira o tutorial de introdução ao Nuvoton N76E003 para aprender o básico. Como você pode ver no resultado abaixo, o código retornou 0 aviso e 0 erros e piscou usando o método de flash padrão do Keil. O aplicativo começa a funcionar.
Reconstrução iniciada: Projeto: PWM Reconstruir alvo 'Destino 1' montando STARTUP.A51… compilando main.c… compilando Delay.c… vinculando… Tamanho do programa: dados = 35,1 xdata = 0 código = 709 criando arquivo hexadecimal de ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Erro (s), 0 Aviso (s). Tempo de construção decorrido: 00:00:05
O hardware está conectado à fonte de alimentação e funcionou conforme o esperado. Esse é o brilho do LED integrado reduzido e então aumentado para indicar a mudança do ciclo de trabalho PWM.
O trabalho completo deste tutorial também pode ser encontrado no vídeo com link abaixo. Espero que você tenha gostado do tutorial e aprendido algo útil se tiver alguma dúvida, deixe-os na seção de comentários ou você pode usar nossos fóruns para outras questões técnicas.