sexta-feira, 24 de agosto de 2012

Curso de MCU: PWM e variáveis

PWM: Pulse Width Modulation. O que seria isso? O PWM baseia-se na modulação da largura de um pulso. Nesta aula vou ensinar a usar o PWM.

1.O programa
 Vou dispensar explicações mais detalhadas sobre o que é o PWM (pois no google tem muita coisa sobre isso!): vou me ater mais a ensinar vocês a usarem o PWM junto ao PIC. Nesse curso, usaremos o PWM para variar o brilho de um LED, mas o PWM pode ser usado para controlar a velocidade de um motor, brilho de uma lâmpada, controle de ventoinhas (Fans) com suporte à PWM. 
O PWM é gerado no PIC pelo módulo CCP (Capture, Compare and PWM), sendo que no caso do PIC16F876A possua dois módulos, o CCP1 e CCP2.

O MikroBasic possui uma biblioteca específica para o PWM, o que facilita muito o uso deste recurso. Para cada PIC a biblioteca irá mudar: tem PICs com um canal PWM, com dois ou mais (ou nenhum!). Vou explicar o uso para nosso PIC (16F876A), mas qualquer dúvida é so perguntar. O código desta vez fica:


Coloquei este código em imagem para forçar vocês a escreverem o código: acreditem, isto é útil!

ATENÇÃO! EXISTEM DOIS ERROS NO PROGRAMA ACIMA!
Preste atenção: logo após "Program PWM", na linha seguinte escreva "dim pwm, h as byte"!!! E após "main:" escreva "pwm=0"! Sem isso o programa não compilará/funcionará!

A biblioteca se baseia basicamente em 5 códigos:

PWMx_Init(frequência em Hz): x é o número do canal CCP que será usado, no nosso caso, o CCP1. Em PICs com um módulo só, como o 16F628A, não será colocado o número do módulo.
PWMx_Start(): inicializa o módulo. os parênteses  são obrigatórios!!! Errei na imagem!
PWMx_Set_Duty(valor): Altera o valor do PWM. vai de 0 á 255. Para calcular a porcentagem, use a fórmula: (porcentagem*255)/100
PWMx_Stop: para o módulo.

Analisando o código:

-na primeira linah temos a declaração do nome do programa;

-A seguir vem algo novo: o sub procedure. Usamos esse comando para criar um sub procedimento, ou seja, uma sequência de comandos que será repitida no programa. Usando esse cmando, economizamos memória e organizamos/otimizamos o programa. Deve ser usado da forma:

sub procedure 'abre o procedimento
...
[comandos]
...
end sub 'fim do procedimento

lembrando que o que vem depois das aspas (')será apenas comentários, sem função lógica no programa;

-Depois segue o for h=0 to 254. Esse comando é usado para repitir um comando por n vezes. É da forma:

for x=y to z
...
[comando]
...
next x

Onde x é uma variável qualquer declarada anteriormente, y é o valor inicial e z o valor final. Ou seja, se vc declarar y como 1 e z como 5, os comandos serão repitidos 5 vezes;

-Seguindo vem o Dec(pwm). o Dec é usado para subtrair uma unidade da variável dentro dos parênteses;

-Então com o comando que já expliquei defino o valor do PWM sendo o da variável;

-Declaro uma pausa de 10 ms;

-Segue  que já expliquei, e então começa o main: que define o prgrama principal;

-TRISC=$00 declara o PORTC todo como saída;

-Sobre o PWM já expliquei e por fim;

-Começo um loop eterno com o WHILE TRUE, chamo a rotina fadeout, dou uma pausa de 0,2 segundos, chamo a rotina fadein e fecho o loop com o wend e fecho o programa com o end.

2.Circuito

Não têm mistérios: é o de sempre.
 
3. Variáveis

Existem 10 tipos de variáveis, conforme a tabela abaixo:


Em type temos o nome da variável, em size o tamanho e em Range os valores máximos e mínimos de cada tipo. Por exemplo: o short possui 8 bits e vai de -127 até 128, o bit tem 1 bit e assume 0 ou 1.
Quando se quer declarar uma variável no MB, digitamos:

 dim nome da variável as tipo da variável

Por exemplo: quero uma variável chamada "tensao", do tipo word. Para declará-la digito:

dim tensao as word

Caso o nome da variável fique em negrito, escolha outro, pois essa o programa já usa!!! Se algo der errado, o MB lhe levará até o problema (a linha da variável) e lhe dirá o que está errado.
Caso você vá usar uma variável que deverá ser incrementada/decrementada (como o pwm no nosso exemplo de hoje), declare algum valor para ela antes de incrementar ou decrementar, pois se ela não tem valor o programa não saberá quanto ela vale para ele aumentar ou diminuir seu valor.
O que acontece se eu chegar no valor máximo de uma variável e der o comando Inc???
Ela vai ao seu valor mínimo! E vice-versa para se tiver no valor mínimo e der o comando Dec: ela irá para o valor máximo!

Essa aula fica por aqui pessoal. Próximas aulas teremos como ler o ADC, Timers, INTs(se der certo), comandos internos do PIC, EEPROM, Teclados PS/2, Comunicação serial, como fazer sons e outras coisas que aparecerem! Tem muita coisa boa vindo galera! Mas deem opniões, dicas, sugestões ou comentem ai pra eu não ficar forever alone aqui!

Valeu pessoal e até a próxima!

2 comentários:

  1. Tenho curso de eletrônica(das antigas),e por mim tipo autodidata procuro aprender,mas as vzs complica um pouco,mas não desisto,já sou meio tipo
    terceira idade (57 anos).E gostaria de se vcs puderem colaborar com alguma dúvida que eu tenha.Uma que tenho é me confundir por onde começar a coordenar
    pwm em mikroc pro pic em linguagem c :como calcular,uso pratico,e escrever no programa em c.Não sei se fui claro,mas fico grato se alguém puder ter paçiencia e me ajudar.Desde já obrigado e FELIZ NATAL GALERA..JOSUE

    ResponderExcluir
  2. O menu de ajuda do MikroC possui exemplo de cada biblioteca. Procure a do PWM e veja como ele faz. Se for usar o PWM através da biblioteca do MikroC não terá que fazer conta alguma. Se não entender, avise que tentarei explicar.
    Feliz natal,
    Stephen (autor do blog)

    ResponderExcluir