Translate, Traductor

viernes, 6 de julio de 2012

PWM con microcontrolador

Vamos a implementar el PWM (para que recuerden que es PWM en la Wikipedia) con un microcontrolador 16F886. la idea es usar el modulo de PWM que traen algunos Microcontroladores PIC.


Usaremos el pin RB2/CCP1 com salida donde tendremos el pulso de ancho variable.
Se usa un comparador que activa un bit cuando el valor del registro PR2 coincide con la parte alta del TMR2, en ese momento el TMR2 toma el valor 00, luego el bit se pone en cero cuando otro comparador detecta que la parte del TMR2 y el CCPR1H son iguales.

En PR2 se asigna el periodo   T = (PR2 + 1)*4*Tosc * Valor predivisor TMR2
En CCPR1L se carga el ancho del pulso, que luego pasa a CCPR1H

Analicemos:


MOVLW   B'00001101'
MOVWF        CCP1CON ; Modo PWM <3,2,1,0>, bit <5,4> en ceros
MOVLW    B'00000100' ; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz
                        ; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz
                        ; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz
MOVWF    T2CON ; Prescaler 16 <1,0> y activa el TMR2 <2>


Veamos el circuito:

Sencillo!!!

Ahora un video del circuito funcionando:



El codigo fuente:


LIST P=16F886
INCLUDE P16F886.INC

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF


CBLOCK 0X20
d1, d2
ENDC


ORG 00
GOTO INICIO

RET_100MS ;99998 cycles
movlw 0x1F
movwf d1
movlw 0x4F
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0

;2 cycles
goto $+1
RETURN

INICIO NOP
BANKSEL   OSCCON
      MOVLW B'01101100'
      MOVWF OSCCON
BANKSEL TRISA
CLRF TRISB
MOVLW B'00000000' ; Configuro RC2 como sailida
MOVWF PORTC
MOVLW .255
MOVWF PR2 ; Asigno el periodo
BANKSEL PORTB
MOVLW 0XFF
MOVWF PORTB
MOVLW B'00001101'
MOVWF CCP1CON ; Modo PWM <3,2,1,0>, bit <5,4> en ceros
MOVLW B'00000100' ; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz
; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz
; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz
MOVWF T2CON ; Prescaler 16 <1,0> y activa el TMR2 <2>
CLRF CCPR1L ; Duty en cero (0)


NUEVO MOVLW .0
MOVWF CCPR1L
CALL RET_100MS


CICLO NOP
MOVLW .10
ADDWF CCPR1L,F
CALL RET_100MS
MOVLW .250
XORWF CCPR1L,W
BTFSS STATUS,Z
GOTO CICLO
GOTO NUEVO

END



Copyright 2012  edwtron
       
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.
     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".  




No hay comentarios:

Publicar un comentario