Ir ao conteúdo
  • Cadastre-se

PWM ajustavel


Posts recomendados

Eu estou fazendo um projeto de conclusão de curso e preciso de uma ajuda urgente! Estou fazendo um pwm ajustavel no pic 16f877a,ele ajusta o duty cicle atraves de 2 botões,eu executei ele no proteus eu funciono perfeitamente mas quando passo pro projeto fisico acontece 2 problemas: o primeiro é q quando eu aperto e seguro o botao de incrementar ele dispara e o outro é q quando eu aperto o botao de decrementar ele vai direto pro valor minimo ! Por favor me ajudem!

Ai o programa em assembly! Eu uso o MBLAB v8.91 pra copilar

 

;*****************************************************
;*                   PWM VARIABLE                    *
;*   VERSÃO 2.0                    DATA;14/11/2014   *
;*                        *
;*****************************************************
 
;*****************************************************
;*                  DESCRIÇÃO GERAL                  *
;*****************************************************
; ESTE PROGRAMA ESTA PREPARADO PARA CRIAR UM PWM E
; LER 2 botões PARA VARIAR ESTE PWM UM PARA AUMENTAR
; E OUTRO PARA DIMINUIR O DUTY CICLE DO MESMO.
; PERIODO(PWM)->(PR2+1)*4*Tosc*PRESCALER(TMR2)
;               (61+1) * 4 * 100ns * 4
;                       96us~=10Khz
; DUTY CICLE(PWN)->[CCPR;CCP1CON<5;4>]*Tosc*PRESCALER(TMR2)
;             MAX->[240] * 100ns * 4 = 96us   __ 100%
;             MIN->[12]  * 100ns * 4 = 4.8us  __ 5%
;*****************************************************
;*            CONFIGURAÇÕES PARA A GRAVAÇÃO          *
;*****************************************************
 
 
;*****************************************************
;*     DEFINIÇÕES DAS VARIAVEIS INTERNAS DO PIC      *
;*****************************************************
 
#INCLUDE <P16F877A.INC>
__CONFIG  _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC;
 
;*****************************************************
;*        DEFINIÇÃO DOS BANCOS DE MEMORIA            *
;*****************************************************
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
 
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA
 
;*****************************************************
;*              DEFINIÇÃO DE VARIAVEIS               *
;*****************************************************
 
CBLOCK 0X20
FILTRO
ENDC
 
;*****************************************************
;*                  FLAGS INTERNOS                   *
;*****************************************************
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
 
;*****************************************************
;*              DEFINIÇÃO DE CONSTANTES              *
;*****************************************************
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
MIN         EQU     .3   ;MINIMO DUTY CICLE (0,05)
MAX         EQU     .60  ;MAXIMO DUTY CICLE   (1)
T_FILTRO    EQU     .250 ;TEMPO DO FILTRA BOTAO
;*****************************************************
;*                      ENTRADAS                     *
;*****************************************************
 
#DEFINE BTAUMENTA   PORTB,1 ;AUMENTA O PWM
                            ;1->PRESSIONADO
                            ;0->LIBERADO
#DEFINE BTDIMINUI   PORTB,2 ;DIMINUI O PWM
                            ;1->PRESSIONADO
                            ;0->LIBERADO
 
;*****************************************************
;*                      SAIDAS                       *
;*****************************************************
 
;*****************************************************
;*                   VETOR RESET                     *
;*****************************************************
 
ORG 0x0000 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO
 
;*****************************************************
;*               INICIO DA INTERRUPÇÃO               *
;*****************************************************
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS
 
ORG 0x0004 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
RETFIE ;RETORNA DA INTERRUPÇÃO
 
;*****************************************************
;*                 INCIO DO PROGRAMA                 *
;*****************************************************
INICIO
    BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000000' ;PORTA TODOS I/O SAIDAS
MOVWF TRISA
    MOVLW B'00000110' ;PORTB<2:1> DEFINIDOS COMO
MOVWF TRISB       ;ENTRADA (BTAUMENTA E BTDIMINUI)
    MOVLW B'00000000' ;PORTC TODOS I/O SAIDAS
MOVWF TRISC       ;PORTC<2> = CCP1 |SAIDA PWM
    MOVLW B'00000000' ;PORTD TODOS I/O SAIDAS
MOVWF TRISD
    MOVLW B'00000000' ;PORTE TODOS I/O SAIDAS
MOVWF TRISE
    MOVLW B'10000111' ;opções
MOVWF OPTION_REG  ;DESABILITA PULL-UPs
                        ;TMR0 PRESCALER = 1:256
    MOVLW B'00000000' ;DESABILITA TODAS AS INTER.
MOVWF INTCON
    MOVLW B'00000000' ;DESABILITA AS INTER. DE TMR1E2
MOVWF PIE1
    MOVLW B'00000111' ;DESABILITA OS COMPARADORES
MOVWF CMCON
    MOVLW .61         ;COLOCA O VALOR 61 NO PR2
MOVWF PR2         ;O QUE RESULTA NUM PERIODO DE
                        ;100us E UMA FREQUENCIA DE 10kHz
    BANK0
    MOVLW B'00001100' ;ATIVA O PWM E OS COLOCA OS
                        ;BITS MENOS SIGNIFICATIVOS
                        ;EM 0.
MOVWF CCP1CON
    MOVLW B'00000101' ;ATIVA O TMR2 E REGULA O
                        ;PRESCALER = 4
MOVWF T2CON
    MOVLW .30         ;COLOCA O VALOR 31 NO CCPR1L
                        ;RESULTANDO NUM DUTYCICLE DE 0,5
MOVWF CCPR1L      ;CCP1RL INCIA NA METADE
 
;*****************************************************
;*           INCIALIZAÇÃO DAS VARIAVEIS              *
;*****************************************************
    CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
    CLRF PORTC ;LIMPA O PORTC
CLRF PORTD ;LIMPA O PORTD
CLRF PORTE ;LIMPA O PORTE
;*****************************************************
;*                ROTINA PRINCIPAL                   *
;*****************************************************
 
MAIN
MOVLW T_FILTRO
MOVWF FILTRO ;INICIALIZA FILTRO = T_FILTRO
 
CHECABTA
BTFSS BTAUMENTA ;O BOTÃO ESTÁ PRESSIONADO?
GOTO CHECA ;NÃO, ENTÃO CONTINUA ESPERANDO
                        ;SIM
DECFSZ FILTRO,F ;DECREMENTA O FILTRO DO BOTÃO
                        ;TERMINOU?
GOTO CHECABTA ;NÃO, CONTINUA ESPERANDO
                        ;SIM
TESTABTA
;AUMENTAR O DUTYCICLE ?
    BTFSS   BTAUMENTA   ;BT PRESCIONADO?
    GOTO    CHECA       ;NAO, TESTA OUTRO BT
    GOTO    AUMENTA     ;SIM, AUMENTA DC
CHECA
MOVLW T_FILTRO
MOVWF FILTRO ;INICIALIZA FILTRO = T_FILTRO
 
CHECABTD
BTFSS BTDIMINUI ;O BOTÃO ESTÁ PRESSIONADO?
GOTO MAIN ;NÃO, ENTÃO CONTINUA ESPERANDO
;SIM
DECFSZ FILTRO,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECABTD ;NÃO, CONTINUA ESPERANDO
;SIM
TESTABTD
;DIMINUIR O DUTYCICLE ?
    BTFSS   BTDIMINUI   ;BT PRESCIONADO?
    GOTO    MAIN        ;NÃO, TESTA OUTRO BT
    GOTO    DIMINUI     ;SIM, DIMINUI DC
 
AUMENTA
;AUMENTA DUTYCICLE
    INCF    CCPR1L  ;INCREMENTA O CCPR1L AUMENTANDO O
                    ;VALOR EM 4 E AUMENTANDO O DC EM
                    ;0,016
    MOVLW   MAX
    SUBWF   CCPR1L,W    ;MAXIMO VALOR DE DC?
    BTFSS STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO CONTINUAA ;SIM, ENTÃO CONTA < MAX
;NÃO, ENTÃO CONTA >= MAX
    MOVLW MAX
MOVWF CCPR1L    ;ACERTA CONTADOR NO MÁXIMO, POIS
                        ;PASSOU DO VALOR
CONTINUAA
;TRAVA BT SE CONTINUA APERTADO
    BTFSS   BTAUMENTA   ;BT CONTINUA APERTADO?
    GOTO    MAIN        ;NAO,VOLTA PRO LOOP PRINCIPAL
    GOTO    $-2         ;SIM, TRAVA NO LOOP CONTINUA
 
DIMINUI
;DIMINUI DUTYCICLE
    DECF    CCPR1L  ;DIMINUI O CCPR1L DIMINUINDO O
                    ;VALOR EM 4 E DIMINUINDO O DC EM
                    ;0,016
    MOVLW   MIN
    SUBWF   CCPR1L,W    ;MINIMO VALOR DE DC?
    BTFSC STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO CONTINUAD ;NAO, ENTÃO CONTA >= MIN
;SIM, ENTÃO CONTA < MIN
    MOVLW MIN
MOVWF CCPR1L    ;ACERTA CONTADOR NO MINIMO, POIS
                        ;PASSOU DO VALOR
CONTINUAD
;TRAVA BT SE CONTINUA APERTADO
    BTFSS   BTDIMINUI   ;BT CONTINUA APERTADO?
    GOTO    MAIN        ;NAO,VOLTA PRO LOOP PRINCIPAL
    GOTO    $-2         ;SIM, TRAVA NO LOOP CONTINUA
;*****************************************************
;*                FIM DO PROGRAMA                    *
;*****************************************************
END ;FIM
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

asm pra mim também não vai rolar muito. Uma coisa que você precisa ver é que quando apertar um botão, é bom esperar soltar. Em c

if (!RB0) {aumetapwm(); delay(xxx); while(!RB0);}//o delay é um anti debounce meia boca

outra coisa a ser vista. Ignorar o repique do botão. o tal de debounce. entrada smitch trigger + capacitor e/ou alguma técnica no sw tipo o delay

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...