Generar PWM con 12F675

#1
Buenas amigos,

Tengo un micro 12f675, quiero generar una PWM, pero este micro no tiene para generar PWM por lo tanto hay que hacerlo por software, cosa que me ha estado causando problemas ya que el el ciclo que variando y pareciera variar en frecuencia también...

Utilice distintas estrategias sin resultados favorables, si alguien tiene alguna idea le agradezco. Vale recalcar que trabajo en lenguaje C.
 
#2
distiintas estrategias? cuales has pensado? en ese pic la unica manera viable que hay de hacer un pwm es con un timer, y ese pic tiene 2. Simplemente tienes que ir cambiando en cada interrupcion el tiempo de recarga.
Un saludo
 
#3
Bueno hice comparaciones con el timer0 activando en bajo o en alto si era mayor que el valor actual del timer, use las interrupciones, use el timer1 y el timer0... y bueno...

Otro cosa que me falto decir, es que necesito que el que este pwm sea regulable por un valor leido por un puerto adc.
 
#4
a ver, es bastante sencillo. . si quieres una señal de 1KHz, el periodo es de 1ms, pues para un ciclo de trabajo del 50% cargas en el timer 500ns, cuando salta la interrupcion, pues cargas 1ms-500ns, para un clclo del 80%, pues para ton cargas 800ns, y para toff cargas 1ms-800ns. de esta forma es variable.
para hacer lo del adc simplemente es una regla de 3, para una lectura de 1024 (el conversor es de 10 bits) haces que la salida sea de 100, y para una lectura de 0, un ciclo de trabajo 0%.
Yo tengo hecho un programa asi pero con el pic18f con el modulo CCP.
Un saludo
 
#5
Entiendo amigo, eso es lo que he estado intentando hacer... De hecho el PWM con los micro 18f no tengo problema, la cuestión es que con los retrasos generador por cada instrucción hacen que el "PWM" varie mucho es decir nunca queda estable siempre esta como dando saltos... ese es el problema... :/

Igual gracias por responder...
 
#6
pero es que no hay otra forma de hacerlo, de todas formas lo que pueda variar va a ser muy poco, estamos hablando de 3 instrucciones? (dentro de la interrupción), una para saber si estamos en nivel alto o nivel bajo, otra para escribir en el registro. La adquisición de datos del adc lo puedes hacer en el programa principal que seguro que te da tiempo de sobra, es decir puedes ir leyendo el adc continuamente, y cuando entre en la interrupción tan solo escribir los nuevos valores, incluso el calculo de ton y toff podrías hacerlo en el principal.
Un saludo
 
#7
Eso pensé, pero de verdad que no funciona bien... voy a esperar probar con un osciloscopio porque en simulación con proteus no se ve muy bien...
 

Dr. Zoidberg

Well-known-Papá Pitufo
#8
Eso pensé, pero de verdad que no funciona bien... voy a esperar probar con un osciloscopio porque en simulación con proteus no se ve muy bien...
En la versión de Proteus que yo uso, el 12F629 (hermano menor del 12F675) directamente NO FUNCIONA, así que tengo que probar los algoritmos en el 16F84A o alguno superior y luego adecuar los resultados...
 
#9
Hola
Utilizando la interrupción del timer0,seria algo parecido a esto,obtienes un pwm que puedes variar de 0 a 255 con la varible duty.

PHP:
#int_RTCC
void  RTCC_isr(void) 
{
ciclo++;
      if(ciclo==0)
         port_a.1=1;

      if(ciclo==duty)
         port_a.1=0;
set_timer0(frecuencia);
}
Un saludo,
 
Última edición por un moderador:
Arriba