Autor Tema: velocidad constante en motores DC ante cambios bruscos de carga con PIC...  (Leído 56257 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #45 en: 04 de Febrero de 2012, 14:43:28 »
El problema está en llevar el terminal negativo del motor a masa (dependiendo del sentido de giro el terminal negativo es distinto)

En los circuitos que hemos publicado hasta ahora, una resistencia lleva a masa un terminal, pero eso no es suficiente con dos sentidos de giro.

Saludos

Desconectado amyver

  • PIC12
  • **
  • Mensajes: 75
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #46 en: 06 de Febrero de 2012, 14:31:38 »
El problema está en llevar el terminal negativo del motor a masa (dependiendo del sentido de giro el terminal negativo es distinto)

En los circuitos que hemos publicado hasta ahora, una resistencia lleva a masa un terminal, pero eso no es suficiente con dos sentidos de giro.

Saludos

mil disculpas habia olvidado que el micro tiene muchos canales analogicos por los cuales se puede tomar las lecturas de la Back-emf...se que el problema principal ahora es el aterramiento del motor...pero me surge la inquietud de por que no usar los transistores que se estaban usando en los circuitos anteriores????

Ha otra cosa, bueno estube analizando tu codigo y tienes funciones escritas, pero que no las llamas en ningun momento (ej. dcmot_pwm() ), asi como tambien usas variables que no estan declaradas (ej. DCMOT_BEMF)... bueno en realidad no programo en C18, asi que si me equivoco en algunas de las observaciones mil disculpas... :mrgreen: :mrgreen: :mrgreen:

saludos...

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #47 en: 06 de Febrero de 2012, 16:48:15 »
Tienes toda la razón con las funciones c ...
Ya las he 'limpiado'. Cuando pasé a utilizar el módulo PWM del micro olvidé quitar las funciones con las que simulaba por soft el PWM.

Ahora mismo tengo parado la parte hardware porque estoy modelando el motor y escribiendo un manual que explica cómo funcionan los motores cc:

   GUIA: Motores de corriente continua

Cuando termine, se podrá controlar mucho mejor la velocidad del motor.

Te adelanto que el PID responde cada 10ms (cada muestreo de Back-emf) y durante este tiempo el motor puede acelerarse o frenarse casi un 60%.
Por eso la regulación actual tiene oscilaciones excesivas de velocidad. Para evitarlo es necesario realizar una compensación del ciclo PWM con la corriente del motor.

Para hacer una regulación de corriente es necesario sensar los picos de corriente en la resistencia de sensado.

Hay que diseñar un cto que detecte y amplifique las corrientes de pico.

Después habrá que modificar el ciclo PWM en función de la corriente. Esto dará una velocidad de respuesta menor de 1ms, mucho mejor que la del PID, con la que se evitarán las oscilaciones de velocidad.

En cuanto a la medición de los dos sentidos de giro: hay que llevar el motor a tierra con 2 mosfet.

Por ahora puedes probar el cto que he publicado y me cuentas cómo te funciona: http://www.todopic.com.ar/foros/index.php?topic=37404.msg311512#msg311512

Saludos.
« Última modificación: 06 de Febrero de 2012, 19:27:04 por picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #48 en: 06 de Febrero de 2012, 18:50:09 »
Necesitamos ayuda:

¿Alguien sabría  "traducir" el programa de 5 mensajes atrás de C18 al compilador CCS?

http://www.todopic.com.ar/foros/index.php?topic=37404.msg311512#msg311512


Saludos

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #49 en: 06 de Febrero de 2012, 19:22:46 »
Yo lo puedo hacer, aunque talvez demore un poco, por cuestiones de tiempo.

Solo necesito saber para que micro es y la frecuencia de operacion

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #50 en: 06 de Febrero de 2012, 19:31:09 »
Yo estoy trabajando con el PIC18F2550 a 20Mhz

amyver ¿Qué micro vas a utilizar?

A propósito Sander, el programa ya funciona para un sentido de giro ¿Te animas a probarlo sobre protoboard?

Saludos.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #51 en: 06 de Febrero de 2012, 19:42:18 »
yo me animo  :-/ ,  lo que pasa es que no encontre el L6203 por mi ciudad, asi que pense en armar un puente H con MOSFETs discretos, pero luego me di cuenta que iba a necesitar algun driver para los MOSFETS para poder manejarlos de forma mas eficiente, y tampoco consegui esos drivers, asi que para probarlo voy a usar el  L293, que es parecido al L6203 pero para motores mas pequeños.

Voy a tratar de probarlo con el mismo micro, o talvez pruebe otro sin USB

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado amyver

  • PIC12
  • **
  • Mensajes: 75
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #52 en: 07 de Febrero de 2012, 12:19:38 »
yo me animo  :-/ ,  lo que pasa es que no encontre el L6203 por mi ciudad, asi que pense en armar un puente H con MOSFETs discretos, pero luego me di cuenta que iba a necesitar algun driver para los MOSFETS para poder manejarlos de forma mas eficiente, y tampoco consegui esos drivers, asi que para probarlo voy a usar el  L293, que es parecido al L6203 pero para motores mas pequeños.

Voy a tratar de probarlo con el mismo micro, o talvez pruebe otro sin USB

Saludos

Hola sander me parece genial que te animes a traducir el codigo de los programas de c18 a C... bueno con respecto al micro que usaras
yo la verdad pienso que no habria un gran problema entre uno u otro, puedes escojer uno que maneje PWM, ADC y usart ... bueno yo propongo usar el PIC16F877A..

Ha y con respecto al driver que pretendes usar, te sugeriria el L298, que maneja mayores corrientes que el L293, pero menores corrientes que el L6203...

Saludos. :-) :-) :-)

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #53 en: 07 de Febrero de 2012, 13:57:55 »
El L293 sólo vale si quieres controlar un motor pequeño. (Yo lo he utilizado en ocasiones)

En teoría llega hasta 2 amperios, pero consumiendo mucha potencia y con mucha caída de tensión (más de 3 voltios)

Otras desventajas:
   No permite medir bien la corriente por el motor.
   No tiene diodos rectificadores y hay que añadirles. (4 por motor)
   Es relativamente caro y sólo llega a 2 Amperios.

Creo que no es adecuado para este proyecto.
Puedes esperar a que publique un sencillo driver para MOSFET en el lado alto. Eso te servirá para controlar el motor en un sentido de giro.
Si quieres luego ampliar a 2 sentidos de giro, tendrás que poner 4 mosfet.

Saludos.
« Última modificación: 07 de Febrero de 2012, 14:02:24 por picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #54 en: 07 de Febrero de 2012, 20:08:08 »
Driver discreto (con transistores) para Mosfet lado alto y lado bajo:



Saludos.
« Última modificación: 10 de Febrero de 2012, 18:36:09 por picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #55 en: 08 de Febrero de 2012, 20:56:46 »
Ya he terminado de modelar el motor de corriente continua y he publicado el manual en mi web y en el foro:

Modelo equivalente del motor eléctrico:
https://sites.google.com/site/picuino/motor_equivalent_model


GUIA: Motores de corriente continua
http://www.todopic.com.ar/foros/index.php?topic=37484.0


Ahora vamos a por la regulación de corriente del motor.


Saludos,

Desconectado amyver

  • PIC12
  • **
  • Mensajes: 75
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #56 en: 10 de Febrero de 2012, 16:57:57 »
Ya he terminado de modelar el motor de corriente continua y he publicado el manual en mi web y en el foro:

Modelo equivalente del motor eléctrico:
https://sites.google.com/site/picuino/motor_equivalent_model


GUIA: Motores de corriente continua
http://www.todopic.com.ar/foros/index.php?topic=37484.0


Ahora vamos a por la regulación de corriente del motor.


Saludos,

Muy bueno picuino, te comento que estos dias estube realizando pruebas con un motor de 30V y 30000RPM y los resultados fueron buenos.... aun no implemente el control PID, y la estabilizacion del motor se demora un poco, bueno ya me pongo en la tarea de realizar un mejor control, pero bueno tengo algunas dudas en las cuales requiero tu ayuda:

*Lo que hago es enviar al driver L6203 del motor una señal PWM de 4Khz.
*Cada 10ms quito la energia al motor y testeo la Back-emf (bueno le doy 1ms para que la señal se estabilice, y otro milisegundo para tomar el  valor de tension.)

La duda es la siguiente, con respecto a la frecuencia del motor te parece razonable??? y lo segundo te parece razonable el tiempo entre muestro y muestreo de la Back-emf???

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #57 en: 10 de Febrero de 2012, 18:00:58 »
Tiempo de muestreo
1ms para que baje la corriente: OK
El tiempo para que la corriente baje a 0 es muy pequeño, del orden de 0.5ms para la mayoría de los motores pequeños. De forma que 1ms puede estar bien.
De todas formas deberías comprobarlo con un osciloscopio. Si no tienes osciloscopio puedes esperar menos de 1ms a medir back-emf y enviar la lectura por rs232 a ver que pasa.

1ms para tomar el valor de la tensión: ???
Me parece excesivo. En cuanto se estabilice la tensión, la conversión se realiza en 20us como mucho.

Ten en cuenta que cuanto más tiempo esté el motor apagado, más se reduce su potencia y vibra. Cuanto menos dure el tiempo de sensado mejor.


Frecuencia de 4khz PWM para el motor
4khz puede estar bien, pero si utilizas el módulo PWM a 20kHz la conmutación no se oye (no hace ruido audible).
Además el motor se calentará menos y las corrientes de pico serán menores.


PID
Las ecuaciones del PID son sencillas:
/*
    Vref   = tensión que quiero tener en la back-emf (es equivalente a la velocidad del motor)
    Vemf = tensión de back-emf medida en el motor
    Vo     = tensión de alimentación al motor
    PWM  = valor de la señal PWM enviada al motor
    Vdd   = tensión de alimentación del puente PWM
    PWM_max = máximo valor de la señal PWM
*/

    Vref  = 50;                                    // valor deseado de tensión en el motor
    Verr  =  Vref - Vemf;                     // Error
    Intg  = Intg + Verr;                       // Valor integral
    Vo    = Vref + Verr*Kp + Intg/Ki;        // Alimentación del motor
    PWM = Vo * (PWM_max/Vdd);

Esta rutina se repite cada 10ms
Las constantes que funcionan bien para muchos motores son:
   Kp = 1
   Ki = 30
Depende de como responda tu motor al escalón.


La parte Derivativa del PID no se añade porque no hace falta en la mayoría de motores sin carga.

Saludos.
« Última modificación: 10 de Febrero de 2012, 18:37:41 por picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #58 en: 10 de Febrero de 2012, 18:21:23 »
Último programa que funciona correctamente para controlar un motor por back-emf.

Utiliza módulo PWM
Utiliza interrupciones para que los intervalos de tiempo sean exactos a la hora de calcular back-emf y PID.


Código: C
  1. /****************************************************************************
  2.    DC MOTOR SPEED CONTROL
  3.    PICUINO APPLICATION BOARD
  4.    https://sites.google.com/site/picuino
  5.  ****************************************************************************/
  6.  
  7. #include <p18cxxx.h>
  8. #include <stdio.h>
  9.  
  10. #define  FOSC 20000000
  11. #define  BAUD 57600
  12.  
  13.  
  14. #define DCMOT_TRIS_AN0     TRISAbits.TRISA0
  15. #define DCMOT_AN0          LATAbits.LATA0
  16.  
  17. #define DCMOT_TRIS_ENABLE  TRISCbits.TRISC0
  18. #define DCMOT_ENABLE       LATCbits.LATC0
  19.  
  20. #define DCMOT_TRIS_MOT1    TRISCbits.TRISC1
  21. #define DCMOT_MOT1         LATCbits.LATC1
  22.  
  23. #define DCMOT_TRIS_MOT2    TRISCbits.TRISC2
  24. #define DCMOT_MOT2         LATCbits.LATC2
  25.  
  26.  
  27. /****************************************************************************
  28.       INTERRUPTS
  29.  ****************************************************************************/
  30. #define TMR0_COUNT      (FOSC/((unsigned long)4*4*250*1000))      // Number of carrys per second
  31.  
  32. unsigned char milli_second, sys_clk;
  33.  
  34. void isr_main(void);
  35.  
  36. #pragma code HIGH_INTERRUPT_VECTOR = 0x0008
  37. void High_ISR (void) {
  38.    _asm goto isr_main _endasm
  39. }
  40.  
  41. #pragma interrupt isr_main
  42. void isr_main(void) {
  43.    if (INTCONbits.TMR0IF==1)  {        // if TIMER0 overflow interrupt
  44.       INTCONbits.TMR0IF = 0;           // Clear Timer0 interrupt flag
  45.       TMR0L += 6+3;
  46.       sys_clk--;
  47.       if (sys_clk==0) {
  48.          sys_clk = TMR0_COUNT;
  49.          milli_second++;
  50.       }
  51.    }
  52. }
  53.  
  54.  
  55. /*
  56.    Initialize isr routine and Timer0
  57. */
  58. void isr_init(void) {
  59.    INTCON = 0b11100000;  // Enable interrupts
  60.    T0CON =  0b11000001;  // Prescaler = 4  
  61.    TMR0L = 6+3;
  62.    sys_clk = TMR0_COUNT;
  63.    milli_second = 0;
  64. }
  65.  
  66.  
  67. /****************************************************************************
  68.     ADC FUNCTIONS
  69.  ****************************************************************************/
  70. /*
  71.   Read Analog Input AN0 or AN1
  72. */
  73. unsigned short adc_read(unsigned char channel) {
  74.    union {
  75.       struct {
  76.           unsigned char lob;
  77.           unsigned char hib;
  78.       };
  79.       unsigned short word;
  80.    } adc_val;
  81.  
  82.    // Configure ADC
  83.    ADCON0 = 0b00000001 + (channel<<2);   // ADC on
  84.    ADCON1 = 0b00001101;   // Analog inputs = AN0, AN1
  85.    ADCON2 = 0b10010101;   // TAD
  86.  
  87.    // Make an ADC conversion
  88.    ADCON0bits.GO = 1;        // ADC Hold and Start conversion
  89.    while (ADCON0bits.GO==1); // Conversion
  90.  
  91.    // Configure ADC
  92.    ADCON0 = 0b00000000;   // ADC off
  93.    ADCON1 = 0b00001111;   // All pins to digital inputs
  94.  
  95.    // Return ADC conversion
  96.    adc_val.lob = ADRESL;
  97.    adc_val.hib = ADRESH;
  98.    return adc_val.word;
  99. }
  100.  
  101.  
  102. /****************************************************************************
  103.       PWM FUNCTIONS
  104.  ****************************************************************************/
  105. /*
  106.   Initialize and configure PWM module
  107.   D = Duty cycle in range 0 .. 200
  108. */
  109. void pwm1_init(int D) {
  110.    T2CON = 0b00000100;    // Timer2 on, prescaler = 1
  111.    PR2 = 250;             // PWM Period = [(PR2) + 1] &#8226; TCY &#8226;(TMR2 Prescale Value)]
  112.  
  113.    if (D > 1000) D = 1000;
  114.    if (D<0)   D = 0;
  115.    DCMOT_MOT1 = 0;
  116.    CCP1CON = 0b00001100;
  117.    if (D & 1) CCP1CON |= (1<<4);
  118.    if (D & 2) CCP1CON |= (1<<5);
  119.    D = D>>2;
  120.    CCPR1L = D;
  121. }
  122.  
  123.  
  124. /****************************************************************************
  125.       RS232 FUNCTIONS
  126.  ****************************************************************************/
  127.  
  128. /*
  129.   Initialize USART for RS232 comunications
  130. */
  131. void rs232_init(void) {
  132.    PIE1bits.TXIE = 0;               // Disable RS232 interrupts
  133.    BAUDCONbits.BRG16 = 0;             // BRG16: 16-Bit Baud Rate Register Enable bit
  134.    SPBRGH = 0;
  135.    SPBRG = (FOSC/(16*BAUD))-1;        // Real Baud = FOSC/(16*(SPBRG+1))
  136.    TXSTA = 0b00100110;
  137.    RCSTA = 0b10010000;
  138.    TRISCbits.TRISC6 = 0;            // Enable TX output
  139. }
  140.  
  141.  
  142. /*
  143.    Send char to USART with pooling
  144. */
  145. int rs232_puts(char *buff, char pos) {
  146.    if (buff[pos] == 0)
  147.       return -1;
  148.    if (PIR1bits.TXIF == 1) {
  149.       TXREG = buff[pos];
  150.       return pos+1;
  151.    }
  152.    else
  153.       return pos;
  154. }
  155.  
  156.  
  157. /****************************************************************************
  158.       PID CONTROL
  159.  ****************************************************************************/
  160. #define KP  1.0
  161. #define KI  3.3
  162.  
  163. signed int Vref, Vmot, Err, Integ, Vo;
  164.  
  165. void pid_control(int Vref) {
  166.    char sample;
  167.    if (milli_second == 10) {
  168.        milli_second = 0;
  169.    }
  170.  
  171.    //*********************************
  172.    // BACK EMF SENSE
  173.    //*********************************
  174.    while (milli_second == 0) {
  175.       DCMOT_ENABLE = 0;
  176.       sample = 0;
  177.    }
  178.    if (milli_second == 1 && sample == 0) {
  179.       Vmot = adc_read(0);
  180.       DCMOT_ENABLE = 1;
  181.       sample = 1;
  182.    }
  183.  
  184.    //*********************************
  185.    // PID Speed control
  186.    //*********************************
  187.    if (sample==1) {
  188.       sample = 2;
  189.  
  190.       Err = Vref - Vmot;        
  191.       Integ += Err;
  192.       if (Integ>30000) Integ = 30000;
  193.       if (Integ<-30000) Integ = -30000;
  194.  
  195.       Vo = Vref + Err*KP + Integ/((int)(100.0/KI));
  196.  
  197.       pwm1_init(Vo);
  198.    }
  199. }
  200.  
  201.  
  202. /****************************************************************************
  203.       MAIN PROGRAM
  204.  ****************************************************************************/
  205. void main(void) {
  206.    char buff[80], buff_p;
  207.    char send;
  208.  
  209.    //*********************************
  210.    // Initialize
  211.    //*********************************
  212.    CMCON = 0b00000111;
  213.    ADCON1 = 0b00001111;
  214.    rs232_init();
  215.    isr_init();
  216.    
  217.    DCMOT_MOT1 = 0;
  218.    DCMOT_MOT2 = 0;
  219.    DCMOT_ENABLE = 0;
  220.  
  221.    DCMOT_TRIS_MOT1 = 0;
  222.    DCMOT_TRIS_MOT2 = 0;
  223.    DCMOT_TRIS_ENABLE = 0;
  224.  
  225.    DCMOT_TRIS_AN0 = 1;
  226.  
  227.    fprintf (_H_USART, "\r\nSystem OK.\r\n");
  228.  
  229.    //*********************************
  230.    // DC MOTOR SPEED CONTROL
  231.    //*********************************
  232.    Integ = 0;
  233.    send = 0;
  234.    while(1) {
  235.       pid_control(10);
  236.    
  237.       //*********************************
  238.       // Print PID values
  239.       //*********************************
  240.       TRISBbits.TRISB5 = 0;
  241.       if (milli_second==3 && send == 0) {
  242.          sprintf (buff, "Vm=%4d\tInteg=%5d\tVo=%4d\r\n", Vmot, Integ, Vo);
  243.          buff_p = 0;
  244.          send = 1;
  245.       }
  246.       if (send) {
  247.          buff_p = rs232_puts(buff, buff_p);
  248.          if (buff_p == -1)
  249.             send = 0;
  250.       }    
  251.    }
  252. }

Saludos.
« Última modificación: 10 de Febrero de 2012, 18:26:43 por picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: velocidad constante en motores DC ante cambios bruscos de carga con PIC...
« Respuesta #59 en: 10 de Febrero de 2012, 18:31:37 »
¿Alguien conoce técnicas para medir corriente de pico por una resistencia pequeña (0.1 ohmio)?

Para mejorar el control back-emf,  hay que incluir compensación de la corriente del motor.

Estoy intentando medir la corriente del motor con una resistencia a la salida del L6203
y no lo consigo por ahora.


Saludos.