hola amigos. Hace unos dias pedi algunos consejos sobre el control de un motor dc y un servo, y lo meti en lenguaje c para pics, pero bueno pienso que estaría mejor aca.
Bueno les cuento. Debemos realizar un proyecto de dos robots cooperativos, uno controlado por pc y otro que obedezca algun tipo de orden dada por el cacharrito controlado por el pc. De momento estamos empezando y ya tenemos mas o menos claro el control de motores. Un cacharrito dispone de dos motores dc y otro de un motor dc y un servo direccional. Ademas cada cacharrito dispone de dos pics, uno para el control de movimiento y otro para adquisicion de datos y envio de ordenes al pic de control de motores mediante comunicacion serie. Mas o menos tenemos esa idea y bueno, como ya les dije pedi consejo en otro subforo y el amigo pocher me contesto y tal y me dio alguna informacion. Si les parece, podria colgar todos los programas que vayamos haciendo y poco a poco y con los consejos de unos cracks como ustedes que salga una cosa bonita al final. No me importaria, conforme vayan saliendo las cosas (programas, construccion etc...) compartir este proyecto con ustedes.
Aqui les dejo el codigo del control del movimiento del cacharrito del servo y el motor. Tengo algunas dudas asi que me encantaría que le echarán un ojo y comentaran consejos posibles mejoras, etc....
Les comentos por encima: El portA es de entrada, donde los cuatro primeros bits indican la velocidad que nos servira para calcular el duty necesario para aplicarlo al motor. Los dos ultimos bits del mismo puerto indican la dirección del servo. Mis dudas son (lo tienen indicado en la linea de programa):
1. cada vez que haya un cambio de dirección, quiero que el motor dc se pare, empezar a meter pulsos al servo y despues de un tiempo volver a conectar el motor. Como ven eso ya lo he conseguido, el problema es que se me para siempre que sale del bucle incluso cuando hay un cambio de velocidad, cosa que no quiero.
2. En el instante que el cacharrito debe ir hacia atras, la posicion del servo es recto (la correcta), pero el pwm que le meto al motor, no se.... asi como lo tengo supongo ira hacia delante o dependiendo del duty.... No lo tengo claro.
Un apunte final, los bits de entrada del port a son los que tendra que mandar el otro pic mediante la comunicacion de los mismos.
Ahi va el codigo:
#include <16F876.H>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use Delay(Clock=4000000)
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5 // Identificador asociado al registro de dirección 5
#byte port_b = 6 // Identificador asociado al registro de dirección 6
#byte port_c = 7 // Identificador asociado al registro de dirección 7
void main(void){
set_tris_a(0b111111); //PortA entrada
set_tris_b(0b00100000); //RB5 es entrada de on / off
set_tris_c(0b0000000); //PortC salida
int x, xx, y, dutycalculado, n;
setup_timer_2(T2_DIV__BY_16,249,1) // Div=16 ; PR2=249 ; Postscale=1
setup_CCP1(CCP_PWM) //Configuguro PWM
while (1)
{
while (input(PIN_B5))
{
x=port_a // Leo estado del puerto
xx=0b110000 & x // And lógica para ver estado de los bits que me marcan la direccion
y=0b001111 & x // And logica para ver estado de los bits de velocidad
dutycalculado=y/(16*(1/4000000)) // Calculamos duty
while(x==port_a) // mientras no haya cambios (direccion o velocidad)
{
port_c=0x00 //AQUI TENGO DUDAS!!!!!!!!!!!!!!!!!!!
switch(xx)
{
case 0: //recto
output_high (pin_c1)
delay_us (1200)
output_low (pin_c1)
delay_us (18800)
for (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
case 16: //derecha
output_high (pin_c1)
delay_us (1733.333)
output_low (pin_c1)
delay_us (18266.667)
for (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
case 32: //izquierda
output_high (pin_c1)
delay_us (666.666)
output_low (pin_c1)
delay_us (19333.333)
or (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
case 48: //atras ?????????? Como hago que vaya hacia atras
output_high (pin_c1)
delay_us (1200)
output_low (pin_c1)
delay_us (18800)
for (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
}
}
}
}
}