TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: johenrod en 04 de Abril de 2023, 15:24:47

Título: como implementar varias interrupciones en un control de velocidad?
Publicado por: johenrod en 04 de Abril de 2023, 15:24:47
cordial saludo...
estoy haciendo un control de velocidad de un motor 110v con escobillas, lo estoy controlando con u modulo esterno de cruce por cero y control pwm. este utiliza una interrupcion para cuando el modulo le envia la deteccion de cruce por cero y luego le envio la señal pwm para control de angulo de fase y ajustar la velocidad.(hasta aqui esta trabajando bien)

el problema es que lo controlo con un potenciometro con lectura A/D y asi ajustar la velocidad ademas, tengo un encoder optico con 8 aspas para tomar referencia de la velocidad y asi, estar en lazo cerrado para ajustar la velocidad cuando la carga cambie.
segun investigue seria bueno hacer lectura A/D por interrupcion y otra interrupcion para el encoder optico. entonces serian 3 interrupciones .
como podria implemnetar u ordenar las interupciones, cualquier orientacion la agredeceria ampliamente.
Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: DominusDRR en 04 de Abril de 2023, 16:07:08
cordial saludo...
estoy haciendo un control de velocidad de un motor 110v con escobillas, lo estoy controlando con u modulo esterno de cruce por cero y control pwm. este utiliza una interrupcion para cuando el modulo le envia la deteccion de cruce por cero y luego le envio la señal pwm para control de angulo de fase y ajustar la velocidad.(hasta aqui esta trabajando bien)

el problema es que lo controlo con un potenciometro con lectura A/D y asi ajustar la velocidad ademas, tengo un encoder optico con 8 aspas para tomar referencia de la velocidad y asi, estar en lazo cerrado para ajustar la velocidad cuando la carga cambie.
segun investigue seria bueno hacer lectura A/D por interrupcion y otra interrupcion para el encoder optico. entonces serian 3 interrupciones .
como podria implemnetar u ordenar las interupciones, cualquier orientacion la agredeceria ampliamente.

También depende del microcontrolador que usas y su velocidad de procesamiento. Uno de 16 o 32 bits podría ser adecuado (orientado a control de motores eléctricos) (si estuvieras usando uno de 8 bits).

Debes pensar en procesamiento en multitareas cooperativas, mientras que las procesos críticos usarías interrupciones y/o periféricos independientes.

Eso puedes solucionarlo a nivel de bare metal o puedes recurrir a un RTOs
Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: johenrod en 04 de Abril de 2023, 17:33:53
También depende del microcontrolador que usas y su velocidad de procesamiento. Uno de 16 o 32 bits podría ser adecuado (orientado a control de motores eléctricos) (si estuvieras usando uno de 8 bits).

Debes pensar en procesamiento en multitareas cooperativas, mientras que las procesos críticos usarías interrupciones y/o periféricos independientes.

Eso puedes solucionarlo a nivel de bare metal o puedes recurrir a un RTOs
gracias por tu respuesta..

 entiendo,,, pero si quisiera hacerlo con interrupciones como manejaria las prioridades.
 como se pueden manejar las prioridades?
Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: DominusDRR en 04 de Abril de 2023, 17:51:06
También depende del microcontrolador que usas y su velocidad de procesamiento. Uno de 16 o 32 bits podría ser adecuado (orientado a control de motores eléctricos) (si estuvieras usando uno de 8 bits).

Debes pensar en procesamiento en multitareas cooperativas, mientras que las procesos críticos usarías interrupciones y/o periféricos independientes.

Eso puedes solucionarlo a nivel de bare metal o puedes recurrir a un RTOs
gracias por tu respuesta..

 entiendo,,, pero si quisiera hacerlo con interrupciones como manejaria las prioridades.
 como se pueden manejar las prioridades?

Deberías indicar que microcontrolador estás ocupando.

Las interrupciones tienen niveles de prioridades, la más alta interrumpe a las más bajas. Así es como funciona el concepto de prioridad.

(https://pbs.twimg.com/media/Fs5fDzEX0AMswiy?format=jpg&name=medium)

También depende del lenguaje y librerías que usas para tu proyecto. En lenguajes de alto nivel no debes preocuparte por salvaguardar y recuperar en el contexto, mientras que en bajo nivel como asm, ese trabajado debe hacerlo el programador.

Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: johenrod en 04 de Abril de 2023, 21:49:07
es justo lo que requiero manejo de prioridades.

en el siguiente fragmento no entiendo estas lineas
  delay=adc*7.7;        //escalamiento hasta maximo periodo  adc 0 a 1024
      //                  //120Hz -> T:8mS = 8333uS max
Código: C
  1. long delay=7000;
  2. short bandera1=0;
  3. int contador=0;
  4. long adc=0;
  5.  
  6. #INT_timer1
  7. void timer1()
  8. {
  9.       adc=read_adc(); //lectura de potenciometro externo para temporizar disparo
  10.       delay_us(20);   //tiempo de conversion adc
  11.       delay=adc*7.7;        //escalamiento hasta maximo periodo  adc 0 a 1024
  12.       //                  //120Hz -> T:8mS = 8333uS max
  13.      set_timer1 (65526);
  14. }
Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: DominusDRR en 04 de Abril de 2023, 22:22:08
es justo lo que requiero manejo de prioridades.

en el siguiente fragmento no entiendo estas lineas
  delay=adc*7.7;        //escalamiento hasta maximo periodo  adc 0 a 1024
      //                  //120Hz -> T:8mS = 8333uS max
Código: C
  1. long delay=7000;
  2. short bandera1=0;
  3. int contador=0;
  4. long adc=0;
  5.  
  6. #INT_timer1
  7. void timer1()
  8. {
  9.       adc=read_adc(); //lectura de potenciometro externo para temporizar disparo
  10.       delay_us(20);   //tiempo de conversion adc
  11.       delay=adc*7.7;        //escalamiento hasta maximo periodo  adc 0 a 1024
  12.       //                  //120Hz -> T:8mS = 8333uS max
  13.      set_timer1 (65526);
  14. }

Bueno, obviamente ese código no lo has hecho tu, de ahí la duda de no saber que hace.

La línea 9, me parece que posiblemente está mal, ya que el tiempo de conversión del ADC debe ejecutarse antes de leer el ADC, por lo tanto, primero iría el retardo y luego la lectura (read_adc), pero tampoco necesariamente es algo crítico, sería de determinarlo.

Respecto a lo que multiplica el valor, sería de determinar para que sirve la variable denominada delay

Yo entendería que lo que se desea medir con el ADC, varía de 0 a 7884.8, y tiene un circuito de acondicionamiento para que esa señal de voltaje varíe de 0 a 5V (0 a 3.3V, ya que no indicas que tipo de microcontrolador usas).

Esta señal de voltaje varía en el ADC de 0 a 1024, y para convertirla de 0 a 7884.8, simplemente hace una regla de tres y multiplica por la constante 7.7.

Pero más de eso no se puede determinar.

Tienes un pequeño problema, y es que piensas que somos adivinos, deberías indicar lo siguiente:

Tipo de microcontrolador.

Tipo de compilador.

Esquemático del hardware utilizado.

Y código que tienes problemas o dudas, en este caso has compartido algo, pero más de eso no se puede determinar que intentas hacer.
Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: johenrod en 06 de Abril de 2023, 18:02:31
Si veo que esta un poco complicado pero no imposible, dado que no es facil hacerlo multitarea he optado por hacer una lectura A/D y luego desabilitar el conversor fijando un set point y luego solo leer las interruciones.
Gracias por la ayuda.
Título: Re:como implementar varias interrupciones en un control de velocidad?
Publicado por: Picuino en 09 de Abril de 2023, 13:53:20
Yo creo que no necesitas interrupciones de diferente prioridad. El proceso es muy lento en comparación con la velocidad del microcontrolador.

En una sola interrupción tienes que ir comprobando (con if) si el bit correspondiente a la interrupción está a nivel alto. En caso afirmativo, ejecutas el código de interrupción (muy breve) y reseteas el flag correspondiente.

La interrupción se ejecutará una y otra vez hasta que todos los flags de interrupción estén a cero.

La velocidad de giro yo la mediría con un contador que cuente pulsos de reloj entre dos flancos de la señal del encoder. Con esto mides tiempo entre pulsos. La velocidad será la inversa de ese valor. Esa es una función que lleva mucho tiempo de cálculo, por lo que lo mejor es ejecutarla pocas veces por segundo.

Saludos.