Pwm + pic16f877a

Hola:

Puedes ahcrlo funconar con el NE555 o con un PIC.
No olvides que el ejemplo que puse es del PIC16F886 y usas el PIC16F877A. Las palabras de configuración son diferentes, a parte que el ejemplo de arriba no usa cirstal de curazo XT, usa el EC. Revísalo.

Solo tienes que adaptar el PIC 16F886 al 16F877A. Por cierto, el 16F877A ya no se fabrica, ahora su sustituto oficial es el PIC16F887 con mejoras.

Un saludo.
 
Hola:

Cambiar el PWM y obtener señales analógicas de entrada al PIC ya son dos cosas diferentes.

En C:
Código:
/*Los módulos CCPx
Modo PWM. Variando la anchura del pulso a partir de una tensión analógica

Los dispositivos PIC16F88X 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 Vref=5 --> res.= 4.8 mV/Bit; con Vref=2.5V --> res.= 2.4 mV/Bit

Se propone realizar una modulación de anchura de pulsos (PWM) mediante el módulo CCP1 y con
salida de señal por la línea RC2/CCP1. La anchura se ajusta a partir de una tensión analógica
que se introduce por RA0/AN0. Se establece un periodo fijo de 3200uS

El TMR2 trabajando con un preescaler de 1:16 y a una frecuencia de 4 MHz evoluciona cada 16 uS

Un osciloscopio conectado en RC2/CCP1 permitirá visualizar las variaciones del ancho de pulso
en la señal salida RC2/CCP1 según la tensión analógica aplicada por RA0/AN0. Nosotros hemos
empleado el modelo PoScope Basic 2. */
  
#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses     NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT    //Palabra 1 de configuración
#fuses    NOWRT,BORV40                                //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#use fast_io (C)

int    periodo=200;                                //Valor para el periodo de 3200uS (200*Preescaler de 16)
int resultado;                                    //Variable para el resultado de la conversión AD

main()
{    
    set_tris_c(0b11111011);                        //RC2 salida
    setup_adc_ports(sAN0);                        //RA0 entrada analógica

//El TMR2 trabaja con un preescaler 1:16 por lo que con una frecuencia de 4MHz evoluciona
//cada 16uS ((4*Tosc)*16)

    setup_timer_2(T2_DIV_BY_16,periodo-1,1);    //Carga el periodo y TMR2 en ON  

//El módulo CCP1 actúa en el modo PWM con salida de señal por RC2/CCP1

    setup_ccp1(CCP_PWM);                        //Modo PWM para el CCP1
    setup_adc(adc_clock_div_32);                //Ajusta frecuencia de muestreo del ADC

    while(1)
    {  
//Se activa el ADC y se selecciona el canal RA0/AN0.
  
        set_adc_channel(0);                        //Selección del canal 0 (RA0)
        CCP_1_LOW=read_adc();                    //Inicia la conversión y carga la anchura del pulso  
    }
}
En ASM:
Código:
;Los módulos CCPx
;Modo PWM. Variando la anchura del pulso a partir de una tensión analógica
;
;Los dispositivos PIC16F88X 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 Vref=5 --> res.= 4.8 mV/Bit; con Vref=2.5V --> res.= 2.4 mV/Bit
;
;Se propone realizar una modulación de anchura de pulsos (PWM) mediante el módulo CCP1 y con
;salida de señal por la línea RC2/CCP1. La anchura se ajusta a partir de una tensión analógica
;que se introduce por RA0/AN0. Se establece un periodo fijo de 3200uS
;
;El TMR2 trabajando con un preescaler de 1:16 y a una frecuencia de 4 MHz evoluciona cada 16 uS
;
;Un osciloscopio conectado en RC2/CCP1 permitirá visualizar las variaciones del ancho de pulso
;en la señal salida RC2/CCP1 según la tensión analógica aplicada por RA0/AN0. Nosotros hemos
;empleado el modelo PoScope Basic 2.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .200        ;Valor para el periodo de 3200uS (200*Preescaler de 16)

Duty_H        equ    0x20
Duty_L        equ    0x21        ;Variable para la anchura de pulso

            org    0x00        ;Vector de RESET  
            goto    Inicio
            org    0x05
  
;Programa principal

Inicio           bsf        STATUS,RP0
            bsf        STATUS,RP1    ;Banco 3
            movlw    b'00000001'
            movwf    ANSEL        ;RA0/AN0/C12IN0- entrada analógica, resto digitales
            clrf    ANSELH        ;Puerta B digital
            bcf        STATUS,RP1    ;Banco 1
            movlw    b'11111011'
            movwf    TRISC        ;RC2/CCP1 salida
            bcf        STATUS,RP0    ;Selecciona banco 0

            bsf        STATUS,RP0    ;Selecciona página 1
            clrf    ADCON1        ;Alineación izda. Vref= VDD para el convertidor
            bcf        STATUS,RP0    ;Selecciona página 0

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32

Loop        movlw    b'10000001'
            movwf    ADCON0        ;ADC en On, seleciona canal AN0
            bcf        PIR1,ADIF    ;Restaura el flag del conversor AD
            bsf        ADCON0,GO    ;Inicia la conversión

;Esperar el final de la conversión y leer el resultado
ADC_Wait_0    btfss    PIR1,ADIF    ;Fin de conversión ??
            goto    ADC_Wait_0    ;Todavía no      
            movf    ADRESH,W
            movwf    Duty_H        ;Registra valor actual para el periodo
            bsf        STATUS,RP0    ;Selecciona página 1
            rrf        ADRESL,F
            rrf        ADRESL,W
            bcf        STATUS,RP0    ;Selecciona página 0
            andlw    b'00110000'
            movwf    Duty_L        ;Salva parte baja de la conversión
      
;El módulo CCP1 se configura en modo PWM con salida por RC2/CCP1. Los bits LSB se obtienen
;de la variable Duty_L

            movlw    b'00001100'
            iorwf    Duty_L,F
            movwf    CCP1CON        ;Modo PWM para el módulo CCP1

;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.

            movlw    Periodo-1
            bsf        STATUS,RP0    ;Selecciona página 1
            movwf    PR2
            bcf        STATUS,RP0    ;Selecciona página 0

;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.

            movf    Duty_H,W
            movwf    CCPR1L

;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.

            movlw    b'00000111'
            movwf    T2CON        ;TMR2 en On
            goto    Loop

            end                    ;Fin del programa fuente

Con el `pic 16f877a me sale error en esta parte (
movwf ANSEL ;RA0/AN0/C12IN0- entrada analógica, resto digitales
clrf ANSELH ;Puerta B digital)
Podrían ayudarme por_favor ?
 
Última edición por un moderador:
con el `pic 16f877a me sale error en esta parte (
movwf ANSEL ;RA0/AN0/C12IN0- entrada analógica, resto digitales
clrf ANSELH ;Puerta B digital)
podrian ayudarme porfavor

Seguramente porque el 877 no posee el registro ANSELH. Igualmente no hace falta apagar nada analógico en el puerto B del 877 así que comenta o elimina esa linea ya que no es necesaria. Obviamente si que deberás agregar las instrucciones para setear bien los pines del puerto B ya sean como entradas o salidas.
 
Atrás
Arriba