Autor Tema: servo (pwm) con oscilador interno, que hago mal?  (Leído 6776 veces)

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

Desconectado puchy

  • PIC10
  • *
  • Mensajes: 47
servo (pwm) con oscilador interno, que hago mal?
« en: 26 de Octubre de 2006, 10:16:36 »
hola

quiero comtrolar un servo por hardware mediante un modulo ccp. el pic que utilizo es el 12f683.

bien la cosa es  para q pueda controlarlo necsito configurar el timer a 60 mz, y esto solo se puede conseguir con un cristal = o menor de 1mz (o eso creo)
pero no encuentro en ninguna tienda dicho cristal. entonces decidi usar el oscilador interno.  asi queda el codigo:

#include <12f683.h>
#fuses NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOCPD, INTRC_IO   //oscilador interno
#use delay(clock=1000000)  // cristal 1 mz

void main (){

 long duty_PWM1;
 
 setup_timer_2(T2_DIV_BY_1, 255, 1); //se configura el menor tiempo posible (60hz)
 setup_ccp1 (CCP_PWM);

 duty_PWM1 = 200;
 set_pwm1_duty(duty_PWM1);
do{
}
while(true);
}


pero le problema es q  el servo se vuelve loco  xDDD
sabeis si hago algo mal?

saludoss

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #1 en: 26 de Octubre de 2006, 18:00:37 »
hola

quiero comtrolar un servo por hardware mediante un modulo ccp. el pic que utilizo es el 12f683.

bien la cosa es  para q pueda controlarlo necsito configurar el timer a 60 mz, y esto solo se puede conseguir con un cristal = o menor de 1mz (o eso creo)
pero no encuentro en ninguna tienda dicho cristal. entonces decidi usar el oscilador interno.  asi queda el codigo:

#include <12f683.h>
#fuses NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOCPD, INTRC_IO   //oscilador interno
#use delay(clock=1000000)  // cristal 1 mz

void main (){

 long duty_PWM1;
 
 setup_timer_2(T2_DIV_BY_1, 255, 1); //se configura el menor tiempo posible (60hz)
 setup_ccp1 (CCP_PWM);

 duty_PWM1 = 200;
 set_pwm1_duty(duty_PWM1);
do{
}
while(true);
}


pero le problema es q  el servo se vuelve loco  xDDD
sabeis si hago algo mal?

saludoss


puchy, podrías revisar si la set_pwm1_duty admite como parámetro una variable long.  Sino, tal vez ahí esté tu problema.

¿A qué llamas que el servo se vuelve loco?

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #2 en: 26 de Octubre de 2006, 18:15:30 »
La instruccion #use delay(clock=1000000)  no sirve para setear el oscilador interno, necesitas usar setup_oscillator, aunque no recuerdo si podia configurarse solo a 1 MHz.
Que gran micro ese 12F683.

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #3 en: 26 de Octubre de 2006, 18:58:50 »
Si es una de las frecuencias del oscilador interno (1 MHz) y tienes razon Nocturno, es una joyita es Pic.
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado puchy

  • PIC10
  • *
  • Mensajes: 47
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #4 en: 27 de Octubre de 2006, 06:22:00 »
weno estube haciendo mas pruebas:

#include <12f683.h>
#fuses NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOCPD, INTRC_IO //oscilador interno
#use delay(clock=1000000)
setup_oscillator (1000000);

void main (){


do{
output_high(pin_a4);
delay_ms(1000);
output_low(pin_a4);
delay_ms(1000);
}
while(true);
}


este codigo en teoria debería hacer parpadear el led cada segundo; pos lo hace en menos, creo q en medio segundo. es decir que ya va algo mal  xD

Digo q se vuelve loco el servo porque empieza a dar vueltas completas (lo tengo trucado) sin parar jeje.

el pic este si q es una maravilla pero por ahora nos llevamos mal xDD

saludos

Desconectado puchy

  • PIC10
  • *
  • Mensajes: 47
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #5 en: 27 de Octubre de 2006, 06:44:30 »
weno lo del led ya ta solucionado, era cosa de los fuxes:

#fuses nowdt,noput,nobrownout,noprotect,NOMCLR,INTRC_IO

con esto el led ya parpadea cada segundo.

pero el servo sigue dando vueltas, alguna sugerencia?

saludos

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #6 en: 27 de Octubre de 2006, 09:31:02 »
¡Qué raro que te funcione bien el led!

La instrucción setup_oscillator recibe como parámetro un Byte, y no el nº de megahertzios a los que quieres trabajar.

Si ejecutas el PIC Wizard de CCS (cosa muy recomendable) y eliges un 12F683 con Oscilador interno a 1MHz verás que el código generado es:
   setup_oscillator(OSC_1MHZ);

Buscando en el fichero 12F683.h vemos que OSC_1MHZ está declarado como
   #define OSC_1MHZ    0x41

Por lo que cualquier parámetro distinto de 0x41 debería ofrecer un resultado errático.

Yo empezaría por arreglar eso para luego investigar el tema del servo.

Si quieres ver qué tipo de señales excitan a un servo, puedes leer algo aquí: Servo

Desconectado puchy

  • PIC10
  • *
  • Mensajes: 47
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #7 en: 28 de Octubre de 2006, 17:35:52 »
Buen apunte lo del define osc xDD.

Weno pues solucionado eso, el servo me sigue sin ir. Mi teoría es que los servos funcionan a 50 hz (los mios) y con el cristal de 1 mz va como mínimo a
61zs  :  T=(255+1)·4·(1/10^6)·16=0.0163384s   ----->  f=61Hz

Entoces como el pic tb tiene un osc interno de 500kz pues voy a intentar hacerlo con ese cristal (intentar poner 50zs justos).
 
Ya os contaré.

saludos


« Última modificación: 28 de Octubre de 2006, 17:47:40 por puchy »

Desconectado puchy

  • PIC10
  • *
  • Mensajes: 47
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #8 en: 28 de Octubre de 2006, 18:11:10 »
SOLUCIONADOOOO!!

weno pues la cosa es q me confucí al escribir el código.

setup_timer_2(T2_DIV_BY_16, 255, 1);   tenía puesto T2_DIV_BY_1  y claro daba una frecuencia de 900 y pico hercios xDDD

ahora tengo q calcualr los dutis para ver el mínimo y el máximo.


saludosss


« Última modificación: 28 de Octubre de 2006, 18:13:46 por puchy »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #9 en: 29 de Octubre de 2006, 02:34:53 »
Me alegro que encontrases el fallo.

Venga, que ya casi tienes domado ese servo, ánimo  :mrgreen:

Desconectado puchy

  • PIC10
  • *
  • Mensajes: 47
Re: servo (pwm) con oscilador interno, que hago mal?
« Respuesta #10 en: 29 de Octubre de 2006, 07:14:09 »
Weno por fin conseguido

El duty lo pongo entre 130 y 950  q son los 180 grados

lo que pasa es q cuando se pone en una posición a veces vibra, la posición la mantiene pero consumeee  puff, sabéis si hay alguna forma de evitar esto?

PD: sabéis si este pic (12f683)  tiene el I2C por hardware?  yo creo q no pero weno a lo mejor me dais una alegría xD
PD2: sabeis si hay algun pic de 8 patas que tenga 2 modulos de CCP?

SALU2
« Última modificación: 29 de Octubre de 2006, 08:33:37 por puchy »