Faltou CCP pro PWM! E agora?

Salve, galera! Estamos aê de pê novamente! Demorei mas trouxe coisa boa!
Se vocês se lembram da aula sobre o PWM, nós usamos o módulo CCP do PIC para gerar o PWM, algo relativamente fácil. Mas suponhamos que você queira controlar um LED RGB com o PIC16F628A. Um LED RGB necessita de três pinos de controle, mas o PIC fornece apenas um CCP. O que fazer? Varredura? OK, boa ideia, mas se o número de canais PWM necessários for grande ou se cada canal exigir um nível diferente de PWM? Ou exigir uma resolução maior que a do PIC? Veremos nessa aula como por quantos canais PWM quisermos em um PIC, "independente" do modelo.

PWM por software

Teoria da coisa 


Lembrando um pouco de teoria, PWM nada mais é que um tipo de controle onde geramos uma onda, de frequência constante, mas variamos o comprimento da onda. Normalmente usado para controlar a velocidade de um motor, brilho de um LED e etc. Como então gerar uma onda de frequência constante e de comprimento variável? Vamos lá!

Para este tipo de programa precisaremos envolver dois conceitos: o Timer do PIC e sua respectiva interrupção. O Timer gerará pulsos de frequência constante, aumentando o valor do registrador respectivo a cada pulso e, quando o registrador chegar ao seu valor máximo estourará, gerando uma interrupção: é ela que nos interessa!
Teremos duas variáveis na rotina do PWM: ciclo e período (o nome das variáveis não importa, pode ser qualquer um). Neste programa a coisa funcionará da seguinte maneira:

1: A cada interrupção a variável período será incrementada (+1);
2: A variável ciclo conterá o valor do PWM;
3: Agora só nos basta comparar as duas: Se período < ciclo então o pino do PWM fica em LOW (0 lógico); senão o pino do PWM fica em HIGH.

Simples não? Como ficaria isso na linguagem do programa? Mais simples ainda:

IF periodo < ciclo THEN 
 PORTA.0=0
ELSE 
 PORTA.0=1
END IF

Tão simples quanto não? Atente apenas que o pino irá a 1 se o período for IGUAL OU MAIOR que o ciclo, e não apenas se for maior.

Mas e como vou saber a frequência do meu PWM? Eu, como um blogger muito legal, deduzi a fórmula pra vocês, ou seja, é pegar e usar! E aqui vai ela:


Onde:
Fpwm é a frequência do PWM em Hertz;
Fosc é a frequência de oscilação do PIC em Hertz;
Resolução é quantos passos terá o PWM;
TMRx é o Timer usado (depende de PIC para PIC).

Se por acaso for configurado um Preescaler pro Timer, basta multiplicar a fórmula por 1/Valor do Preescaler.

Percebe que na primeira temos 256-TMRx e na segunda, 65535-TMRx. Por quê? Pois a primeira fórmula é para Timers configurados em 8 bits e a segunda se ele for configurado em 16 bits. Como no exemplo a seguir usaremos o TMR0 e este apenas opera em 8 bits no PIC16F628A, nossa cobaia, então a fórmula aplicável será a primeira.
A resolução é o seguinte: se a variável Ciclo, que contém o valor do PWM, for configurada como Byte, ela terá apenas 256 valores possíveis, se for Word, 65535; se for longint vai ser maior ainda e por ai vai. Perceba que, quanto maior a resolução, menor a frequência e vice-versa.

Mãos à obra

 Vou passar agora um pequeno exemplo de um código, para o PIC16F628A, que controlará um LED RGB através do PORTB. Perceba que a rotina de interrupção será basicamente padrão para qualquer PIC.


Veja que para gerar PWM nos outros pinos basta criar outras variáveis para cada pino e um novo IF para cada pino. Limite? o número de pinos de E/S do PIC :D
Creio que o código é simples para todos que acompanharam as aulas posteriores, mas ressalto que qualquer dúvida é só perguntar nos comentários.
Circuito? Bem, a unica novidade é que dessa vez precisamos de um oscilador de cristal de 20MHz ligados nos pinos RA6 e RA7 naquele velho esquema conhecido, com os dois capacitores. O LED RGB será ligado nos pinos RB1, 2 e 3, lembrando dos resistores.

É isso pessoal. Chegou hoje um componente muito legal aqui e se der farei mais uma aula falando sobre ele. É um sensor :D
Abração galera e até a próxima.

Comentários

  1. Olá, me chamo Leon. Gostaria de parabeniza-lo pelo excelente trabalho que está realizando, estou até seguindo. Recentemente criei um blog sobre eletrônica também, da uma visitada lá: http://eletronselacunas.blogspot.com.br/
    Abraços e parabéns mais uma vez!

    ResponderExcluir
    Respostas
    1. Olá Leon, como vai? Amigão, sabe me informar qual compilador foi usado para este programa? Desde já muito obrigado!

      Excluir
    2. Olá. Sou o dono deste blog. O compilador é o mesmo desde o início: MikroBasic Pro for PIC

      Excluir
  2. Muito interessante esse vídeo. A eletrônica é algo infinito. www.cacereletronica.com.br

    ResponderExcluir
  3. Olá amigo! Parabéns pela iniciativa! Estou desenvolvendo um projeto em que 6 led, e a intensidade de cada um varia de acordo com um tempo, 1º led aumenta, diminui e apaga, até o ultimo! Vou tentar adaptar seu programa, esse programa roda em PIC C Compiler? Desde já muito obrigado!!!

    ResponderExcluir
  4. Se eu quiser criar um pwm senoidal com uma tabela, como proceder?

    ResponderExcluir
    Respostas
    1. Você pode usar a função seno ou cosseno ao invés de uma tabela. Vai envolver um pouco de matemática mas é a melhor aproximação. Se tiver com memória sobrando no seu microcontrolador, beleza, tabela será melhor por poupar esforços do processador.
      Essa página poderá lhe ser útil em relação à criar e usar a tabela. Uso ela a bastante tempo. Você só terá que ajustar os valores pra escala senoidal.
      https://learn.adafruit.com/led-tricks-gamma-correction/the-quick-fix

      Excluir

Postar um comentário