Autor Tema: :: PWM :: CCS :: PIC18F2550 :: SERVOS::  (Leído 25742 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #15 en: 20 de Julio de 2012, 12:33:01 »
  La autocorreción del servo es debido a que internamente tienen un preset, justamente para poder quedar en la posición indicada.
Seguramente se moverá un poquito debido a impuresas en el preset. Habría que ver que ocurre con un servo de gama alta (en cuanto a calidad).

  La repetición es justamente el período de la señal.

  En tu caso no se mueve porque está en vació, pero si es sometido a una fuerza seguramente se correrá de lugar. Es por ello que necesitan el refresco de la información.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #16 en: 20 de Julio de 2012, 13:10:17 »
Hola.

Hay que enviar continuamente la senal de PWM al servo para que quede fijo en la posicion. Yo lo hice con un PIC12F629 y el siguiente codigo:

Código: C#
  1. #include<12F629.h>
  2. #fuses HS,NOWDT,PROTECT,NOBROWNOUT,PUT,MCLR
  3. #use delay(clock=20M)
  4.  
  5. #define on                      output_high
  6. #define off                     output_low
  7.  
  8. #define OUT_SERVO       pin_a0
  9. #define bPLUS           pin_a1
  10. #define bMINUS          pin_a2
  11.  
  12. struct BytesPWM
  13. {
  14.         int Ticks;
  15.         int SetPoint;
  16. }PWM;
  17.  
  18. #int_TIMER0
  19. void PWMServo_isr(void)
  20. {
  21.         PWM.Ticks++;
  22.         if(PWM.Ticks==0)
  23.                 on(OUT_SERVO);
  24.                
  25.         if(PWM.Ticks>=PWM.SetPoint)
  26.                 off(OUT_SERVO);
  27.  
  28.         set_timer0(0);
  29. }
  30.  
  31. void main(void)
  32. {
  33.         setup_comparator(NC_NC_NC_NC);
  34.         setup_timer_0(RTCC_8_BIT|RTCC_INTERNAL|RTCC_DIV_1);
  35.         enable_interrupts(INT_TIMER0);
  36.         enable_interrupts(GLOBAL);
  37.         PWM.SetPoint=40;
  38.        
  39.         while(true)
  40.         {
  41.                 if(input_state(bPLUS))
  42.                 {
  43.                         delay_ms(40);
  44.                         if(input_state(bPLUS))
  45.                         {
  46.                                 PWM.SetPoint++;
  47.                                 if(PWM.SetPoint>=42)
  48.                                         PWM.SetPoint=42;
  49.                         }
  50.                         while(input_state(bPLUS));
  51.                 }
  52.                
  53.                 if(input_state(bMINUS))
  54.                 {
  55.                         delay_ms(40);
  56.                         if(input_state(bMINUS))
  57.                         {
  58.                                 PWM.SetPoint--;
  59.                                 if(PWM.SetPoint<=9)
  60.                                         PWM.SetPoint=9;
  61.                         }
  62.                         while(input_state(bMINUS));
  63.                 }
  64.         }
  65. }

El PWM se genera con la interrupción del TIMER0 y con los pulsadores ajusto la posición.

Saludos
El papel lo aguanta todo

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #17 en: 20 de Julio de 2012, 16:47:45 »
Hola

si estas en lo cierto AngelGris si lo desconecto se deja mover con la mano.
MLO eso de 42 y 9 es microsengundo verdad los meneas 15 grados uno y el otro el del 9
son 5 verdad


entonces debo de ingeniarmelas para enviarle la señal cada 20ms
imagino que en esta situacion no debo de usar retardos del tipo delay.

seria bueno usar es este enlace

http://www.todopic.com.ar/foros/index.php?topic=24801.0

ademas de estar enviandole constantemente esto al servo bueno en mi caso son 4 servos
tambine debe de estar libre el pic para otras cosas.

No se como me las voy a ingeniar esta vez.

voy a ver si me adapto eso par los microsegundos.

que opinais de ello.


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #18 en: 20 de Julio de 2012, 17:00:25 »
Hola.

No son uS, son multiplos de la base de tiempo que se genera con la interrupcion del Timer0 (51uS aprox.)

Saludos
El papel lo aguanta todo

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #19 en: 22 de Julio de 2012, 10:34:59 »
Hola

AngelGris la resistencia entre la entrada de pwm y el pic de que valor era?, en la documentacion
no logro encontrarla, ¿esa resistencia es para estabilizar la señal?

El dilema esta en como usar los timer
los tengo todos los tiempos en us no se si usar el timer 0 o el timer 1

los tiempos van de 110us a 700us
y para mas historia me gustaria usar tambien para los retardos los timer

¿como contar us, ms y segundos a la vez y ademas evitar usar int16

se acaptan ideas..

sigo madurando la idea


« Última modificación: 22 de Julio de 2012, 17:56:29 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #20 en: 22 de Julio de 2012, 11:25:17 »
  ¿Y cuál es el problema de tener que usar variables int16?

  Se pueden implementar varios contadores por soft que se incrementen con la interrupción del timer.

  Por ejemplo si el timer genera interrupción cada 10us, cuando tu contador llegue a 100 serán 1ms. En el ciclo principal del programa podés evaluar dichos contadores para ver si paso el tiempo estipulado.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #21 en: 23 de Julio de 2012, 09:28:59 »
Hola
tras mucho persarlo
voy a configurar el timer 0 para que produzca interrupcion cada 1us,
despues creare variables en ram que cuenten esas interrupciones:

timer= va de 255 a 000 crea una INT
el clock es 20Mhz
si los timer se incrementan cada 4 instruciones entonces

4 x  (1/20 000 000hz) = 0.2 usegundos

0.2 useg x 5 tick de timer  =  1us

si cargo el timer0 con set_timer0(251);

¿en ccs como se configura eso?, en el asistente:

te se muestra la resolucion: 0.2us, 0.4us, 0.8us,

overflow,depende de la resolucion
y despues te permite marcar esto con aspa:

RTCC_off,

trc_8_bit

si marcas alguno de estos se configura el rebose..

y para selecionar el oscilador: internal, external (ext_l_to_h o ext_h _to_l),

esto como se selecciona y lo de la frecuncia como va esto, ahi iría el 50 de 50 hercios del perido
o el 20Mz del cristal


alguien sabria decirme?

sigo investigando






« Última modificación: 23 de Julio de 2012, 09:32:20 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #22 en: 23 de Julio de 2012, 09:57:19 »
  Como primer punto creo que querer una interrupción cada 1us en C y a 20MHz te va a ser muy difícil. Ten en cuenta que, como vos bien dijiste, son 5 ciclos de instrucción, y entre que salta la rutina de interrupción y guardas las variables y se testea cual interrupción de activó (todo ese código lo agrega el compilador, sin que figure en el archivo C), ya van a pasar unos cuantos ciclos más. Distinto sería si lo programas en ASM donde tiene un mayor control de los tiempos, y aún así creo que estaría difícil.

  Para que cada interrupción se ejecute en el tiempo deseado, dentro de la rutina de interrupción tienes que precargar el timer con el valor adecuado que en tu caso sería "set_timer0(251)"


  ext_l_to_h o ext_h_to_l supongo que hace mención a la interrupción externa que se produzca por flanco ascendente o descendente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #23 en: 23 de Julio de 2012, 10:13:38 »
hola AngelGris

si ese es uno de los problemas que no he logrado resolver,
si hago eso que digo de cada 1us creo que saturale al micro
pero los tiempos del pwm no llegan a ms
en mi caso es 130us(0),365us(90), 610us(180).

otra cosa seria poner para que rebose cada 20ms y lo otro hacerlo contando ticnk del timer.

¿una pregunta miestras el timer esta contado, el micro esta realizando o pude realizar otra cosa
de forma paralela o semi paralela?


un saludo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #24 en: 23 de Julio de 2012, 10:24:45 »
hola AngelGris

si ese es uno de los problemas que no he logrado resolver,
si hago eso que digo de cada 1us creo que saturale al micro
pero los tiempos del pwm no llegan a ms
en mi caso es 130us(0),365us(90), 610us(180).

otra cosa seria poner para que rebose cada 20ms y lo otro hacerlo contando ticnk del timer.

¿una pregunta miestras el timer esta contado, el micro esta realizando o pude realizar otra cosa
de forma paralela o semi paralela?


un saludo


  El timer cuenta sin que nuestro programa influya, es decir que mientras vos hacés cosas el timer va contando.

  Una "solución", al menos para ir haciendo pruebas sería utilizar un timer para la trama (20ms) y otro timer para el tiempo en alto..
  Básicamente sería hacer que cuando pasaron los 20ms, se reseteen los contadores y a su vez se ponga en 1 la salida PWM, luego pasa a contar el timer que da el tiempo de trabajo y una vez que termina su cuenta se hace 0 la salida PWM.

  Al timer que da el tiempo en alto, lo podrías precargar por ejemplo con un valor leído desde el ADC o con una variable. Entonces ya no sería necesario que desborde cada 1us. sino que contaría el total del tiempo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #25 en: 23 de Julio de 2012, 20:39:31 »
Hola
el tiempo que permanece en alto el pwm y en bajo
se lo voy a pasar por i2c bueno se lo tengo que sasar por i2c.
lo que no se como voy ha hacer porque la comunicacion no dura menos de 20 milisegundos

una aclaracion- pregunta -confirmacion:

, tengo entendido que si utilizas interrupciones no se debe de usar los retardos de ningun tipo (delay..)
eso es cierto?  o es una leyenda urbana, por aca en el foro hay ejemplos asi, pero tambien hay hilos que
no lo recomindan sin retardos.

¿a quien le das  prioridad a la interupcion del timer o la del i2c?o a una tercera que domine ambas
uf...

eso me genera otra pregunta?
si cuando el micro tiene interrupcion deja lo que esta haciendo para atender a la interrupcion,
pregunta 1.- cuando termina esta interrupcion sigo donde lo dejo ante? verdad

si esto es asi..

es posible gener una interrupcion dentro de otra a modo de administrador de hilos...

si el  proceso 1 duro mas de t tiempo dejalo y sigue con el proceso 2
si este proceso no temino dejalo y sigue con el tres y si este tampoco se termino
 en el tiempo esperado vuelve al proceso 1 .. como un adminstrador de tareas
 regido por tiempo, en mi caso seria el refresco del pwm.

como hace el ordenador generado quantum de tiempos.. con los olgaritmos..

esto se debe de hacer de alguna forma con los pic de una forma sencilla...

voy a seguir apurando...


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #26 en: 23 de Julio de 2012, 21:00:34 »
  ¿Si o si es por I2C?

  Teniendo en cuenta una comunicación a 400KHz, nos da un tiempo de 2.5uS por bit. Suponiendo que se transmitan 16 bits de datos para el tiempo en alto y 16 bits para el tiempo en bajo. Cada 8 bits hay que agregar uno de ack, entonces...

8 bits de address
1 ack
8 bit tiempo en alto
1 ack
8 bit tiempo en alto
1 ack
8 bit tiempo en bajo
1 ack
8 bit tiempo en bajo
1 noack

es un total de 45 bits, a 2.5uS por bit nos da un total de 112.5uS. Eso sería lo que tardarías en mandar toda la info por I2C en el mejor de los casos. Pero no creo que llegues a tardar mucho más.


  No es bueno utilizar retardos dentro de la rutina de interrupción, porque entonces el programa quedaría colgado allí y a su vez no permitiría que atienda a otra interrupción. Pero en algunos casos que uno está seguro de que nunca se nos va a ejecutar otra interrupción mientras estemos atendiendo una, no habría demasiados problemas en incluir un pequeño delay.

  En los pic18, existen interrupciones de alta prioridad y de baja prioridad. Para saber cuales corresponden a cada grupo hay que ver el datasheet.

  Sí, si el micro está ejecutando algo y salta a la interrupción, luego de ella prosigue en el punto desde donde se derivo a la interrupción.

  Lo que planteas con eso de los tiempos es justamente lo que hace un RTOS.

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #27 en: 24 de Julio de 2012, 20:16:27 »
  Te dejo un ejemplo hecho en HiTech que maneja un servo en base al timer0 para el período (20ms) y con el timer1 maneja el tiempo en alto de la señal

Código: C
  1. #include <htc.h>
  2.  
  3. __CONFIG (1, HS & PLLPOSTDIV2);
  4. __CONFIG (2, WDTDIS);
  5. __CONFIG (3, LVPDIS & PBADDIS & MCLRDIS);
  6.  
  7. #define _XTAL_FREQ 20000000
  8.  
  9. void interrupt low_priority ssp(void)  //interrpcion de baja prioridad
  10. {
  11. }
  12.  
  13. void interrupt timer(void) // interrupcion de alta prioridad
  14. {
  15.   if ((TMR0IF == 1) &&  (TMR0IE == 1)) //interrupcion por timer0
  16.   {
  17.     LATC0 = 1;            // salida en 1
  18.     TMR0 = 65146;
  19.     TMR1ON = 1;           // enciendo el timer1
  20.     TMR0IF = 0;          
  21.   }
  22.  
  23.   if ((TMR1IF == 1) && (TMR1IE == 1)) // interrupcion por timer1
  24.   {
  25.     LATC0 = 0;           // salida en 0
  26.     TMR1ON = 0;          // apago el timer1
  27.     TMR1 = 58036;
  28.     TMR1IF = 0;
  29.   }
  30.  
  31. }
  32.  
  33. void main(void)
  34. {
  35.  
  36.   TRISC = 0;    // puerto C como salida
  37.   LATC0 = 0;    // salida en 0
  38.  
  39.   IPEN = 1;     // habilito prioridades de interrupcion
  40.   TMR0IP = 1;   // timer0 interrupcion de alta prioridad
  41.   TMR1IP = 1;   // timer1 interrupcion de alta prioridad
  42.   T0CON = 0x07; // configuro el timer0 (prescaler 256, modo 16 bits)
  43.   T1CON = 0x80; // configuro el timer1 (sin prescaler)
  44.  
  45.   // ambos timer trabajan con el ciclo de instruccion
  46.  
  47.   TMR0 = 65146;
  48.   TMR1 = 58036;
  49.   TMR0IF = 0;
  50.   TMR1IF = 0;
  51.   TMR0IE = 1;   // habilito interrupcion timer0
  52.   TMR1IE = 1;   // habilito interrupcion timer1
  53.   GIEH = 1;     // habilito todas las interrupciones de alta prioridad
  54.   TMR0ON = 1;   // enciendo el timer0
  55.   TMR1ON = 1;   // enciendo el timer1
  56.  
  57.   while (1)
  58.   {
  59.   }
  60. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #28 en: 25 de Julio de 2012, 08:48:14 »
Hola
estoy analizado varios codigos
gracias por tu aporte,


Tu antes manejaste ccs , verdad?
creo que no eres elprimero que empezo con ccs y se paso a C18
por que sera eso..?

Aca encontre un enlace parece bueno:
    
rtos ccs minor_cycle
http://www.todopic.com.ar/foros/index.php?topic=28860.0

Sistemas operativos en PIC
http://www.todopic.com.ar/foros/index.php?topic=15876.0

RTOS para PIC GNU
http://www.todopic.com.ar/foros/index.php?topic=15561.0

FreeRTOS - C18 - PIC18F2550 - LCD - Hola Mundo!
http://www.todopic.com.ar/foros/index.php?topic=31520.0

y aca otro que estoy buscando:
    
RTOS en CCS: Como gestionar las interrupciones ???
http://www.todopic.com.ar/foros/index.php?topic=25666.0

interrupciones a mi: lo estoy buscando no doy con el.


sigo de agua hasta el cuello..

« Última modificación: 25 de Julio de 2012, 11:10:24 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PWM :: CCS :: PIC18F2550 :: SERVOS::
« Respuesta #29 en: 25 de Julio de 2012, 09:50:20 »
...

Tu antes manejaste ccs , verdad?
creo que no eres elprimero que empezo con ccs y se paso a C18
por que sera eso..?
....


  Lo utilicé muy poquito. No me gustaba como se manejaba el tema de las salidas y las entradas. Luego, no me gusto el tema que sea de pago... Después encontré HiTech que su versión lite es gratis y la sintaxís me pareció más adecuada.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas