PWM con salida en 4 pines de un pic desfasados entre ellos

Iniciado por xiruko, 17 Mayo 2013, 00:53 AM

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

Firos

#10
Pues vaya faena... que te hagan investigarlo y luego te digan que no. En fin, jefes.


Por otro lado, intentando hallar una solución a tu problema. En el caso del PIC16F876A el PORTB tiene una peculiaridad. Me imagino que en tu PIC también esta así que échale un vistazo y nos comentas, aunque sea sólo por gusto y no por trabajo.

La característica es que el PORTB si varía produce una interrupción, como cuando hacemos un teclado matricial. ¿Sabes a que me refiero?

Imagínate que tienes el PORTB de la siguiente manera (PB- 0,0,0,0,0,0,0,0 - PB7). Creo que solo era en las cuatro líneas de más peso, pero bueno, nos da igual porque nos sirve. En caso de que PB0 se ponga a 1, producirá una interrupción, si PB1 se pusiera a 1 aunque PB0 también lo esté volverá a pedir interrupción y así hasta PB3 (creo que solo eran los 4 BITS de menor peso en el caso del 16F876A, mira a ver en el tuyo si tienes algo parecido...).


Me parece un poco raro tu jefe... jajajaja te dice que te hagas eso, sin hacerlo por software y sin añadir circuitería o componentes externos. Mándalo a tomar fanta  :-X


Un saludo  :D


AÑADO:

Por otro lado... la única manera de hacerlo mediante software sería indicándole un tiempo (menor que el DUTY CYCLE del primero, o el anterior al que quieras solapar) a un TIMER para que produzca una interrupción y active la salida. el TIMER correría en segundo plano dejando libre al micro y en la interrupción gastarías no más de 4 ciclos de reloj (400nanosec). El desvío sería mínimo y podrías ajustarlo en el TIMER clavándolo casi a la perfección. El PIC solo estaría procesando cada 400 nanosegundos y el resto del tiempo podrías seguir con el programa.
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.

xiruko

#11
CitarImagínate que tienes el PORTB de la siguiente manera (PB- 0,0,0,0,0,0,0,0 - PB7). Creo que solo era en las cuatro líneas de más peso, pero bueno, nos da igual porque nos sirve. En caso de que PB0 se ponga a 1, producirá una interrupción, si PB1 se pusiera a 1 aunque PB0 también lo esté volverá a pedir interrupción y así hasta PB3 (creo que solo eran los 4 BITS de menor peso en el caso del 16F876A, mira a ver en el tuyo si tienes algo parecido...).

De qué sirve detectar un cambio en esos 4 pines? Habría que generar la frecuencia a la que quisieras el PWM fuera del micro no? Y entonces estaríamos como antes.

CitarPor otro lado... la única manera de hacerlo mediante software sería indicándole un tiempo (menor que el DUTY CYCLE del primero, o el anterior al que quieras solapar) a un TIMER para que produzca una interrupción y active la salida. el TIMER correría en segundo plano dejando libre al micro y en la interrupción gastarías no más de 4 ciclos de reloj (400nanosec). El desvío sería mínimo y podrías ajustarlo en el TIMER clavándolo casi a la perfección. El PIC solo estaría procesando cada 400 nanosegundos y el resto del tiempo podrías seguir con el programa.

Lo acabo de comprobar porque estaba convencido y me da unas 35-45 instrucciones la rutina de interrupción (3.5 - 4.5 usec), así que sí que quedaría tiempo de sobras para otras tareas. Diría que puse un 0 de más la otra vez que lo pensé... xD

Y bueno, se lo comentaré el martes a mi jefe a ver si quiere intentarlo por software, que ahora ya no sé porque no quiere hacerlo así.

CitarEn fin, jefes.

;-)

edito:

Vale, vuelvo a cambiar de opinión y creo que no sería posible hacerlo con timers por interrupciones xD

El tema es, como dije la isr estaría formada por unas 35-45 instrucciones, digamos que 40 de media y serían unos 4usec. Para tener los pulsos solapados y teniendo 4 salidas, harían falta 8 interrupciones para hacer 1 ciclo del PWM. Y teniendo en cuenta que necesitaría poder llevarlo a una frecuencia de 50KHz (20usec) pues las cuentas no dan...

Un saludo!

ingtasco

Hola muy buenas noches saludos desde colombia...

Bueno actualmente ando trabajando en el diseño de un inversor resonante de puente completo monofasico, la etapa de potecia esta conformado por IGBT de switching fast..
El proyecto consiste en poder variar tanto el ciclo de trabajo como la frecuencia de pwm del puente H. Para comenzar arranque generando una frecuencia fija y un ciclo de trabajo fijo en la parte de control. Ando trabajando con el PIC18F4550 el cual le ando utilizando P1A y el P1B para generar las dos señales de control complementaria.. mi primer inconveniente es que no he podido generar los tiempos muertos entre cada rama del puente H.. Algunos de ud tiene alguna idea... he mirado la hoja de datos del PIC pagina 160 pero no entiendo como generar ese tiempo muerto... Anexo el codigo que llevo hasta el momento.


#include <18F4550.h>
#fuses INTRC_IO,PUT,NOWDT,NOPROTECT,NOLVP,BROWNOUT,MCLR
#use delay(clock=8000000)

void main()
{
setup_ccp1(CCP_PWM_HALF_BRIDGE | CCP_PWM_H_H);
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_pwm1_duty(124); // 25% duty cycle

while(1);
}