implementacion de pwms en timer0 y timer1

holas!

tengo intencion de programar un control de motor para motor monofasico de AC (el hardware tambien podria funcionar para motor trifasico, solo habria que cambiar el angulo de fase de las salidas), para esto alimentare tres puentes de igbt con sus 6pwms en modo phase correct, el problema con el que me encuentro es que al inicializar los times 0 y 1 solo funciona uno de ellos (0 o 1 o viceversa) y a velocidad menor a la que quiero inicializar (he modificado wiring.c para que sea posible la utilizacion del vector de interrupcion 0),
(aqui tengo la inicializacion del timer1 anulada y con eso el timer0 funciona a 1.5Hz, mientras que timer2 saca unous 84Hz que es del orden suficiente)
alguna idea?
Gracias
el codigo en adjunto, porque no cabe

codigo.pde (11 KB)

Teniendo en cuenta la frecuencia a la que quieres llegar, te has planteado hacerlo "a mano"? Me parece mucho más fácil que pelearse con los PWM, y para la CPU que te va a consumir...

que quieres decir con 'a mano' ? (comunicacion por usb es requerida para la cosa)

Me refiero a bajar y a levantar los puertos del micro con las funciones que toque (Digital.write(X) si usas las funciones de arduino) . A ver si logro hacer algo decente y que se entienda (que no son horas tampoco xD):

int t,pwm;

setup(){
  //lo que te haga falta aquí
}

loop(){
  LoqueTengoqueHacer();
  PWM();
}


PWM(){
 if(t==1000){  //pongo un valor aleatorio, tu tendrás que ajustarlo segun que quieras (seguramente necesitarás un long para freq. tan bajas
  switch(pwm){
    case 0:
     Estado0(); //Esta función fija como pones los pines
    pwm=1;
    break;
  }
 }
}

La función Estado0() la puedes hacer genérica pasando argumentos (Pines(int pin1,pin2,pin3....)) la idea es que pongas las combinaciones que necesitas para sincronizarlo correctamente. Otro tema es que la función LoqueTengoqueHacer(); no puede ocupar todo el tiempo de la CPU (nada de delays!), tiene que funcionar como una máquina de estados. Si no estás acostumbrado, las máquinas de estados pueden ser algo confusas, pero vale la pena trabajar así, sobretodo porque así puedes hacerlo funcionar todo a la vez (no tienes que reescribir codigo si añades otras funcionalidades).

en un puente de igbt entre las puntas hay 300V, uno de ellos conduce mientras el otro esta apagado, si hay alguna falta de sincronia por lo que sea (el aparato llevara comunicación por usb) los igbt se pondran en corto, a 300V los cortos son divertidos pero sale caro por eso es imprescindible utilizar interrupciones

En realidad la única falta de sincronía que podrías tener sería si en la función de cambio de pines vas uno a uno, y sería de 1 instrucción. En cualquier caso, si los conectas todos a un mismo puerto, puedes hacerlo de golpe. Además, si estás con 300V, tendrás que poner un buen montón de protecciones, entre las que tendrá que haber condensadores a punta pala, así que el Tiempo de instrucción, como que te da igual :P.

Lo de las interrupciones, nada impide que pongas la función en un timer por ejemplo. Suele ser más simple controlar esto que pelearse con los PWM, porque cada uno va un poco por su cuenta, y luego pasan cosas raras. Si tuvieras que conmutar a unos KHz, entonces necesitarías el PWM, pero si no vas a pasar de 100-200, te sobra así.

Me imagino que si te has metido en esto, es que ya lo tienes presente, pero procura dimensionar bien las protecciones, y poner pull-downs/pull-ups segun convenga en las puertas de los igbt (yo siempre me olvido de esto último...)

presuntamente solucionado :slight_smile:

gracias!