Go Down

Topic: Re: Como Asignar una interrupcion a flanco de la salida PWM? (Read 1 time) previous topic - next topic

Valen

Aug 30, 2011, 12:01 pm Last Edit: Aug 30, 2011, 02:41 pm by Valen Reason: 1
Pensaba:
Desenganchar la interrupción nada más empezar a ejecutarse la interrupcion (detachInterrupt).
esperar unos microsegundos. (habrá que ver cuantos....)
Leer la entrada analógica, y almacenar el resultado

ionhs

Que yo sepa las interrupciones son de entrada, aunque igor comentó que arduino tiene un porrón de interrupciones pero para eso hay que entrar al datasheet. Mira en el Playground los tutoriales de interrupciones te llevará al post donde se comentaba.

Con la poca información que has dado sobre lo que quieres hacer resulta complicado, porque por hacer seguro que se pueden hacer muchas cosas, como generar tu la señal PWM así podrás esperar lo que quieras.

aero_yo

Necesitas que salta exactamente con el PWM o con su frecuencia? en cualquier caso ya puedes hacer un código compacto, porque por defecto son 490hz

http://arduino.cc/en/Reference/AnalogWrite

Valen

Hola, se trata de que la salida PWM dispare un semiconductor que alimenta una caga, y esperar unos instantes, antes de leer la corriente que se establece por dicha carga. Y hacer esto constantemente, para monitorizarla.
Sí, tiene que sincronizarse con el flanco ascendente.
Quisiera evitar generar yo mismo la onda pwm, aunque si no hay otra forma.....

aero_yo

Hombre, podrías probar conectando la salida analógica al pin de interrupción no?

Igor R

#5
Aug 30, 2011, 12:25 pm Last Edit: Aug 30, 2011, 12:30 pm by Igor R Reason: 1
No te queda otra que tirar de datasheet.

Algunos buenos tutoriales en ingles:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106
http://winavr.scienceprog.com/avr-gcc-tutorial/program-16-bit-avr-timer-with-winavr.html

Veras que existen diversas fuentes de interrupcion y flags de los timers que puedes usar....

Si lo quieres hacer en plan facil (que no significa optimo) con funciones de Arduino y analogWrite te funciona para tus propositos, te unes el pin de salida del PWM a uno de los pines de interrupcion, y ya lo tienes....



Nota.- no tengo ni acentos ni enyes en este ordenador....

Valen

Gracias,
una solución sencilla sería emplear la entrada 2 ó la 3, como disparador de la interrupción. No es que me encante, pero sí que funciona, ya que la entrada 2 la estoy utilizando para atender al bus SPI que tengo conectado, y va bien.....

Igor R

#7
Aug 30, 2011, 12:49 pm Last Edit: Aug 30, 2011, 12:52 pm by Igor R Reason: 1
Me imagino que te refieres al pin de chip select para el SPI. Si tienes libre la otra, pues ya lo tienes o siempre tienes la posibilidad de cambiar dicho pin(chip select del SPi) por cualquier otro... Eso ya eleccion del disenyador.

Si te miras los timers, veras que puedes usar interrupciones que se generar al overflow y demas, pero claro, eso depende de cuanto quieres profundizar... Si te sobran pines, y vas a por lo sencillo, pues a unirlos....
No se a que velocidad vas hacer el PWM, pero ten en cuenta que tendras que tener cuidado con el codigo que pones al atender la interrupcion, ya que solo tendras el periodo del PWM para poder hacer todas las operaciones.


;)

Valen

Quiero trabajar con un PWM a 8KHZ.
Solo necesito hacer un AnalogRead(), así que espero que me de tiempo. En realidad, me valdría leer cada segundo, pero siempre sincronizado con el flanco de subida que toque.....


(En el bus SPI aprovecho el flaco de selección para limpiar las variables de la rutina de atención al SPI (este arduino está funcionando como slave))

Igor R

como curiosidad....
que tipo de carga es?
por que tienes que medir sincronizado con el pwm?



Valen

Es una carga muy inductiva, un motor mediano.
Quiero medir la corriente por la carga siempre en el mismo instante, para que el resultado de la medida no varíe tanto, y manejar así unos márgenes de tolerancia aceptables.

Igor R

Puedes hacer que el timer lance el inicio de la conversion mediante HW.
Tienes que mirarte el tema de tiempos, a ver si con las instrucciones de Arduino vas a cumplir requisitos...

Valen

#12
Aug 30, 2011, 02:27 pm Last Edit: Aug 30, 2011, 02:31 pm by Valen Reason: 1
Pensaba:
Desenganchar la interrupción nada más empezar a ejecutarse la interrupcion (detachInterrupt).
esperar unos microsegundos. (habrá que ver cuantos....)
Leer la entrada analógica, y almacenar el resultado en una variable volatile.


Cuando use el resultado leído, en el bucle del programa loop(), y haya pasado por ej. un segundo, volver a conectar la interrupción. (attachInterrupt). (esto para no sobrecargar el hardware, ya que no necesito leer todo el tiempo).

No sé si funcionará.....



Go Up