MICROCONTROLADORES PIC – PRÁTICA - PARTE 1
CONTROLE PWM COM PIC



PWM POR SOFTWARE COM PIC16F84

Este exemplo prático mostra a construção de circuito para controle PWM (Pulse Width Modulation), utilizando um PIC16F84 com manipulação dos pulsos via software.

Um controle PWM permite variar a velocidade de um motor DC, por exemplo, através de pulsos. O “tempo” deste pulso determinará a velocidade do motor. Quanto maior for a duração de T1 e menor a duração de T2, maior será a velocidade. Quanto menor a duração de T1 e maior a duração de T2, menor será a velocidade. Vale salientar que os pulsos têm sempre o valor máximo da tensão aplicada (menos as quedas no circuito), proporcionando assim alto torque, mesmo em baixas velocidades. Veja a figura abaixo.


Sendo assim, vemos que este método de controle é o ideal para aplicações de motores CC para a tração de pequenos robôs, braços mecânicos e outros tipos de automatismos.


CIRCUITO PRÁTICO


O circuito da figura acima poderá ser montado em um pront-o-board , placa padrão ou outro método que achar melhor. A idéia deste circuito é ser apenas um teste. Não preciso dizer que após a montagem do mesmo, seja qual for ela, você deve rever atentamente todas as ligações, evitando assim danos aos componentes, principalmente ao PIC, caso algo tenha sido ligado erro. No mundo "real" as coisas queimam!. Se você é adepto dos simuladores não tem muito com o que se preocupar, a não ser com o que esta perdendo: "o prazer inestimável de ter feito uma montagem e vê-la funcionando!!!". O transistor pode esquentar um pouco, dependendo do motor utilizado. O uso de um radiador de calor pode ajudar.

Os botões BT1 e BT2 permitem o controle da velocidade. Ao se pressionar BT1 o motor aumentará de velocidade até seu limite máximo. BT2 permite reduzir esta velocidade. Os tempos mínimos e máximos para T1 e T2 neste circuito PWM estão entre 10ms a 70ms, aproximadamente.

A alimentação para o circuito deve ser separada. O microcontrolador precisa de 5 volts. Para o motor, a alimentação deve estar de acordo com o tipo utilizado. Lembrando que um circuito PWM podem gerar interferências muito fortes e os microcontroladores são sensíveis a estas interferências. Separar a alimentação ajudará a impedir os efeitos destas interferências.


O PROGRAMA

O programa foi desenvolvido utilizando a Linguagem Assembly Microchip e compilado no MPASM Microchip (http://www.microchip.com). Para grava-lo você poderá utilizar o projeto do gravador PROGPICII, presente neste site ou qualquer outro que você disponha, desde que para microcontroladores PIC. Através do set de instruções detalhado na segunda parte da teoria também oferecida neste site, você poderá estudar e compreender melhor o funcionamento do programa. O código fonte foi ricamente comentado, para demonstrar o seu funcionamento. Eu não vou "pegar na sua mão" para guiá-lo. Estudar é preciso e o "caminho das pedras" já foi dado!

Código fonte – PWM_CTRL.ASM

;**************************************************************
;* Controle PWM para motores DC
;*
;* Marcio Jose Soares - 01/10/2002
;**************************************************************
 
;
;**************************************************************
;definições do programa
;**************************************************************
 
    radix dec        ;padrao->valores decimal
    include <P16F84A.INC>    ;inclue arquivo
 
    __CONFIG _CP_OFF & _PWRTE_OFF &  _WDT_OFF & _XT_OSC  ;configura bits
 
PICRES       equ   0x00    ;endereço de reset
PICINT        equ   0x04    ;endereço de interrupções
PICRAM      equ   0x0C    ;endereço da RAM
MOTOR      equ    0          ;i/o do motor
CHV1         equ    1          ;i/o da chave para aumentar a velocidade do motor
CHV2         equ    2          ;i/o da chave para diminuir a velocidade do motor
LED            equ    3          ;i/o do LED
MAX           equ    0x59    ;valor máximo para PWM
MIN            equ    0X0C    ;valor mínimo para PWM
 
 
;
;**************************************************************
;variaveis do programa
;**************************************************************
 
 
    org PICRAM
 
T1           res    1    ;variável para tempo
T2           res    1    ;variável para tempo
_TMAX    res    1    ;variável para trabalhar tempo máximo
_TMIN     res    1    ;variável para trabalhar tempo mínimo
 
;
;**************************************************************
;area do reset
;**************************************************************
 
        org     PICRES          ;reset
        goto    inicio          ;desvia do endereco 0x04 - interrupção
 
;
;**************************************************************
;area das interrupções
;**************************************************************
 
        org     PICINT          ;toda interrupção aponta para este endereço
 
        retfie                      ;retorno de interrupção
 
;
;**************************************************************
;inicio do programa
;**************************************************************
inicio:
 
        movlw   0x00               ;ajuste para os bits INTCON
        movwf   INTCON          ;desabilita ints
        
        clrf    PORTA                 ;limpa portas
        clrf    PORTB
 
        bsf     STATUS,RP0       ;seleciona banco 1 para options e tris
 
        movlw   0x06               ;ajusta os bits em A como saída
        movwf   TRISA             ;exceto RA1 e RA2, entrada para chave
 
        movlw   0x00               ;ajusta os bits em B como saída
        movwf   TRISB             ;não usados
 
        bcf     STATUS,RP0       ;volta ao banco 0... (padrão do reset)
 
        movlw    MAX               ;move valor para _TMAX ->70ms
        movwf    _TMAX
 
         movlw    MIN               ;move valor para _TMIN ->10ms
         movwf    _TMIN
 
;
;**************************************************************
;loop principalo do programa
;**************************************************************
 
loop:
    call    TECLA                     ;verifica Tecla
 
PWM:
    bsf    PORTA,MOTOR        ;liga pulso
    call    TMIN                       ;aguarda     
    bcf    PORTA,MOTOR        ;desliga pulso
    call    TMAX                      ;aguarda
    goto     loop
 
;
;**************************************************************
;subrotina para testar tecla
;**************************************************************
 
TECLA:
 
    nop                                     ;perde 3 ciclos
    nop
    nop
 
    btfss    PORTA,CHV2          ;testa chave 2
    goto    TC2                          ;pressionada
 
    nop                                      ;perde 3 ciclos
    nop
    nop
     
    btfss    PORTA,CHV1          ;testa chave 1
    goto    TC1                          ;pressionada
 
    goto    TC3                           ;nenhuma chave pressionada
 
;
;**************************************************************
;subrotina para incrementar velocidade
;**************************************************************
 
TC1:
    nop                ;perde 3 ciclos
    nop                ;
    nop
 
    movf    _TMIN,W            ;carrega com valor mínimo atual
    andlw    0xFF                 ;faz and com W
    xorlw    MAX                  ;faz xor com W, se = , bit Z em STATUS = 1
 
    btfss    STATUS,Z          ;testa resultado, zero valor mínimo = máximo
    goto    TC1_1                 ;incrementa velocidade
    bsf    PORTA,LED           ;velocidade no máximo, não incrementa mais
    goto    TC3                     ;e liga led
 
TC1_1:
    incf    _TMIN,F               ;incrementa registro
    decf    _TMAX,F             ;decrementa registro
    goto    TC3                     ;volta
 
;**************************************************************
;subrotina para decrementar velocidade
;**************************************************************
 
TC2:
    nop                ;perde 3 ciclos
    nop
    nop
     
    movf    _TMIN,W            ;carrega com valor mínimo atual
    andlw    0xFF                  ;faz and com W
    xorlw    MIN                    ;faz xor com W, se = , bit Z em STATUS = 1 
 
    btfss    STATUS,Z           ;testa se resultado zero             
    goto    TC2_1                  ;decrementa velocidade
    goto    TC3                      ;velocidade no mínimo, não decrementa mais
 
TC2_1:
    decf    _TMIN,F            ;incrementa registro
    incf    _TMAX,F            ;decrementa registro
    bcf    PORTA,LED        ;desliga led
 
TC3:
    bcf    STATUS,Z        ;garante bit Z como 0
    return                       ;retorna
 
         
 
;
;**************************************************************
;subrotina para temporização do PWM
;**************************************************************
 
TMIN:
    movf    _TMIN,W      ;carrega W com _TMIN
    movwf    T1              ;carrega T1 com W
    goto car_1                ;inicia temporização
 
TMAX:
    movf    _TMAX,W      ;carrega W com _TMAX
    movwf    T1              ;carrega T1 com W
    goto    car_1             ;inicia temporização
 
;
;**************************************************************
;subrotina para temporização do PWM
;**************************************************************
 
 
car_1:
    movlw   0xff           ;carrega W com 255
    movwf    T2            ;carrega T2 com 255
dec_1:
    decfsz     T2,1         ;decrementa T2
    goto       dec_1        ;255 x T1 vezes
    decfsz     T1,1         ;decrementa T1
    goto     car_1           ;volta a carregar T2
    retlw    0x00            ;retorna
 
;
;**************************************************************
;fim do programa
;**************************************************************
 
    end               


CONCLUSÃO

O microcontrolador PIC16F84 apesar de “pequeno” demonstra grandes possibilidades. O controle de cargas com PWM é só uma delas. Muito se pode conseguir fazer com um microcontrolador PIC. Tudo depende apenas da sua criatividade e força de vontade.


Material para o circuito PWM

Semicondutores

1 – PIC16F84A/4MHz – microcontrolador
1 – TIP112A – transistor NPN darlington
1 – 1N4001 – diodo retificador
1 – Led comum

Resistores (1/8 Watt, 5%)

1 – 10K – Marrom, preto e laranja
2 – 330R – Laranja, laranja e marron
2 – 4K7 – Amarelo, violeta e vermelho


Capacitores

1 – 100nF – cerâmico
2 – 33pF – cerâmico


Diversos

3 - chaves “push-botton”
1 – crystal 4MHz
1 – motor DC 3 a 6V
2 – suportes para 4 pilhas pequenas

Pront-o-board ou placa padrão para a montagem, fios para ligação, etc




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.