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. ❗ Olá claudio. eu estava pensando em uma forma de colocar este pwm no esquema que vc fez, NOVO RECEPTOR GENERICO COM PIC 16F628A ,para acionar a luz do lcd, ou seja, em repouso ficaria com 50% de luz para nao estragar o lcd com o passar do tempo, e quando recebece um tx ou for acionado qualquer tecla ficaria os 100% da luz do lcd, seria possivel??? 😐

      1. ❗ Olá Claudio, vc teria uma forma de gerar duas saidas de pwm por software. para ser usado em pic que não o tenha, estas saidas seria aumentado por botões, que no caso seria quatro, duas para cada saida, seria para usar na luz do display como comentei acima,obrigado ai pela atenção ok.

  2. eu imagino como é dificil ter tempo nem sei como vc consegue responder a muitos , mas tudo bem pro futuro , pois seja no seu tempo só foi uma sujestão ok , muito obrigado e vou fazer uma montagem ai te falo sobre o digito 8 , não precisa montar deixa comigo que te falo ok , abraço

  3. outra duvida , sobre comunicação i2c é possivel fazer uma sintonia de canal pelo i2c tipo um tuner de receptor de parabolica , um pic bem simples , um display de 2 digitos , mostrando o canal selecionado , sabendo que por exemplo a frequencia do canal da globo é de 1430 mhz , teria como colocar esta frequencia na memoria do pic e sintonizala no tuner atraves do i2c em que posso utilizar este tipo de comunicação pois ja vi aparelhos que usam componentes que são interligados atraves de apenas 2 fios e fazem muitas coisas , não vi nenhum projeto seu ainda usando i2c nem serial , até agora rrsrsr

  4. amigo e sobre o numero 8 que não aparece no display , seria no endereçamento dos seguementos ou no proteus mesmo mas acho dificil pois os outros numeros aparecem , outra sugestão um sequencial de vairos canais porem com ajuste de velocidade via potenciometro não sei se seria possivel ajustar o tempo de on e o tempo de off , me ajuda na parte do digito 8 , obrigado e otimo dia

    1. Olá Liliano! Tira uma dúvida? Você montou o circuito fisico no protoboard? Ou só rodou no Proteus? Eu sinceramente não percebi esta questão do n. 8 não aparecer. Terei que montar o circuito de novo no protoboard para analizar. Quanto a idéia de um sequencial, ou mesmo o uso de i2c, vai ficar para um futuro, pois não estou dispondo de muito tempo para me dedicar a projetos novos. Digamos que vai para o ‘caderninho de idéias’!
      Cláudio

  5. na parte dos sensores pode colocar 8 chaves tactil com terra ou 5 volts na entrada do pic( tanto faz ) , eu mesmo adaptarei a parte externa de acordo com as aplicações .

    no caso da paginação , seria interessante modificar no circuito mesmo, no caso poderia ter 2 botões de configurações , um botão com função de paginação automática ( definindo o tempo de parada em cada página no .asm )e não automática – e o outro botão com a função de passar a página uma de cada vez se estiver na opção não automática .

    o conteúdo escrito poderia ser alterado somente no .asm ( para o circuito não ficar muito complicado de mexer – e minimizando o arquivo .asm ).

    e a função de alarme iria ficar bem legal ( no caso de alertar algo errado nos equipamentos monitorados – não tinha pensado nisso , muito legal ) . poderia colocar essa função somente nos 2 últimos sensores ( no caso as 2 últimas chaves tactil ) .

    se quiser colocar outras funções , fique a vontade , rsrs .
    jé deu a idéia do alarme que gostei muito .

    um abraço .

    1. Olá Michael! Entendi a idéia. Mas no momento, não disponho de tempo para ‘bolar’ o programa e o hardware. Vai para o ‘caderninho’ de idéias, ok!
      Claudio

Comments are closed.

Back To Top