Arne Basic 2k - Experiência 7 - Controle PWM 


A proposta

Nesta sétima experiência demonstrarei como  utilizar Arne Basic 2k no controle PWM. E como já é de costume, primeiro acho interessante mostrar um pouco da teoria para em seguida apresentar a parte prática.

A teoria

Um controle PWM permite variar a luminosidade de um LED, a velocidade de um motor DC e outros através da "variação do tempo em que a carga recebe potência total e o tempo que recebe potência zero", através de "pulsos" (veja a figura abaixo). O “tempo” destes pulsos determinará a quantidade de potência total transferida para a carga. Quanto maior for a duração de T1 e menor a duração de T2, maior será a potência e  quanto menor a duração de T1 e maior a duração de T2, menor será a potência. Vale salientar que os pulsos têm sempre o valor "ideal" máximo igual tensão máxima requerida pela na carga, proporcionando assim alto rendimento, mesmo em situações onde T2 é maior que T1.


Sendo assim, vemos que este método de controle é o ideal para aplicações onde se é necessário controlar o brilho de um (ou mais) LEDs, motores DC e outras cargas.


A experiência

Na figura abaixo você tem o esquema elétrico proposto para esta experiência. Como você mesmo pode ver, trata-se também de um circuito extremamente simples. Eu recomendo a montagem do mesmo em uma matriz de contatos, afinal você está apenas "testando" um circuito.


A chave S1 aumenta o tamanho do pulso T1 em relação a T2 no PWM e a chave S2 faz a operação inversa. Para esta experiência foi usado um LED na saída do controle PWM (OCR0A - PB2), porém você poderia utilizar um pequeno motor DC com seu respectivo drive (transistor). A freqüencia do PWM está intimamente ligada a freqüencia interna do microcontrolador que é de 10MHz e o prescale.  A equação abaixo mostra como proceder no calculo da mesma.

FPWM = 10MHz / valor do prescale x 256

O prescale do microcontrolador foi setado para 64. Para obter frequencias menores basta aumentar este valor ou ainda diminuí-lo, caso se queira um valor maior. O valor do prescale pode ser alterado de acordo com a tabela abaixo.

                                                 Tabela para prescale - bits 0 a 2 (CS00..CS02) em TCCR0B

CS02
CS01
CS00
Valor do prescale
0
0
0
0, timer0 desligado
0
0
1
10MHz / 1
0
1
0
10MHz /  8
0
1
1
10MHz / 64
1
0
0
10MHz / 256
1
0
1
10MHz / 1024

Você pode ver o código fonte logo abaixo. Este programa é mais um excelente exemplo da estrutura da Linguagem de programação BASIC utilizada pelo compilador BASCOM-AVR. Este exemplo mostra alguns recursos do compilador, além do básico da programação BASIC. Perceba que agora alguns registradores (os de controle do Timer0) foram configurados de forma direta, muito parecido como o que é feito em Linguagem C (e até Assembly). A descrição destes registradores pode ser encontrada dentro do arquivo "attiny2313.dat" presente no subdiretório de instalação do seu BASCOM (que pode ser utilizado para a abertura deste arquivo). Tome apenas muito cuidado para não alterar este arquivo!!! Se isso acontecer, seus programas não mais compilarão!!! Vamos em frente com nossas experiências!!! Como diria o sr. Miagui - "Daniel San!!! Seu karatê está melhorando, mas ainda falta muito para mudar faixa. Próxima é amarela né!" ehehehehe

Código:
'*******************************************************************************
'* Programa TESTE_PWM_ARNEBASIC2K.BAS
'* Desenvolvido por Márcio José Soares
'* para do Arne Basic 2k
'*
'* Obs.: Este programa foi desenvolvido para testar o uso de um motor DC
'* com o Arne Basic 2k. Veja o circuito em www.arnerobotics.com.br
'*
'* S1 aumenta velocidade
'* S2 diminui velocidade
'*
'* Atenção!!! Para ligar um motor ao Arne Basic 2k é necessário um drive de corrente!!!
'*******************************************************************************
 
'*******************************************************************************
'Configs necessários ao microcontrolador
$crystal = 10000000
$regfile = "attiny2313.dat"
Config Portb = &B11111111               'todo portB é saída
Config Portd = &B11101010               'todo portD é saída, exceto PD0, PD2 e PD4
 
'*******************************************************************************
'Configura timer0 para operar como PWM, modo 8 bits
'Modo de configuração - escrita direta nos registradores
'
'               TCCR0A
'------------------------------------------------------------------
'|   7    |   6    |    5   |    4   |   3  |  2  |   1   |   0   |
'| COM0A1 | COM0A0 | COM0B1 | COM0B0 |   -  |  -  | WGM01 | WGM00 |
'------------------------------------------------------------------
TCCR0A = &B10000011                     'timer0 em modo fast pwm, saída em OC0A (PB2)
 
'               TCCR0B
'------------------------------------------------------------------
'|   7    |   6    |  5  |  4  |   3   |    2   |    1   |    0   |
'|  FOC0A | FCO0B  |  -  |  -  | WGM02 |  CS02  |  CS01  |  CS00  |
'------------------------------------------------------------------
TCCR0B = &B10000011                     'clock interno, prescale = 64, comparação em OC0A ligada
 
TCNT0 = 0                               'valor inicial para timer 0
 
'********************************************************************************
'Variáveis globais
dim myPWM as Byte                       'var para guardar valor do PWM
 
'*******************************************************************************
'Liga pinos de I/O's a "nomes" mais fáceis ao entendimento humano ;-)
Motor Alias Portb.0                     'porta de controle do motor
S1 Alias Pind.2                         'pino de entrada para chave 1
S2 Alias Pind.4                         'pino de entrada para chave 2
 
'*******************************************************************************
'Declaração das subrotinas
Declare Sub Check_tec()
 
'*******************************************************************************
'Início do programa
Waitms 500                              'aguarda 0,5 segundo
 
myPWM = 0                               'configura var
OCR0A = myPWM                           'configura o valor do PWM para o timer 0
 
'*******************************************************************************
'Laço principal... faz eternamente
Do
 
   call Check_tec()                     'verifica teclas
 
Loop

'*******************************************************************************
'Subrotina para verificar se alguma tecla foi pressionada
'S1 aumenta PWM
'S2 diminui PWM
Sub Check_tec()
 
   waitms 30                            'debounce para chaves
   if S1 = 0 then                       'S1 pressionada?
      if myPWM < 255 then               'pwm dentro do limite? (8 bits)
         myPWM = myPWM + 5              'incrementa
         OCR0A = myPWM                  'transfere para comparação
      end if
   end if
 
   if S2 = 0 then                       'S2 pressionada
      if myPWM > 0 then                 'dentro do limite?
         myPWM = myPWM - 5              'decrementa
         OCR0A = myPWM                  'transfere
      end if
   end if
 
End sub
 
End                                     'fim do program


Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.