TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: _JaM_ en 28 de Mayo de 2004, 19:10:00
-
Hola que tal a todos espero que alguien me pueda ayudar con lo que estoy haciendo....
Mi problema es el siguiente:::
Tengo un pwm de 1Khz, lo estoy variando con los puertos RA0-RA4 (5) (32bits)
Lo que estoy haciendo es tomar una señal de referencia de 0 a 5volts con un potenciometro.. lo meto al convertidor A/D.. pero obtengo un valor de 10 bits.. como le hago para introducir ese valor en el pwm.....
Lo pongo directo en CCPR1L pero al variar el potenciometro me despliega tres veces el pwm
Dicho de otra manera:
comienzo a girar el potenciometro y comienza el pulso desde cero hasta un valor maximo.. al seguir variando el potenciometro, el pulso comienza nuevamente desde cero y va hasta su valor maximo.. asi lo hace hasta 4 veces hasta que el potenciometro llega hasta el final...
yo quiero que lo haga solo una vez....
otra pregunta.... si logro resolver ese problema lo siguiente que quisiera hacer es de otra referencia de 0 a 5v mantener buscar algunas funciones que me lleven a mantenerme siempre en un valor de 2.5 v... cuando varie la referencia siempre me llevea 2.5
-
mira este ejemplo
;PRACTICA; 8 VARIACION DE LA VELOCIDAD DEL MOTOR
;
;Ejemplo MicroPIC Trainer y Micro"PIC I/O
;
;El módulo conversor ADC. Variando la velocidad de un motor.
;
;Los dispositivos PIC16F87X disponen de un convertidor A/D de 10 bits de resolución y 5 u 8
;canales de entrada analógica. La tensión de referencia determina la resolución por bit:
;(Res. = Vref/1024). Con 5 Vref=4.8 mV/Bit; con 2.5 Vref=2.4 mV/Bit
;
;Se propone la regulación de velocidad del motor CC de la tarjeta Micro"PIC I/O mediante
;PWM. Para ello, el potenciómetro AN3 de la Micro"PIC Trainer conectado a la línea RA3/AN3,
;determina la duración de la anchura del pulso. El valor de este potenciómetro es convertido
;cada 10 mS para su lectura y posterior ajuste de la anchura del pulso.
;
;La salida PWM en RC2/CCP1 se conecta a la señal Enable del motor. RB0 y RB1 determinan el
;sentido de giro.
List p=16F873 ;Tipo de procesador
include "P16F873.INC" ;Definiciones de registros internos
Periodo equ 0x20 ;Variable para el periodo
Duty_H equ 0x21
Duty_L equ 0x22 ;Variable para la anchura de pulso
org 0x00 ;Vector de Reset
goto Inicio
org 0x04 ;Vector de interrupción
;Programa de tratamiento de la interrupción
Inter btfss PIR1,ADIF ;Ha sido interrupción del ADC ??
retfie ;No, falsa interrupción
bcf PIR1,ADIF ;Reponer el flag del conversor
movf ADRESH,W
movwf CCPR1L ;Carga los 8 bits de más peso para el PWM
bsf STATUS,RP0 ;Selecciona banco 1
rrf ADRESL,F
rrf ADRESL,W
andlw b"00110000"
bcf STATUS,RP0 ;Selecciona banco 0
iorwf CCP1CON,F ;Carga los dos bits de menos peso para el PWM
retfie
;Programa principal
Inicio clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ;Selecciona banco 1
clrf ADCON1 ;Puerta A analógica, justificación izda.
clrf TRISB ;Puerta B se configura como salida
movlw b"00011111"
movwf TRISA ;RA4-RA0 entradas
movlw b"11111011"
movwf TRISC ;RC2/CCP1 salida
movlw b"11001111"
movwf OPTION_REG ;Preescaler de 128 asociado al WDT
bsf PIE1,ADIE ;Activa interrupción del convertidor
bcf STATUS,RP0 ;Selecciona banco 0
;Se activa el ADC y se selecciona el canal RA3/AN3. Frecuencia de trabajo Fosc/32
movlw b"10011001"
movwf ADCON0 ;ADC en On, seleciona canal AN3
bcf PIR1,ADIF ;Restaura el flag del conversor AD
;El módulo CCP1 actúa en el modo PWM.
movlw b"00001100"
movwf CCP1CON ;Módulo CCP1 en modo PWM con salida por RC2/CCP1
;El periodo del PWM para el módulo CCP1 es de 4 mS (PR2*TMR2 Preescaler*4*Tosc)
movlw .250
bsf STATUS,RP0 ;Selecciona página 1
movwf PR2
bcf STATUS,RP0 ;Selecciona página 0
;La anchura inicial del pulso es la mínima (1)
movlw .1
movwf CCPR1L
;El TMR2 trabaja con un preescaler de 1:16. Evoluciona cada 16 uS
movlw b"00000110"
movwf T2CON ;TMR2 en On
;El módulo CCP2 se configura en modo de comparación con disparo de eventos. El TMR1 se
;resetea y se da inicio a una nueva conversión cada vez que se alcanza el valor del CCPR2.
movlw b"00001011"
movwf CCP2CON ;Modo comparación con disparo de eventos
movlw high .10000
movwf CCPR1H
movlw low .10000
movwf CCPR2L ;Carga el registro CCPR2 con 10000
clrf TMR1L
clrf TMR1H ;Inicia el TMR1
;El TMR1 actúa con oscilador interno y un preescaler de 1:1
movlw b"00000001"
movwf T1CON ;TMR1 en On
movlw b"11000000"
movwf INTCON ;Activa interrupciones
movlw b"00000010"
movwf PORTB ;Motor en On, giro horario
Loop clrwdt ;Refrescar el WDT
goto Loop
end ;Fin del programa fuente
este ejemplo funciona muy bien
saludos de rep. dom. miltonmc
saludo
-
Gracias voy a intentarlo a ver si funciona,, despues tratare de modfcarlo.... gracias de nuevo.. y otra pregunta de donde obtuviste ese programa.???
Gracias!!
-
La dirección está en el subforo de C, en uno de los últimos mensajes, hay un montón de ejercicios ... estan muy bien, son muy didácticos.
Un saludo
-
Hola tambien puedes ver el siguiente ejemplo http://miarroba.com/foros/ver.php?temaid=974141&foroid=79706
que dessarrollo PIKMAN sobre un PWM controlado por el conversor A/D.
Salu2.
-
gracias por sus respuestas....
he resuleto mi problema... ke hubiera hecho sin ustedes??...
gracias