Autor Tema: Configuracion de un ADC para un servo  (Leído 9677 veces)

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

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Configuracion de un ADC para un servo
« Respuesta #15 en: 09 de Junio de 2008, 09:36:34 »
En cuanto a esto:
Si sacas unas cuenticas creo que el resultado va a ser que no vas a poder controlar el servo usando la instrucción de CCS para el PWM, pues no te va a dar un período de 20ms... se te queda corto el timer2.

Creo que el que tengo que sacar cuentas soy yo  :D
Me fijé bien que tú estás usando un cristal de 4MHz, de manera que el timer2 podrá contar hasta un período de unos 65ms si mis cálculos son correctos (me corriges si no es así eh Gonzalo).
Yo sí tuve que hacerlo con interrupciones porque uso cristal de 20MHz, así que el máximo período es de unos 13ms...  :D

Bueno pues me alegro que Tho0oR haya resuelto su problema, felicidades viejo!
Y no te preocupes, que para eso estamos aquí en el foro, para ayudarnos.

Citar
Oye, no ofendas así al gran pocher, comparándolo conmigo!
Vaya uno a saber que paso, no, mejor no, no quiero saberlo  :-/.
Para que no se quede como incógnita, lo que pasó fue que scientist en su primer post había colocado "el amigo pocher", en lugar de "el amigo firepic"... por eso dije que realmente es una ofensa al gran pocher el compararlo conmigo.
Menos mal que scientist lo arregló ya... por cierto, gracias por eso scientist!  :P

Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Configuracion de un ADC para un servo
« Respuesta #16 en: 09 de Junio de 2008, 18:11:15 »
Hola firepic.

El PWM solo puede funcionar a una frecuencia minima de 244,141 Hz es decir un periodo de 4,1 ms cuando el prescalador es igual a 1:16 y PR2 es maximo es decir 255. Como el postescalador no se aplica para el PWM, no es posible obtener frecuencias menores a estas. Por lo tanto en el 16F877 no es posible tener un PWM de 50 Hz. Tho0or, Tendrás que hacerlo con interrupciones.

Saludos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Configuracion de un ADC para un servo
« Respuesta #17 en: 09 de Junio de 2008, 19:44:23 »
Qué tal Gonzalo!
Gracias por la aclaratoria. No sabía que el postescalador no se aplicaba en el PWM. Me dió curiosidad y revisé la datasheet, y en efecto es como tú dices. Hay un recuadrito que justamente dice: "the timer2 postcaler is not used in the determination of the PWM frequency". Muy interesante, gracias!  :P
Bueno pues nada Tho0or, a darle con las interrupciones  :D
Esperamos tus resultados, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Tho0oR

  • PIC10
  • *
  • Mensajes: 18
Re: Configuracion de un ADC para un servo
« Respuesta #18 en: 10 de Junio de 2008, 04:14:28 »
buuufffff!!!


Lo que esta aprendiendo uno a base de andar por estos mundos. Gracias a todos, pero hay una cosa que deberiais saber, soy bastante novato y la unica interrupcion que he usado ha sido la de RB0 con una variable booleana para alternar 2 partes del codigo. En cuanto a las interrupciones del timer2, todavia no he mirado nada.

De momento bajare la frecuencia a 1Mhz. Pero tengo que aprender a usar las interrupciones del timer2. Algun post, link o algo interesante para "estudiar"?


Gracias amigooos!!!  :mrgreen:

Desconectado Tho0oR

  • PIC10
  • *
  • Mensajes: 18
Re: Configuracion de un ADC para un servo
« Respuesta #19 en: 10 de Junio de 2008, 06:16:39 »
Este codigo hecho para los 4 Mhz hace funcionar perfectamente al servo sin necesidad de interrupciones. He ajustado un poco el timer2 y ademas e creado una nueva variable de "correccion" para la conversion adc cuando la mete al PWM. Aver si os gusta, y os parece una chapuza!  :mrgreen:

#include <16F877.h>
#FUSES XT
#use delay(clock=4000000)                  
void main()                                    //PROGRAMA PRINCIPAL
{
float a=2.5;
long lectura=0;
SET_TRIS_C(11111011);                          //RC2 salida (por RC2 vamos a sacar el control para el servo)
SETUP_CCP1(CCP_PWM);                          //CCP1 como PWM
setup_timer_2(T2_DIV_BY_16,185,1);
RA0_ANALOG;
setup_ADC(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
set_adc_channel(0);
do
   {
   lectura = read_adc()*a;                    //lee el valor del potenciometro y lo multiplica por una constante que corrige el valor
   SET_PWM1_DUTY(lectura);                 
   delay_ms(20);
   }while(true);
}


os dejo ademas el archivo de simulacion por si quereis probarlo!!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Configuracion de un ADC para un servo
« Respuesta #20 en: 10 de Junio de 2008, 11:52:09 »
No creo que sea buena idea eso del período a 3ms como lo tienes ahora.
No conozco el entero funcionamiento de los servos, pero siempre trabajo bajo la premisa que el fabricante lo conoce mejor y hay que respetar sus especificaciones.
Trabajar con interrupciones no es tan difícil, si ya lo has hecho, pues ahora lo que vas a hacer es cambiar de interrupción. Yo creo que sí puedes.
Ahora bien, si quieres trabajarlo así, sin interrupciones, es tu decisión. Pero entonces por lo menos coloca:
Código: [Seleccionar]
setup_timer_2(T2_DIV_BY_16,255,1);
Para que aunque sea el período sea de unos 4ms...

En cuanto a esto:
y ademas e creado una nueva variable de "correccion" para la conversion adc cuando la mete al PWM.
Así como lo estás haciendo está medio extraño.
Porque estás multiplicando el valor leído del CAD por un valor float, pero después lo guardas en un entero?
Yo te recomendaría que guardaras la lectura en una variable int16, o long; luego multipliques por el factor en float y guardes en otra variable float; y después pases la variable float a entero haciendo casting.
Aunque sinceramente, no le veo lógica a eso. ¿Qué es lo que hace exactamente esa corrección?
Porque la conversión A/D la puedes configurar a 10bits, y luego el valor de duty también es de 10bits... entonces qué necesitas corregir?
Espero haberme explicado.

Como siempre digo, sólo son sugerencias, la decisión final está en tus manos.
Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web