Autor Tema: PWM por relé  (Leído 11908 veces)

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

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: PWM por relé
« Respuesta #15 en: 25 de Junio de 2006, 15:55:11 »
Hola,

No entiendo tu pregunta. Pero estas acciones de integración y derivación las hago en la fórmula PID, las variables k, periodo, ti y td, las introduzco por teclado.

Sigo sin ver funcionar el PWM, y no se si tendrán algo que ver las interrupciones, porque con un sencillo programa si que va pero con el programa al completo no. Me estoy volviendo loco.

Un saludo,

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: PWM por relé
« Respuesta #16 en: 25 de Junio de 2006, 17:02:48 »
Hola,

Si realizando este programa, veo que el led va cambiando de luminosidad, ¿porque cuando lo coloco en el programa del control PID no funciona?, ¿tiene algo que ver con las interrupciones que uso de los timers 0 y 1? Posteo el código:

#include "C:\15 - Program Files C\Contol_PID.h"
#include <max187.c>            // Subrutina de tratamiento conversor A/D MAX187.
#include <hd44780u.c>         // Subrutina de tratamiento display 16x2 HD44780U.
#include <max4534.c>          // Subrutina de tratamiento multiplexor MAX4534.

#use fast_io (A)               // Directiva para el manejo normal de puertos.
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use fast_io (E)
#byte port_a=0X05               // Declarando la direccion de los  puertos.
#byte port_b=0X06
#byte port_c=0X07
#byte port_d=0X08
#byte port_e=0X09

int   periodo=255;      //Variable para el periodo
int   duty=0;      //Variable para la anchura del pulso
int   i=0;
main()

   output_c(0x00);            //Borra las salidas
   set_tris_c(0xb1111101);      //RC2 salida

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

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

   setup_timer_2(T2_DIV_BY_16,periodo-1,1);   //Carga el periodo
   lcd_init();
   lcd_putc("\f");
   for(;;)
   {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%i",i);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%i",duty);
      CCP_2_LOW=duty;         //Carga la anchura del pulso
      setup_ccp2(CCP_PWM);   //Modo PWM para el CCP
      output_high(PIN_B7); // Se activa el rele
      delay_ms(50);
      output_low(PIN_B7);
      if(duty>=124)
      {
         duty=0;
         output_high(PIN_B5); // Se activa el rele
         delay_ms(50);
         output_low(PIN_B5);
      }
      if(duty>=124) i=0;
      i++;
      duty++;            //apunta a siguiente frec
   }
}   

veo que funciona, pero sigo sin entender que hago mal en el otro programa para no ver el PWM

Un saludo,

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
Re: PWM por relé
« Respuesta #17 en: 26 de Junio de 2006, 11:42:34 »
Hola, si estas usando CCS esto

#byte port_a=0X05               // Declarando la direccion de los  puertos.
#byte port_b=0X06
#byte port_c=0X07
#byte port_d=0X08
#byte port_e=0X09

No hace falta.

Si estas usando fast_io debes poner primero tris antes de out


 output_c(0x00);            //Borra las salidas
   set_tris_c(0xb1111101);      //RC2 salida

Ademas la no se que micro usas pero las salidas de los modulos CCP estan en el portC y en algunos pic18 se puede cambiar una salida por una direccion del portB.

Pero ninguno en B5 ni B7, en tu ejemplo no muestras donde cambias el duty cycle al modulo
solo seteas una variable duty que se va incrementando pero donde se lo cargas al modulo no lo veo

setup

setup_timer_2(T2_DIV_BY_4, 249, 1);  // set TMR2 para frecuencia y periodo para PWM
setup_ccp1(CCP_PWM);                      //  set CPP1 como PWM
set_pwm1_duty(512);                         //  indica al modulo 50% de ciclo de trabajo

el ciclo de trabajo, que puede ser hasta 1024, si usas la resolucion de 10 bits.

Esto ultimo no esta en ninguna parte en el ejemplo que muestras, el resultado de tu PID debes cargarlo en set_pwm1_duty(<tu valor>);                         
 

Ademas comentas

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

Y antes ajustastes como salida RC1 y como entrada RC2????

output_c(0x00);            //Borra las salidas
   set_tris_c(0xb1111101);      //RC2 salida???? aca dice RC1 salida!!!, las demas todas input


Aunque una vez que declares usar el CCP1 ya no podras manejar la direccion del los pines
utilizados por cuaquier modulo interno, si estas usando el PIC18F452 deberas seleccionar si el PIN a usar porque como te digo mas arriba lo puedes  multiplexar o no pues si no lo haces pude que el CCP este salidendo pro otra parte.





saludos
PikMan

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: PWM por relé
« Respuesta #18 en: 26 de Junio de 2006, 12:54:48 »
Hola Picman,

Si no te importa voy paso a paso y así no tendré problemas para afianzar conceptos:

1. Desconocia que al usar CCS, la declaración de la dirección de los puertos no era necesaria.

2. Ya he cambiado el orden al usar la sentencia fast_io, primero pongo tris y luego out.

3. Uso el PIC16F877, y utilizao la salida RC1, que corresponde al CCP2.

4. Lo cargo de la siguiente forma en el principio del main:

setup_timer_2(T2_DIV_BY_16, periodo,1);
 // Definiendo el periodo del PWM con la configuracion del timer 2

setup_ccp2(CCP_PWM);
// Inicializando el modo PWM del modulo CCP2.

y lo siguiente que hago es realizar unos cálculos para que mediante una función me convierta el dato salida_PID que es un float, en un int:

if (process_value<BP_max && process_value>BP_min){
              // Si esta dentro de la banda proporcional actuo en función PID
              errant=error;
              // Guardamos error de iteracion anterior, usado en parte D.
              error = set_point - process_value;
              // Calculo del error actual=set_point-process_value=unidad_fisica.
              serror+=error;
              // Error acumulativo.
              ki = (k*periodo)/Ti;
              // Calculo ganancia intregal
              kd = (k*Td)/periodo;
              // Calculo Ganancia derivativa
              salida_PID=k*error+Ti*serror+Td*(error-errant);
              // Señal de control, duty cycle para PWM

              duty_pwm2 = (int) salida_PID;
              //Cambiando de tipo de dato float a 8 bits sin signo.
              setup_timer_2(T2_DIV_BY_16, periodo,1);
              //Vuelvo a cargar el timer por si acaso no se si debería incluir también setup_ccp2(CCP_PWM);
              set_pwm2_duty(duty_pwm2);
              // Cargamos en modulo PWM el valor absoluto de la señal de control obtenida.


periodo, es una variable que puedo modificar por el teclado, y duty_pwm2 es lo que cargo en el preeescaler

5. Lo último que me comentas, ha sido un error mio, como podrás ver configuro el pin RC1 como salida:

set_tris_c(0xb1111101);      //RC1 salida

No se ha que se debe el error, y es curioso ver como funciona el incremento y el decremento de la variable duty_pwm2 en función del cálculo de la salida_PID, pero no lo veo en la patita RC1.

Un saludo,

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: PWM por relé
« Respuesta #19 en: 29 de Junio de 2006, 17:25:00 »
Hola muy buenas,

¿Me podrían confirmar, si el uso de interrupciones o del display afecta a la generación del pwm?

Gracias

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PWM por relé
« Respuesta #20 en: 29 de Junio de 2006, 18:45:59 »
En absoluto, si generas el PWM por hardware no se vera afectado por nada.

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: PWM por relé
« Respuesta #21 en: 30 de Junio de 2006, 14:03:28 »
Hola nocturno,

¿Entonces que estoy haciendo mal? Me estoy volviendo loco.

Un saludo,

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: PWM por relé
« Respuesta #22 en: 30 de Junio de 2006, 14:13:36 »
Intenta buscar una forma de verificar que todo te funciona bien. Como parece, que lo que falla es la función del PID intenta ver que valores te devuelve el PID para distintas situaciones de entrada y de consigna o de entrada y de error haber que te da de PWM.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: PWM por relé
« Respuesta #23 en: 30 de Junio de 2006, 14:19:34 »
Hola,

Bueno muchas gracias a todos por las respuestas que he obtenido sobre el pwm, y por fin!!!!!! he encontrado cual era el problema. Se trata de la siguiente instrucción:

#use fast_io (C);

la he substituido por esta:

#use standard_io (C)

Ahora mi duda es, ¿Porque cambiando este modo del puerto obtengo lo que quiero?


Solo es para quedarme a gusto, ya que me ha vuelto loco, y mas de un dolor de barriga.

Un saludo,

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PWM por relé
« Respuesta #24 en: 30 de Junio de 2006, 14:49:53 »
Al usar el modo fast_io el compilador no se preocupa del estado de las entradas y salidas, siendo responsabilidad del programador.
Cuando has cambiado al modo standard_io el compilador se encarga de colocar los TRIS adecuados antes de las operaciones de lectura o escritura si fueran necesarios.
Puesto que al cambiar de modo, has comprobado que funciona, seguro que tu problema era de TRIS mal colocados. Ahora tienes una buena pista para encontrar el error.

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: PWM por relé
« Respuesta #25 en: 04 de Julio de 2006, 11:13:56 »
Leí todo el hilo y quería aclarar varias cositas,
Primero un triac generalmente se controlan por angulo de disparo, un dimmer, es la forma mundialmente conocida, pero también como dijeron por ahi se los puede usar con PWM como rele de estado solido, pero hay que tener una consideración importante

Explico: La red cambia de polarida 100 veces por segundo, si genero un ´pwm con mayor frecuencia es decir 100hz o mas estaría disparando a lo loco en todos los periodos, por lo que de control no estaría haciendo nada, para que esto realmente funcione se tiene que hacer un pwm a  una frecuencia mucho menor que la de la red, si no lo ven me dicen y se lo explico con un grafico

Ahora si ya tiene un rele conectado y  teniendo en cuenta que activar un triac tiene sus bemoles y además esta el tema de la electrocución, mejor quédate con el rele arma un PWM por soft y con un periodo de al menos 5s (no me quiero imaginar el ruiderio del rele conmutado una vez por segundo y pobre rele no le va a quedar aliento después de unos minutos de trabajo)

PWM: por soft, no hay problema como decía ALF (el que vino de melmac) supongamos queres un PWM con una resolución de 256 , no hay problema , tenes que dividir 5s(periodo) en 256 , te da 19ms , entonces tenes un timer (TMR0 o TMR2) que te interrumpe cada 19ms
Cada vez que te interrumpe el timer contas 1 , entonces vas a ir  0 1 2 3 4 5 6 7 8 9 10 11 12  13 14 15 16 17 18 19 ... se entiende y al mismo tiempo comparas esa cuenta de 1 2 3 ... con la variable donde tenes guardado el ciclo útil que queres introducir
entonces con el la cuenta en cero.... prendes el relay .... y cuando llegas al valor del ciclo útil lo apagas y boala(mi francés es muy malo) tenes PWM en un relay
Buenos señores espero no haberlos distraído mucho, aburrido tanto  y que  esto les haya servido de algo

Saludos Atte Gustavo T
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado saracatunga

  • PIC10
  • *
  • Mensajes: 39
Re: PWM por relé
« Respuesta #26 en: 06 de Septiembre de 2006, 12:27:49 »
No sé mucho , pero tiro una idea .
Porqué en lugar de usar pwm como salida del pid y hacer tanto lío , no haces que la salida del pid entre en forma digital a un dac y luego amplificar la corriente.

Quizá este equivocado pero se me ocurre. Solo trato de aportar algo. :lol: