Autor Tema: Generar salida PWM con PIC16f876  (Leído 2528 veces)

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

Desconectado tadeo1968

  • PIC10
  • *
  • Mensajes: 2
Generar salida PWM con PIC16f876
« en: 09 de Noviembre de 2013, 19:10:37 »
Hola a todos.

Tengo un problema que puede llegar a ser sencillo, pero hace varios dias no le encuentro salida. Quiero simplemente sacar una señal PWM usando el modulo CCP de este PIC, o sea por el pin C2, ya he probado creo que todo lo que dice la teoría, y varios archivos fuente que consegui por internet, acerca de configurar el CCP como PWM, el  timer2, setear el duty cycle, etc pero cuando largo la simulación en Proteus, el osciloscopio esta clavado en cero... Estoy usando el compilador CCS, y les adjunto uno de los tantos programas fuente que he probado. Ah tambien lo probe con el 16f877 y nada. Donde esta el error? Desde ya muchas gracias y un gran abrazo

#include <16f877.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use delay(clock=4000000)

void main(void)
{
unsigned int pwm1;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 156, 1);
while( 1 ) {
pwm1=80; //duty cycle
set_pwm1_duty(pwm1);
}
}

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: Generar salida PWM con PIC16f876
« Respuesta #1 en: 11 de Noviembre de 2013, 03:12:32 »
Hola

porque no usas: #use pwm, para configurar el pwm, checalo en la ayuda, o mejor aun, usa el wizard project de CCS para configurarlo, ahi esta sin problemas

saludos.
Nunca se deja de aprender

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Generar salida PWM con PIC16f876
« Respuesta #2 en: 11 de Noviembre de 2013, 08:18:43 »
Recuerda que debes poner la resistencia pull-up.... en el pin MCLR
te recomendaria para un futuro sacar del bucle infinito las lineas:

pwm1=80; //duty cycle
set_pwm1_duty(pwm1);

y deshabilitar el WDT y resetearlo,ya que puede ser el culpable de que tu programa no funcione
« Última modificación: 11 de Noviembre de 2013, 08:29:04 por ppyote »
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado tadeo1968

  • PIC10
  • *
  • Mensajes: 2
Re: Generar salida PWM con PIC16f876
« Respuesta #3 en: 11 de Noviembre de 2013, 20:56:14 »
Hola

porque no usas: #use pwm, para configurar el pwm, checalo en la ayuda, o mejor aun, usa el wizard project de CCS para configurarlo, ahi esta sin problemas

saludos.

Hola , no encuentro en CCS la directiva #use pwm, lo configure todo con Proj Wiz y tampoco funciona. Gracias de todos modos, seguire probando

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: Generar salida PWM con PIC16f876
« Respuesta #4 en: 11 de Noviembre de 2013, 21:13:36 »
Debe ser algún tipo de error de conexión, o como dice ppyote no te olvides de MCLR, o algún tipo de bug del ccs o del proteus.

Ya que probé el código que das y me genera el PWM normal, cambio el duty y también cambia en proteus.

CCS version 4
Proteus 7.8

Desconectado cordobes_088

  • PIC10
  • *
  • Mensajes: 8
Re: Generar salida PWM con PIC16f876
« Respuesta #5 en: 16 de Diciembre de 2014, 11:36:31 »
Hola amigos, yo estoy trabajando con un PIC16F887, y necesito hacer un PWM pero no hay caso no me funciona y por mas que lo varié en el proteus, no me cambia el tiempo, siempre lo tengo clavado en 1ms, necesitaría que si alguien puede que me ayude a resolver este problema, otro con de los problemas con los que cuento es que en el PICC, la opción pic wizard la tengo desactivada y no hay caso de activarla, asi que no puedo probar con hacer un PWM ahi, así que si alguien puede que también me de una solución con este problema, a continuación adjunto mi programa del PWM, para escuchar soluciones, desde ya mil gracias y saludos a todos....

#INCLUDE <16F887.H>
#DEVICE ADC=8       // resolucion del ADC de 8bits
#USE DELAY(CLOCK=8000000)
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V

void main()
{

int pwmanalogica;
INT16 pwmdigital; //Variables para  lectura de ADC y señal de Control a modulo CCP


   //  periodo reloj = 1/f  ;  periodo de ciclo maquina = 4/f  ; preescaler 2,4, 8, 16   4/f / prescaler;
   
   //  F_pwm  =  F_osc / [4 x PRE x (PR2+1)]

setup_timer_2(t2_div_by_4,249,6); // Configuracion   de Timer 2 para establecer frec. PWM a   F_pwm =   8M/4*4*(255) = 1960. 8=2khz  T=1/2kHz =0.5ms
setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM


setup_adc(adc_clock_internal);   //Configurar ADC
setup_adc_ports(sAN0|VSS_VDD);  // AN0 como entrada analogica
 
while(true){


set_adc_channel(0); //Seleccionar Canal 0
delay_ms(1);

pwmdigital=read_adc(); //Leer ADC
delay_ms(1);



pwmanalogica=200-pwmdigital*(100.0/255.0); 



set_pwm1_duty(pwmanalogica); //Transferencia de senal de control al actuador

}
}





 

anything