A geração de PWM (modulação por largura de pulso) é o tipo de tarefa comumente necessária em aplicações envolvendo MCUs, seja para controle de brilho de leds, controle de potência, controle de velocidade de motores, etc. Neste artigo eu mostro como utilizar os canais da unidade TAU dos RL78 para gerar sinais PWM.
Uma unidade TAU é composta basicamente de 4 ou mais (até 8) canais. Estes canais consistem praticamente em unidades de temporização autônomas de 16 bits, capazes de fazer temporizações, captura de sinais e outras tarefas. Cada canal possui um registrador de contagem (TCRmn), um registrador de comparação ou captura (TDRmn), um registrador de configuração (TMRmn). Além disso, a unidade TAU possui um registrador de configuração para os 4 prescalers disponíveis (TPSm) e registradores para a configuração dos pinos de E/S associados aos canais (é possível habilitar/desabilitar os pinos, controlar a polaridade e o nível fixo de cada pino). Também há registradores para controlar os filtros de ruído disponíveis quando os canais fazem captura ou recebem clock através dos pinos.
Os canais podem ainda ser associados numa configuração mestre/escravo, onde um canal mestre pode estar associado a um ou mais escravos. Este tipo de configuração é que viabiliza a geração de sinais PWM. Desta forma, utiliza-se um canal (mestre) configurado para operar no modo temporizador e responsável pelo controle do período do sinal PWM, que pode ser calculado através da seguinte fórmula:
Os sinais PWM propriamente ditos são gerados pelos canais escravos que devem ser configurados para operar no modo de contagem única (one count), sendo disparados em sincronia com o canal mestre. O ciclo ativo é calculado através da seguinte fórmula:
A figura abaixo ilustra a geração de um sinal PWM e a operação dos registradores envolvidos. O valor X corresponde ao período do sinal e Y corresponde ao ciclo ativo. Os sinais TSmestre e TSescravo são os disparos (via registrador de disparo dos canais). A figura ilustra o sinal PWM operando nas duas polaridades possíveis, conforme a configuração do registrador TOL.
A seguir temos um pequeno exemplo que demonstra como configurar dois canais PWM no RL78/G13 (R5F100LEA). Utiliza-se o canal 0 como mestre e os canais 1 e 2 como escravos. O período do sinal é configurado através do registrador TDR00 (999+1 = 1ms). O ciclo ativo do canal 1 é configurado no registrador TDR01 (100 = 10% de ciclo ativo) e o ciclo ativo do canal 2 é configurado no registrador TDR02 (900 = 90% de ciclo ativo). A saída do canal 1 ocorre pelo pino P16/TO01 e a saída do canal 2 ocorre pelo pino P17/TO02.
#include "ior5f100le.h" #include "ior5f100le_ext.h" #include "intrinsics.h" #include "myRL78.h" // Configura watchdog = desligado #pragma location = "OPTBYTE" __root __far const char opbyte0 = WDT_OFF; // Configura detector de baixa tensão = desligado #pragma location = "OPTBYTE" __root __far const char opbyte1 = LVD_OFF; // oscilador 32MHz flash high speed #pragma location = "OPTBYTE" __root __far const char opbyte2 = FLASH_HS | CLK_32MHZ; // debug ativado, com apagamento em caso de falha de autenticação #pragma location = "OPTBYTE" __root __far const char opbyte3 = DEBUG_ON_ERASE; /* Configura security ID */ #pragma location = "SECUID" __root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0}; void main(void) { PM1 = 0x3F; // P17 e P16 como saídas (canais 1 e 2 da TAU0) TAU0EN = 1; // habilita a TAU0 TPS0 = TAU_CK0_DIV32; // CK0=1MHz, CK1=32MHz, CK2=16MHz e CK3=125kHz // configura o canal 0 no modo mestre para PWM TMR00 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_TIMER_TRIG_INT; // configura os canais 1 e 2 no modo escravo para PWM TMR01 = TAU_CK0 | TAU_TRIG_MASTER | TAU_MD_ONECOUNT_TRIG; TMR02 = TAU_CK0 | TAU_TRIG_MASTER | TAU_MD_ONECOUNT_TRIG; TDR00 = 999; // período do sinal PWM = 1kHz TDR01 = 100; // canal 1 = 10% de ciclo ativo TDR02 = 900; // canal 2 = 90% de ciclo ativo TOE0L = TAU_CH2 | TAU_CH1; // habilita a saída dos canais 1 e 2 da TAU0 // saída dos canais 1 e 2 controladas pelo mestre/escravo TOM0L = TAU_CH2 | TAU_CH1; // dispara os canais mestre e escravos TS0L = TAU_CH0 | TAU_CH1 | TAU_CH2; while (1); }
O sinal PWM gerado acima deverá ter um período de 1ms conforme ilustra a figura a seguir: