TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: puchy 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
-
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 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.
-
Si es una de las frecuencias del oscilador interno (1 MHz) y tienes razon Nocturno, es una joyita es Pic.
-
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
-
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
-
¡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 (http://elrebujito.es/wikipic/index.php/Servo)
-
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
-
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
-
Me alegro que encontrases el fallo.
Venga, que ya casi tienes domado ese servo, ánimo :mrgreen:
-
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