Autor Tema: retardo entre señales PWM  (Leído 12142 veces)

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

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
retardo entre señales PWM
« en: 18 de Septiembre de 2010, 15:33:25 »
Hola:

Es posible generar un retardo en los modulos CCP del 16F877A de tal forma que una señal del CCP2 empiece 200 microsegundos mas tarde que la del CCP1?. En proteus lo he intentado pero siempre estan sincronizadas (sin retardo) a pesar de que activo el CCP2 200us mas tarde mediante un delay_us(200).

Un saludo

Aitor

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: retardo entre señales PWM
« Respuesta #1 en: 18 de Septiembre de 2010, 18:33:50 »
Los 2 tienen como base de tiempos el timer 2, así que es imposible.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: retardo entre señales PWM
« Respuesta #2 en: 18 de Septiembre de 2010, 18:51:09 »
Hola:

Es posible generar un retardo en los modulos CCP del 16F877A de tal forma que una señal del CCP2 empiece 200 microsegundos mas tarde que la del CCP1?. En proteus lo he intentado pero siempre estan sincronizadas (sin retardo) a pesar de que activo el CCP2 200us mas tarde mediante un delay_us(200).

Un saludo

Aitor

Siempre tienes la posibilidad de implementar un PWM por hardware y otro por software. Es decir, utiliza otro timer para generar una interrupción con un retardo de 200uS sobre el PWM y en la rutina de interrupción manejas la "subida o bajada" de un IO cualquiera. Eso sí: si quieres que las instrucciones de la rutina de interrupción no distorsionen los 200uS tendrás que subir la frecuencia del oscilador lo más posible y/o descontar el número de instrucciones que se utilicen en dicha rutina de interrupción.

Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: retardo entre señales PWM
« Respuesta #3 en: 19 de Septiembre de 2010, 09:07:55 »
Rectifico: no necesitarías un timer sino 2. Uno para la subida del pulso y otro para la bajada. Además si tu frecuencia de reloj no es muy alta y la frecuencia del PWM sí lo es, se volverá muy complicado no distorsinar los tiempos.

Quizá alguien tenga una solución más sencilla...

Saludos
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: retardo entre señales PWM
« Respuesta #4 en: 19 de Septiembre de 2010, 09:19:39 »
Hola:

Es posible generar un retardo en los modulos CCP del 16F877A de tal forma que una señal del CCP2 empiece 200 microsegundos mas tarde que la del CCP1?. En proteus lo he intentado pero siempre estan sincronizadas (sin retardo) a pesar de que activo el CCP2 200us mas tarde mediante un delay_us(200).

Un saludo

Aitor

Siempre tienes la posibilidad de implementar un PWM por hardware y otro por software. Es decir, utiliza otro timer para generar una interrupción con un retardo de 200uS sobre el PWM y en la rutina de interrupción manejas la "subida o bajada" de un IO cualquiera. Eso sí: si quieres que las instrucciones de la rutina de interrupción no distorsionen los 200uS tendrás que subir la frecuencia del oscilador lo más posible y/o descontar el número de instrucciones que se utilicen en dicha rutina de interrupción.

Saludos.

Hola:

Una pregunta:

Durante la interrupción del Timer0 el CCP sigue funcionando?

Un saludo

Aitor

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: retardo entre señales PWM
« Respuesta #5 en: 19 de Septiembre de 2010, 10:14:31 »
Buenas,

me vuelvo a desmentir jejeje. Lo he pensado bien y sí que puedes implementar un PWM con un único timer. Calcula los valores correspondientes para el "1" y el "0" del PWM que necesites en un único timer (timer0 o timer1). Habilita la interrupción para ese timer y sincroniza el comienzo 200uS después del PWM por hardware sacando un "1" por cualquier IO (ese será tu PWM por software). Cuando salte la interrupción, en la rutina, cargas en el timer el valor correspondiente al peridodo del "0" y por el IO sacas un "0"...

No se si me he explicado: se trata de ir alternando un "1" y un "0" en un IO modificando los tiempos de retardo en un único timer desde la rutina de interrupción: en esta rutina cambias el valor de salida del pin y el retardo hasta la próxima interrupción.

En cuanto al CCP funcionando durante interrupción: hace tiempo que no toco PIC16 pero si no recuerdo mal los periféricos sólo se detienen en modo "sleep". Por favor si me equivoco que alguien me rectifique.Gracias.

Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: retardo entre señales PWM
« Respuesta #6 en: 19 de Septiembre de 2010, 10:34:07 »
Si la frecuencia es alta, el método sw no funcionará. Peroo hay unos PICs de gama alta, creo que de la familia dsPIC que tienen unos módulos para control de motores que sí te dejan hacer eso. O busca un PIC con módulo DCIM, el módulo para control de motores de CA, eso es lo que necesitas.

Un saludo
Reinier

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: retardo entre señales PWM
« Respuesta #7 en: 19 de Septiembre de 2010, 11:53:13 »
Hola:

De momento lo estoy haciendo de este modo:


#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOCPD
#use delay(clock=4000000)
#use fast_io(c)
#use standard_io(b)

#int_RTCC
RTCC_isr(){
output_toggle(PIN_B0);  
delay_us(760);
set_timer0(160); // ajusto el valor para que el duty sea 20%
}
int16 i=50;
void main(void){
set_tris_c(0x00);
set_tris_b(0x00);
output_c(0x00);
output_b(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(INT_TIMER0);
enable_interrupts(global);
setup_timer_2(T2_DIV_BY_16,61,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(i);
//set_pwm1_duty(CCP_OFF);
while(1){
output_high(PIN_B0);
}      
}

Ahora me falta ver cómo me las ingenio para lo del retardo entre una y otra.

Un saludo

Aitor

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: retardo entre señales PWM
« Respuesta #8 en: 19 de Septiembre de 2010, 17:03:34 »
Qué frecuencia tiene tu PWM? Cómo comenté antes y repitió reiniertl: sí la frecuencia es muy alta el PWM por software no funcionará.

El PIC realiza más tareas? Lo digo por el while(1). Si no realizas más tareas o te puedes permitir dejarlas de lado por algo de tiempo yo haría los dos PWM por software con un único timer y 2 salidas digitales dejando un delay de 200us entre la basculación de una salida y la basculación de la otra. No es muy ortodoxo pero funcionará...

Saludos.

Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: retardo entre señales PWM
« Respuesta #9 en: 19 de Septiembre de 2010, 17:10:25 »
Qué frecuencia tiene tu PWM? Cómo comenté antes y repitió reiniertl: sí la frecuencia es muy alta el PWM por software no funcionará.

El PIC realiza más tareas? Lo digo por el while(1). Si no realizas más tareas o te puedes permitir dejarlas de lado por algo de tiempo yo haría los dos PWM por software con un único timer y 2 salidas digitales dejando un delay de 200us entre la basculación de una salida y la basculación de la otra. No es muy ortodoxo pero funcionará...

Saludos.



Hola:

La frecuencia es 1000 Hz y no hay mas tareas que la de generar las dos señales PWM. Intentaré lo que comentas

Un saludo

Aitor

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: retardo entre señales PWM
« Respuesta #10 en: 19 de Septiembre de 2010, 17:31:50 »
Bueno pues con PWMs a 1khz y teniendo en cuenta que tu ciclo de instrucción es de 1mhz: entre pulso y pulso te le puedes quitar los 200us de retardo y aún te quedan cerca de 800us para que el PIC se tome un café durante el while(true) jejeje

Eso sí no te olvides de tener en cuenta las instrucciones que utilizas en la rutina de interrupción para la gestión de los IO y del timer...

Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: retardo entre señales PWM
« Respuesta #11 en: 19 de Septiembre de 2010, 18:13:38 »
Bueno pues con PWMs a 1khz y teniendo en cuenta que tu ciclo de instrucción es de 1mhz: entre pulso y pulso te le puedes quitar los 200us de retardo y aún te quedan cerca de 800us para que el PIC se tome un café durante el while(true) jejeje

Eso sí no te olvides de tener en cuenta las instrucciones que utilizas en la rutina de interrupción para la gestión de los IO y del timer...

Saludos.

Hola:

De momento no lo he conseguido mediante la interrupción del TIMER0 (si puedes adjunta tu solución) pero si que lo he conseguido de la manera mas sencilla posible,que es generando los retardos necesarios entre las dos señales. Este es el código:

#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)

void main() {
output_b(0x00);
while (1){
output_high(PIN_B0);
delay_us(200);
output_low(PIN_B0);
delay_us(300);
output_high(PIN_B1);
delay_us(200);
output_low(PIN_B1);
delay_us(300);
}
}

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: retardo entre señales PWM
« Respuesta #12 en: 19 de Septiembre de 2010, 20:02:44 »
Si el PIC no hará otr cosa que generar los dos PWM, lo mejor es no usar PIC y buscarse un circuito integrado que gaga el trabajo, eso no será difícil de encontrar.

Y un PWM de 1KHz es realizable por sw, siempre que el micro corra al menos a 10MHz, aunque uno a 20MHz no sería mala idea, así podrías garantizar entrar en la ISR con un error muy pequeño, de modo que puedas cambiar los estados de las salidas del micro con suficiente tiempo.

Saludos
Reinier

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: retardo entre señales PWM
« Respuesta #13 en: 20 de Septiembre de 2010, 05:03:12 »
Hola,

si realmente no vas a hacer nada más con el PIC creo que ltu solución de los retardos es igual de efectiva y menos compleja que la q propuse de las interrupciones. Cómo bien dice reiniertl hay otros ICs que te pueden hacer ese trabajo sin necesidad de un micro.

Veo tú código y creo q no te entendí muy bien: si lanzas una interrupción cada 1mS la gestionarás bien (cuentas las 30, 40 o 50 instrucciones que emplees y las descuentas del timer ) pero si la lanzas cada 200uS como dice reiniertl necesitarás una frecuencia mayor...

Saludos
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: retardo entre señales PWM
« Respuesta #14 en: 20 de Septiembre de 2010, 11:34:26 »
Hola.

Un 556 podría servir no? o dos 555 en cascada? ... que otros integrados para generar PWM existen en el mercado?

Saludos
El papel lo aguanta todo


 

anything