fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Programación veloci...
 
Avisos
Vaciar todo

Programación velocista, regulador P, dudas tipos de variable

15 Respuestas
3 Usuarios
0 Reactions
14.2 K Visitas
_jm_
Respuestas: 961
 JM
Topic starter
(@_jm_)
Prominent Member
Registrado: hace 20 años

Hola, ando programando el velocista para probar la placa de sensores con un 18f452 en C y el compilador de microchip, y como mi C está un poco olvidado me salen unas cuantas dudas sobre el tipo de variables que puedo usar.

Lo primero es que estoy usando variables de tipo float, da algún problema usar este tipo de variable en un 18f?

Luego estoy haciendo lo siguiente servo= 44 - errort*3;

Donde servo es un char, errort es un float, y en Delay100TCYx(servo); el argumento que va ahí es un unsigned char me parece, servo en la asignación va a salir siempre positivo.

Lo he puesto así directamente y parece ser que funciona... debo hacer algún tipo de conversión por el medio?

Adjunto todo el código, el regulador P os parece correcto?

Luego otra duda, si declaro las variables errors, errort, y contador dentro del main me da un error, lo soluciono poniendolas fuera, pero no sé el motivo.

Gracias. Saludos.

Video del funcionamiento:

http://www.youtube.com/watch?v=2lDU1N9XuXU
/***************************************************************************************
****************************************************************************************
** Programa para probar la placa de sensores, regulador proporcional.
** Pic18f452
** Cristal 16 MHz
** 18/12/2008 www.jmnlab.com
****************************************************************************************
***************************************************************************************/

#include <p18f452>
#include <delays>
#include <timers>

#pragma config WDT=OFF, LVP=OFF, OSC=HS, OSCS=OFF, PWRT=ON, BOR=OFF, STVR=ON

void inicializar (void);
void reseteo (void);
void timer2_isr (void);

#pragma code high_vector=0x08 // high interrupt vector en 0008h
void interrupt (void)
{
_asm GOTO timer2_isr _endasm // Salta a la ISR
}
#pragma code // default code section

#define LED1 PORTEbits.RE0 // Ambar
#define LED2 PORTEbits.RE1 // Rojo
#define SENSORES PORTEbits.RE2 // Placa de sensores
#define MINIZ PORTBbits.RB4 // Control miniz

#define R7 PORTCbits.RC0 //Extremo derecho
#define R6 PORTCbits.RC1
#define R5 PORTCbits.RC2
#define R4 PORTCbits.RC3
#define R3 PORTDbits.RD0
#define R2 PORTDbits.RD1
#define R1 PORTDbits.RD2
#define R0 PORTDbits.RD3 // Centrales
#define L0 PORTCbits.RC4 //
#define L1 PORTCbits.RC5
#define L2 PORTCbits.RC6
#define L3 PORTCbits.RC7
#define L4 PORTDbits.RD4
#define L5 PORTDbits.RD5
#define L6 PORTDbits.RD6
#define L7 PORTDbits.RD7 // Extremo izquierdo

//Variables
unsigned char DelayCounter1;
char servo = 44, velocidad = 44;
int contador=0;
int errors=0;
float errort=0;

//Programa principal

void main (void)
{
inicializar();
reseteo();
LED1 = 1;
SENSORES=1;

while(1)
{
errors=0;
contador=0;
errort=0;

if(L7==1) // Asignación de error
{
errors+=7;
contador++;
}
if(L6==1)
{
errors+=6;
contador++;
}
if(L5==1)
{
errors+=5;
contador++;
}
if(L4==1)
{
errors+=4;
contador++;
}
if(L3==1)
{
errors+=3;
contador++;
}
if(L2==1)
{
errors+=2;
contador++;
}
if(L1==1)
{
errors+=1;
contador++;
}
if(L0==1)
{
errors+=0;
contador++;
}
if(R0==1)
{
errors+=0;
contador++;
}
if(R1==1)
{
errors+=(-1);
contador++;
}
if(R2==1)
{
errors+=(-2);
contador++;
}
if(R3==1)
{
errors+=(-3);
contador++;
}
if(R4==1)
{
errors+=(-4);
contador++;
}
if(R5==1)
{
errors+=(-5);
contador++;
}
if(R6==1)
{
errors+=(-6);
contador++;
}
if(R7==1)
{
errors+=(-7);
contador++;
}
if (contador!=0)
{
errort=errors/contador;
servo= 44 - errort*3; //servo=centro-error*constante proporcional
}
else
servo=44;
}
}

//***************************FUNCIONES****************************************
void inicializar (void)
{
TRISA = 0b11111111; // Configuración de los puertos
TRISB = 0b11101111; //
TRISC = 0b11111111; //
TRISD = 0b11111111; //
TRISE = 0b00000000; // Puerto E como salidas.
ADCON1 = 0b00001111; // Todo puerto A como digitales.
PORTB = 0;
PORTE = 0;
OpenTimer2 (TIMER_INT_ON & T2_PS_1_16 & T2_POST_1_16); //TMR2IF=0 TMR2IE=1 TMR2ON=1 TMR2=0
RCONbits.IPEN = 0;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
PR2 = 250;
}

void reseteo (void)
{
INTCONbits.GIE = 0;
LED2 = 1; //3 parpadeos para detectar los posibles resets del pic
LED1 = 0;
Delay10KTCYx(200);
LED2 = 0;
Delay10KTCYx(200);
LED2 = 1;
Delay10KTCYx(200);
LED2 = 0;
Delay10KTCYx(200);
LED2 = 1;
Delay10KTCYx(200);
LED2 = 0;
INTCONbits.GIE = 1;
}

#pragma interrupt timer2_isr save=DelayCounter1 // interrupción, salvamos la variable de los delays

void timer2_isr ( void)
{
PIR1bits.TMR2IF = 0; //Limpia el flag de interrupción del timer2
MINIZ = 1;
Delay100TCYx(16); // 400 uS
MINIZ = 0;
Delay100TCYx(servo);
MINIZ = 1;
Delay100TCYx(16); //400 uS
MINIZ = 0;
Delay100TCYx(velocidad);
MINIZ = 1;
Delay100TCYx(16);
MINIZ = 0;
}

Responder
14 respuestas
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 17 años

Si te dan los tiempos no tienes ningún problema. El problema sería si tu función fuese más lenta, entonces tendrías que optimizar más el código. De todos modos, escalando de esta manera, siempre tendrás valores enteros, por lo que no necisitas floats.

De todos modos, si tomas esos valores de error, fíjate bien antes, porque tienes un fallo importante (no te aparecerá siempre, pero hará que algunas veces la lectura no sea correcta), y creo que ese error también lo has cometido en la placa. Fíjate bien en TODOS los incrementos de un led a otro.

Responder
_jm_
Respuestas: 961
 JM
Topic starter
(@_jm_)
Prominent Member
Registrado: hace 20 años

No entiendo, que error tengo en la placa? o con estos valores? todos los sensores están separados la misma distancia, y el punto medio lo tomo en la mitad de los dos fototransistores centrales.

Y los incrementos pueden tomar cualquier valor (igual da 1 que 30) mientras sean todos iguales, ya que la distancia en todos es la misma.

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 17 años

No entiendo, que error tengo en la placa? o con estos valores? todos los sensores están separados la misma distancia, y el punto medio lo tomo en la mitad de los dos fototransistores centrales.

Y los incrementos pueden tomar cualquier valor (igual da 1 que 30) mientras sean todos iguales, ya que la distancia en todos es la misma.
Tú mismo te has contestado, revisa tus INCREMENTOS y verás que NO TODOS son iguales, tal como lo has hecho.

Entonces verás que ese mismo problema lo tendrás en la placa (aunque tiene fácil solución).

Responder
_jm_
Respuestas: 961
 JM
Topic starter
(@_jm_)
Prominent Member
Registrado: hace 20 años

No sé, como no te refieras a los sensores centrales que en lugar de +30 y -30 deberían de ser un poco menor ya que quedan un poco más juntos del centro que el resto, además doy un salto de 60 cuando debería ser de 30, pero que me da igual ya que se anulan el uno al otro con los dos activos, y cuando esté sólo uno activo al dividir con más sensores tb se reduce, tengo error en el centro simplemente por la holgura mecánica de la dirección, con esto ya cuento. Sería como si le metiese un pequeño offset, puedo solucionar restando o sumando 15, 30, 45 al final de las operaciones según el caso.

Si puedo lo mejor es usar directamente float y les doy el valor 0 a los centrales, lo haré así primero y mediré tiempos. Y si no sale ya lo pensaré mejor.

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 17 años

Me refiero a que en el centro debería ser 0 para que todos los "saltos" los hagas de 30. Eso quiere decir que en el centro de tu placa deberías tener 1 sensora alineado justo al centro. O sea, 15 o 17 sensores en vez de 16.
El error lo tendrás siempre que intervengan los dos sensores centrales (R0 y L0) tanto si son 2 sensores como si son 3, 4 o 5.

De acuerdo que la desviación no es muy grande pero ahí esta y la solución es tan sencilla como usar un número impar de sensores y tener el central como valor 0.

Edito:
Y si no, cambia los valores para tener saltos iguales, por ejemplo:
-75 -45 -15 +15 +45 +75
pero de manera que entre sensor y sensor el salto de error sea el mismo.

No se, yo prefiero la solución de sensor central, pero cada uno...

Responder
Página 2 / 3
Compartir: