Controlador PI corriente y velocidad motor 50W

Hola buenos días,

Estoy realizando mi TFG en el cual a través de las simulaciones de un motor he conseguido diseñar el controlador PI tanto de corriente como de velocidad.
Esa parte sería la base del proyecto. A continuación estoy montando una maqueta en la cual este motor se encargará de mover una cinta transportadora la cual hará que se muevan unas piezas de colores pasen a traves de un sensor de colores (TCS230) y al final de la cinta lleguen a una circunferencia partida en 3 cachos y controlada por un paso a paso (28byj 48) el cual girara en función del color detectado a ROJO AZUL o VERDE.

Lo que es la programación del sensor y del stepper, la tengo prácticamente terminada. El problema viene a la hora de programar el PID.

En el código una vez pasado el bucle del sensor de colores y del stepper parara a leer la realimentación tanto de corriente como de velocidad.

Mi idea es la siguiente. Necesito crear una interrupción que se ejecute una vez terminada la conversión A/D. Una vez entendido eso ya me encargaría yo de hacer que el controlador de corriente se ejecute mas veces que el de velocidad.

Ayer estuve buscando por internet y en el foro y he encontrado y adquirido varias ideas sobre las interrupciones y sobre el conversor A/D pero no acabo de conectarlas para lograr mi objetivo.

En primer lugar, preguntar si esto seria posible:

              .
.
.
.
.
.
.
.
intensidad=analogRead(A0);
while (bit_is_set(ADCSRA,ADSC));  
flag=1;
.
.
.
.
.

Podría así empezar la conversión y una vez finalizada saberlo utilizando el bit ADSC ???
En caso de poder realizarse asi como crearía a continuación una interrupción a traves del flag, es decir, cuando flag==1 ??

Si este codigo no es valido, que es lo mas probable como podría coseguir mi objetivo, es decir, entrar en una interrupción para ejecutar mi PI una vez finalizada la conversión??

Un Saludo y gracias de antemano,

La función analogread ya espera que acabe la conversión.

Tarda bastante eso si pero si usas

#define FASTADC 0

Tarda mucho menos unos 100us

Entonces con analogRead() y definiendo lo que me has comentado, podría obtener un tiempo de muestreo de 0.001s

Y una vez acabado el analogRead()
como podría hacer una interrupción?

Gracias

Como siempre me parece a mi, no expones correctamente tu problema para poder ayudarte.
Tu crees que con una interrupción luego de la conversión resuelves el problema.
Pero expone mejor el problema que crees se resolverá de ese modo para entenderte?

surbyte:
Como siempre me parece a mi, no expones correctamente tu problema para poder ayudarte.
Tu crees que con una interrupción luego de la conversión resuelves el problema.
Pero expone mejor el problema que crees se resolverá de ese modo para entenderte?

Intentaré explicarme mejor,
Mi idea es la siguiente;

-MAQUETA:
Un motor gira haciendo girar una cinta transportadora. Por esa cinta transportadora pasan piezas de colores que a través de un sensor se detectará el color del mismo. Una vez detectado el color , un stepper colocado al final de la cinta, sin ningún contacto con ella, girara en función del color consiguiendo así que la pieza caiga en el lugar adecuado.

-CONTROL
Se ha diseñado un controlador PI, tanto para la corriente como para la velocidad del motor. El controlador de corriente debe ejecutarse 10 veces antes de que se ejecute el de velocidad.

-IDEA
En el bucle se ejecute:
DETECTOR DE COLORES
STEPPER GIRA O NO
LECTURA DE LA INTENSIDAD DEL MOTOR
LECTURA DE LA VELOCIDAD DEL MOTOR

La idea es intentar usar el mínimo tiempo posible para la lectura analógica y una vez hecha la lectura pasar a una interrupción en la que se ejecute el PI de corriente 10 veces actuando sobre el PWM y una vez pasadas esas 10 veces se ejecute el PI de velocidad.

-PROBLEMAS
No tengo claro como hacer para que salte una interrupción una vez finalizada la lectura, es decir, la conversión A/D
Tampoco sé como hacer una interrupción que no sea dada por un Pin de arduino.

Un Saludo, espero que ahora se haya entendido mejor y podáis ayudarme,
Gracias de antemano.

Una consult:

controlador de corriente y controlador de velocidad?

Tienes una cinta transportadora controlada por un motor? DC? AC? no lo has dicho o no lo entendí. Supongo que DC.

A ese motor le mides corriente y velocidad, ya que hablas de controladores.

Por alguna razón que no has dicho (o yo no comprendo aún) la medición de la intensidad de corriente a ti te da el parámetro de control.

Porque no lo haces al revés. Fijas con un DAC el umbral de corriente, comparas contra la corriente que da el sensor del motor y la salida del comparador la inyectas a una Interrupción externa? Esa podría ser una manera.

Sigo sin ver porque el umbral de corriente debe dispararte una interrupción para tomar una acción.
La verdad me pierdo y no lo veo aún. Perdona.

Puedes hacer un esquema en una hoja y subir la imagen?
A ver si comprendo como funcionan esos controladores de corriente y velocidad?

El resto lo veo, una cinta, un detector de color, la cinta gira mas o menos rápido para entregar el objeto en una rueda que gira por un stepper supongo que a velocidad cte. Y el objeto cae en el agujero previsto para el color.
es un separador de M&M?

surbyte:
Una consult:

controlador de corriente y controlador de velocidad?

Tienes una cinta transportadora controlada por un motor? DC? AC? no lo has dicho o no lo entendí. Supongo que DC.

A ese motor le mides corriente y velocidad, ya que hablas de controladores.

Por alguna razón que no has dicho (o yo no comprendo aún) la medición de la intensidad de corriente a ti te da el parámetro de control.

Porque no lo haces al revés. Fijas con un DAC el umbral de corriente, comparas contra la corriente que da el sensor del motor y la salida del comparador la inyectas a una Interrupción externa? Esa podría ser una manera.

Sigo sin ver porque el umbral de corriente debe dispararte una interrupción para tomar una acción.
La verdad me pierdo y no lo veo aún. Perdona.

Puedes hacer un esquema en una hoja y subir la imagen?
A ver si comprendo como funcionan esos controladores de corriente y velocidad?

El resto lo veo, una cinta, un detector de color, la cinta gira mas o menos rápido para entregar el objeto en una rueda que gira por un stepper supongo que a velocidad cte. Y el objeto cae en el agujero previsto para el color.
es un separador de M&M?

-Si perdón el motor es de corriente continua y la idea es controlar la velocidad a través de la realimentación.
-El controlador de corriente no es necesario para controlar la velocidad, pero si para no tener un consumo elevado.
-Tengo que utilizar este tipo de controlador, ya que el proyecto y las simulaciones se basan en el diseño de estos controladores PI.
-En la programación la velocidad de realimentación está limitada por lo que tarde el conversor analógico digital en transformar la lectura. Por eso mi idea es hacer una interrupción una vez obtenida la lectura y ejecutar el controaldor. (Pero no se como se ejecuta una interrupción)

Este es el esquema de los controladores conectados al motor el primer PI es el de velocidad y el segundo el de corriente.

No se si podran ayudarme

Pero que cambia en que cuando termine de convertir el AD o sea luego de leer intensidad=analogRead(A0); por ejemplo llames a tu rutina de PI?
Generar una interrupción para que luego actúe sobre la misma rutina PI no lo veo eficiente.
Estas subestimando al arduino y su velocidad.

Como te digo Go_zalo si usas

#define FASTADC 0

Tarda mucho menos unos 100us

Entonces son 100uSeg y luego llamas a tu PI. Simple.
Asi estan hechos todos los lazos de control que he visto.
Si no te parece, arma un timer a 1mseg y dentro de esa ISR lees el ad y tomas acción.
O sea tu lazo se actualiza cada 1mseg. Asi se hacen estas cosas. Más rápido para una cinta transportadora no le veo la necesidad.

surbyte:
Pero que cambia en que cuando termine de convertir el AD o sea luego de leer intensidad=analogRead(A0); por ejemplo llames a tu rutina de PI?
Generar una interrupción para que luego actúe sobre la misma rutina PI no lo veo eficiente.
Estas subestimando al arduino y su velocidad.

Como te digo Go_zalo si usas
Entonces son 100uSeg y luego llamas a tu PI. Simple.
Asi estan hechos todos los lazos de control que he visto.
Si no te parece, arma un timer a 1mseg y dentro de esa ISR lees el ad y tomas acción.
O sea tu lazo se actualiza cada 1mseg. Asi se hacen estas cosas. Más rápido para una cinta transportadora no le veo la necesidad.

Y como podría hacerlo con el timer??
El problea es que no encuentro ningun ejemplo en internet con lazos de control para tener algun ejemplo

Un saludo y gracias por tu tiempo

Hay una librería que se llama TimerOne creo. busca Arduino TimerOne
Es facil de usar.
Eliges cada cuanto quieres la interrupción del timer. COmo dije supongamos 1mseg
Y luego en tu rutina de timer llevas adelante el control que buscas, incluida la lectura del AD, prueba sin #define FASTADC 0 y luego con ella. Verás que no afecta tu control.

Ya me imagino sabes las limitaciones de una interrupción. Nada de enviar por el serial datos. Los datos se envian en el loop cuando se detecta una bandera que si activas en la interrupción. Espero me comprendas.
Las variables que se comparten fuera de la interrupción deben definirse como volatile previamente al tipo de variable que uses.

supongamos intensidad la defines como unsigned int entonces para poder hacer algo en el loop la defines como global asi

volatile unsigned int intensidad;