COMO GERAR TENSÕES DE 0 A 5 VOLTS USANDO MODULO PWM INTERNO DO PIC

Em algumas ocasiões, necessitamos controlar algum dispositivo com uma tensão variável. Quando queremos controlar usando um microcontrolador, podemos fazer uso do módulo CCP(Capture,Compare,Pwm) do PIC. Como podemos fazer isto?

Vamos supor que queiramos usar uma tensão de 0 a 5 volts, para controlar um circuito integrado de volume (TDA8199, por ex.). Poderiamos usar o circuito abaixo:

Nele notamos o uso do PIC 16F628a, um display de 7 seguimentos de anodo comum, e 3 botões, sendo um para UP (incrementar volume), o outro Down (decrementar o volume) e o Reset geral (opcional).
No pino 9, ficaria disponível a tensão PWM, após passar por um filtro RC (r5 e c1), pronta para uso na entrada de controle do ‘ci’.
Foi usado um único resistor no display por comodidade (mas poderia ser um individual para cada seguimento e o ânodo direto no +Vcc).

O módulo CCP (Capture,Compare,Pwm) é habilitado por definir valores corretos no registrador CCP1CON (colocando o valor ‘00001100’ entra em modo PWM). A frequência de operação é definida pela carga do registrador PR2 e o Duty Cicle (ou seja, o tempo que a saída PWM ficará em ‘1’) será carregado no registrador CCP1L (os 8 bits mais significativos e os 2 menos significativos em CCPCON, bits 4 e 5).
Em uso, definimos a frequência no programa e apenas mudamos a carga do registrador CCP1L.
A fórmula para o periodo do PWM é : (PR2 + 1) X 4 Tosc TMR2 X VALOR DO PRESCALE (Veja datasheet 16F628a, seção 9.3)
O módulo PWM faz uso do timer 2 (que deverá ser ligado pela rotina). Quando sua contagem se iguala com o valor do registrador PR2, sua contagem é zerada e o pino RB3 (saída Pwm) é setado (tempo ‘on’). Quando a contagem se iguala ao do registrador CCP1L( na realidade, CCP1H, que é uma cópia’ do CCP1L), então a saída RB3 é zerada. O timer continua contando até ser zerado (tempo ‘off’).
Quando apertamos ‘UP’ , este gerará um incremento no registrador ‘CONTL’ que incrementa de 0 a 3 e ao chegar em 4, é resetado , e também, nesta ocasião, irá incrementar o registrador ‘CONTH’. O registrador ‘CONTL’ irá dar o valor para os digitos menos significativos de comparação, presentes no registrador CCPCON, bits 4 e 5. Isto porque o módulo trabalha com 10 bits. Ao apertar ‘DOWN’ ocorrerá o decremento dos registradores ‘CONTL’ e ‘CONTH’. Estes são carregados no registrador ‘CCP1L’ e ‘CCPCON’ (2 bits) na sequência de programa. Para apresentação no display, o valor de ‘CONTH’ foi dividido por 25, gerando números de 0 a 9 (incluido o ‘H'(high) no máximo do valor). A conversão para 7 seguimentos é feita por uma tabela e ‘salto goto’.
Foi implementado uma função ‘rápida’ de ajuste, que opera após insistir em manter o botão apertado, quer para aumentar, quer para abaixar a tensão de saída. Faz uso do contador Z1 e o flag de controle ‘AJ_RAP’. Após uma certa quantidade de tempo de acionamento, a carga de ‘Z1’ chega a zero, setando o bit ‘AJ_RAP’. Quando a rotina entra em operação de ‘delay’, a carga do tempo será escolhida em função do flag ‘AJ_RAP’ (se setado = rápido, se zerado= normal). Esta rotina pode ser usada em outros modelos de PIC (que tenham módulo CCP, apenas), e a utilidade será proporcional a criatividade do usuário. Pode-se controlar lampadas, pequenos motores eletricos (com uso de transistor de potência na saída), brilho de backlight de displays, controlar um fonte de alimentação de bancada, controlar volume de som,etc. Use a sua imaginação e …. mãos a obra!!!

Segue o arquivo ASM:

PWM_0_5V_ASM

Segue o arquivo HEX:

PWM_0_5V_HEX

Datasheet para Pic 16F628a aqui.

ERRATA: Coloque um resistor de pull up de 10k ao vcc no pino 15 e outro no pino 18 (esquecido no esquema) ou acione o pull up interno do PIC.
Até o próximo artigo!!!

22 comments on “COMO GERAR TENSÕES DE 0 A 5 VOLTS USANDO MODULO PWM INTERNO DO PIC

  1. a principio poderia colocar num carro e monitorar por exemplo portas abertas , motor em funcionamento , freio de mão ativado entre outros .

    poderia também monitorar luzes em um sítio , portão trancado ,sei lá muitas coisas .

    colocar juntos com seus receptores e monitorar quais saídas estão ativados .

    1. Olá Michael!
      E a questão dos níveis de tensão dos interruptores? Tem equipamentos que operam com 5 volts, outras com 12 v (carros) e ainda com 110,220,380 volts. Seria por fotoacoplador? rele? interruptores duplos? Simples resistor de queda com zener de proteção? Percebe que a dificuldade maior será na ‘interface’ com os equipamentos. Para cada equipamento deverá ter uma diferente ou tentar uma ‘universal’. Haverá um interruptor de paginação, ou a tela fica ‘rodando em loop’ entre as telas seguintes e voltando a inicial? O conteúdo escrito poderá ser alterado ou será função do arquivo asm? Haverá alguma função ‘alarme’?
      Claudio

  2. ola claudio fiz uma montagem no proteus mesmo do projeto testando a principio funcionou perfeitamente porem o digito 8 não aparece no dislay pulando logo para o 9 e acrecentei dois resistores de 10K nos botões ao +5v pois ficou alterando o pwm sozinho ai resolvel , e o pwm ficou muito bom alterou certinho porem tem que ficar pressionando o botão por muito tempo ,mas acho que isso na pratica não vai acontecer agora so falta montagem na pratica fiquei pensando em outros projetos seu em vc disponibiliza no asm opções de mudar o pic neste modelo teria com muda-lo para usar em um pic12f675 sem o display isso seria interessante logo sabendo que ao ouvir o som vc saberia o volume que iria querer , agora gostei muito da ideia de poder controlar um motor e fazer uma referencia de velocidade pelo display
    obrigado mais uma vez . e que Deus seja na sua vida e dos seus visitantes .

    1. Olá Liliano!
      Voce pode migrar para o 12f675 alterando os arquivos ‘include’ do 16f628a para 12f675. Terá que modificar o trisA e trisB para trisio e as portA e B para Gpio. Terá que desligar o conversor analógico/digital escrevendo 0x00 no registrador Ansel . Terá que alterar as definições de portas e excluir tudo relacionado com o display de 7 seguimentos.
      Claudio

  3. Parabéns novamente, pelo novo projecto.

    Obrigado pelas informações que sao sempre bem vindas.

    E que Deus continue ti abençoando.

  4. amigo não tenho nem palavra este aqui ja é o suficiente para o que eu quero mas bvai pensando no modo por rf que te falei , fico grato pelo seu projeto precisando de mim é so falar , vendo algumas coisas nomercado livre e tenho uma loja virtual caso queira uma parceria ou disponibilizar uma area de propagando me fala ok , abraço e obs tenho alguns projetos que posso estar disbonibilizando caso vc queira entre em contato ok

    1. Olá Liliano!
      Agradeço a sua disposição em ajudar, mas me contento com o seu comentário . Se tiver projetos que sejam utéis para outros colegas, serão bem recebidos.
      Cláudio

  5. olá claudio , aproveitando que você está usando display nos projetos , estava querendo monitorar 8 chaves ou sensores ( mostrando ON ou OFF )usando um display 2×16 com ” 4 páginas ” .

    por exemplo: botão1 em cima e botão2 embaixo e dos lados mostrando os estados ( ON ou OFF ) , ai aperta uma chave no circuito e passa para próxima página contendo botão3 em cima e botão4 embaixo e assim por diante . e com opção de ir trocando de página automaticamente .

    você pode fazer para mim ?? agradeço deste já .

    1. Olá michaelerdan, este esquema que vc necessita pode ser feito em uma tela só de display 16×2, sem ter a necessidade de ficar pulando entre as paginas, com a permissão ai do claudio.
      💡

      1. Olá Agnaldo! Obrigado pelo comentário. Fique a vontade para dar dicas e se desejar, enviar suas sugestões direto para o Michael ou por meio deste blog.
        Cláudio

Comments are closed.

Back To Top