Autor Tema: Control PWM por medio de ADC  (Leído 3272 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Luja

  • PIC10
  • *
  • Mensajes: 2
Control PWM por medio de ADC
« en: 14 de Junio de 2009, 00:35:49 »
Hola a todos:
soy nuevo  en este foro :mrgreen: y estoy realizando un control de un motor DC por medio de un 16F88 , el control lo realizo por medio de un potenciometro el cual esta conectado a AN4, necesito que el por medio del potenciometro se le de la direccion y velocidad al motor, haciendo que en un extremo la velocidad sea maxima y la direccion hacia un lado, en el centro la velocidad sea minima o cero y se haga el cambio de direccion, y en el otro extremo velocidad maxima y el sentido contrario.

Estoy cargando el valor de la conversion ADC directamente en CCPR1L, y se que la conversion no es muy estable, es por eso que puse un filtro RC de 10ms a AN4,
y hasta intente con un filtro por software, pero aun asi mi progama hace que el valor del PWM no sea estable y aveces hasta como que se pierde el programa, el PWM
llega hasta cero cuando no debe o cambia de direccion repentinamente, no se si esto se debe a mi programacion, que me falte o sobre alguna instruccion, o si sea que utilizo el oscilador interno, o algo que no se me ocurra.

gracias por su ayuda.

Código: [Seleccionar]
;----------------Programa No.6
;----------------Control de un motor por medio de un Potenciometro

;RB3  CCPMX=0
;RB0  CCPMX=1


list p=16F88 ;indica el modelo de PIC que se usa
#include <p16F88.inc> ;Es una directiva de ensamblador
;Definicion de registros del microcontrolador

__CONFIG    _CONFIG1, _CCP1_RB0 & _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO

__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

;---------------Definición de Variables------------------------------------
 CBLOCK 0x020
DELH ;Variables contador
DELL ;para subrutina de retraso
CONTADOR ;Variable para reiniciar TMR0
ADCVALUE ;Guarda al dato de la conversion
 ENDC

;---------------------------------------------------------------------------

ORG 0x00 ; vector de reset
goto MAIN ; salta al inicio del programa

ORG 0x04 ; vector de interrupcion
goto INT


;---------------INICIALIZACION---------------------------------------------
ORG 0x05
MAIN:
bsf STATUS,RP0 ; Selecciona banco 1
movlw 0x00 ; Programa el puerto B
movwf TRISB ; como salidas
movlw b'00010000' ; Programa el puerto A
movwf TRISA ; como salidas,excepto AN4
movlw 0x07 ; Programa las opciones de preescalador
movwf OPTION_REG ; Preescalador de 256
movlw 0x80
movwf INTCON ;Global interrupt enable

ADC_INI: ;Inicializacion del ADC
banksel ANSEL
movlw 0x10 ;Selecciona la entrada analogica AN4
movwf ANSEL
movlw 0x00 ;Seleccion de voltajes de referencia
movwf ADCON1
banksel ADCON0

movlw b'11100001'
movwf ADCON0
;bcf ADCON0,CHS0;3 ;Analog Channel AN 4
;bcf ADCON0,CHS1;4 '100'
;bsf ADCON0,CHS2;5
;bsf ADCON0,ADCS0;6 ;Conversion Clock
;bsf ADCON0,ADCS1;7 ;internal rc osc
;bsf ADCON0,ADON;0 ;ADON


PWM_INI: ;Inicializacion PWM
clrf TMR2
banksel PR2 ;TIMER 2
movlw 0xf9 ;Timer period register= 100 microseg
movwf PR2 ;Frecuencia de 4 KHz
banksel CCPR1L
movlw 0x00 ;PWM DUTY CYCLE sin movimiento
movwf CCPR1L
movlw b'00000100' ;Timer On
movwf T2CON
movlw b'00001100'
movwf CCP1CON ;Mode select PWM


;---------------------------------------------------------------------------

INICIO1:
banksel PORTA
movlw 0xff ;Retardo del TMR0
;0x16 Retardo de 60 ms presc 256
;0x7f Retardo de 33 ms presc 256
;0xff Retardo de 256 us presc 256
movwf CONTADOR
movwf TMR0
bsf INTCON,5 ;Activa interrupcion
bsf PORTB,3 ;L293 Chip Enable

INICIO:
nop
DELAY:  movfw  CONTADOR ; Subrutina de  retrazo
    movwf DELH ;
DEL2: movlw 0xff ;
movwf DELL
DEL1: decfsz  DELL,f
  goto DEL1
    decfsz  DELH,f
    goto    DEL2
    goto INICIO ;se active


;----------------------------------------------------------------------


INT:
btfsc INTCON,TMR0IF;2 ; Checa las banderas de interrupcion
goto TIMER
goto INT2

TIMER:
bsf ADCON0,GO ;Enciende el ADC
btfsc ADCON0,GO ;Espera a que termine la conversion
goto $ - 1

movfw ADRESH

movwf ADCVALUE
bcf STATUS,C
movlw 0x80 ;Determina si el sentido del motor
;Menor que 0x80 va en reversa
subwf ADCVALUE,w
btfss STATUS,C
goto REVERSE


FORWARD:
movwf ADCVALUE ;Carga el nuevo valor del ADC
movwf CCPR1L ;Carga ese valor como DUTY CICLE del PWM
bcf STATUS,C ;registro despues de la resta
bsf PORTB,6 ;Prende el LED que muestra el sentido

bsf PORTB,4 ;Pines que determinan la direccion del motor
bcf PORTB,5
goto END_TMR0

REVERSE:
movlw 0x7f ;Invierte el valor del registro para
xorwf ADCVALUE,w ;poder tener el mayor ancho de pulso
movwf ADCVALUE ;en el menor valor de voltaje leido
movwf CCPR1L ;Carga ese valor como DUTY CICLE del PWM
bcf PORTB,6 ;Apaga el LED que muestra el sentido

bcf PORTB,4 ;Pines que determinan la direccion del motor
bsf PORTB,5

END_TMR0:
;banksel CCP1CON
;bcf CCP1CON,5
;bcf CCP1CON,4
;banksel PORTA
bcf INTCON,2 ;Reinicia el Timer 0
movfw CONTADOR
movwf TMR0
INT2 retfie

;--------------------------------------------------------------------------
;Retrasos


END


 

anything