Controlador de ângulo de antena parabólica usando ATmega16

Controlador de ángulo de antena parabólica usando ATmega16

Introducción Lo primero que debemos entender es ¿qué es un servomecanismo? El servomecanismo significa generar una salida de error como una diferencia entre la retroalimentación de salida y la entrada de control y reduce este error hasta que llegue a cero; esto significa • cuando el sistema alcanza el estado deseado • cuando el sistema produce la salida deseada Es ampliamente utilizado en 1. Aplicaciones industriales: correas planas, control de movimiento, posicionamiento de carga, sistemas de control de circuito cerrado 2. Aplicaciones de defensa: posicionamiento de cañones de armas, seguimiento y monitoreo de objetivos, sistemas de guía de misiles o bombas inteligentes. 3. Aplicaciones automotrices: vehículos guiados automáticamente (AGV), vehículos guiados no tripulados (UGV) 4. Aplicación aeronáutica: sistema de vuelo por cable, vehículo aéreo no tripulado (UAV) 5. Aplicaciones de los reguladores de potencia y voltaje – regulador de voltaje 6. Aplicación satelital: seguimiento satelital Podemos enumerar varias de estas aplicaciones. Entendamos brevemente una aplicación fascinante. Sistema de posición del cañón del arma Este es uno de los sistemas más necesarios para tanques, cañones antiaéreos, lanzadores de misiles terrestres u obuses. Una vez que el objetivo está fijado en todos estos sistemas, el arma siempre debe apuntar al objetivo hasta que se dispare el proyectil (bomba o misil). El objetivo se está moviendo (como un tanque o un avión), por lo que, según su posición de movimiento, el arma también debería moverse automáticamente. El movimiento del cañón depende de la diferencia generada por la posición anterior y la posición actual del objetivo. Y finalmente, gracias a un cálculo preciso, se dispara la bomba que siempre da en el blanco. Hablé de otra aplicación: control automático de ángulo (posición) bidimensional (2D) para antena parabólica. Posicionamiento automático de antena parabólica La antena parabólica siempre debe apuntar a un satélite en el espacio para recibir la máxima señal. Una ligera desviación también puede reducir la intensidad de la señal. La posición de la antena se fija definiendo dos ángulos (1) ángulo de acimut (2) ángulo de elevación. Se definen ingresando sus valores. Una vez introducidos estos valores, la antena parabólica se mueve en dirección horizontal y vertical mediante 2 motorreductores DC, uno para cada dirección (ángulo). A medida que se mueve en cualquier dirección, la desviación entre la posición deseada y la posición actual proporciona un error como entrada. La posición se detecta mediante dos RVDT (Transformador diferencial variable giratorio), uno para cada dirección. La figura de arriba muestra un diagrama del sistema. Se muestran el motor de acimut (motor AZ) y el motor de elevación (motor EL). Los sensores están conectados a los ejes de la antena a medida que la antena parabólica cambia de posición y la salida analógica del sensor cambia. Tan pronto como la posición del sensor coincide con la posición introducida en términos de ángulo de azimut y ángulo de elevación, ambos motores dejan de girar. Posteriormente, si por cualquier circunstancia hay alguna desviación en la posición de la antena, ésta alcanza automáticamente la posición deseada mediante motores. Si queremos cambiar la posición de la antena (quizás para rastrear otro satélite), entonces cambiamos el ángulo de acimut y el ángulo de elevación y nuevamente la antena se mueve a una nueva posición modificada. Esta es la descripción del sistema real. Está compuesto por motores grandes y pesados ​​que pueden soportar la carga, y el tamaño de la antena parabólica giratoria varía de 3 a 15 metros. El RVDT se elige (o incluso se personaliza) según el grado de rotación deseado de la antena. Proporciona la salida de voltaje analógica correspondiente según los cambios de posición de la antena. Todo el sistema está calibrado con precisión para la salida RVDT según la posición del ángulo de la antena en ambas dimensiones. Por ejemplo, considere que el RVDT tiene un rango angular de -45o a +45o, y la salida analógica correspondiente es de 0 a 5V. Esto significa que para un cambio de ángulo de 90o, el rango de cambio de voltaje es de 5V. Por lo tanto, por cada grado de cambio en el ángulo, el voltaje de salida cambia en 5/90 = 0,055 = 55 mV (aprox.). Si este RVDT se utiliza en un sistema tal que cuando la antena se mueve de 0o a 90o proporciona una salida de 0 a 5V, entonces cada cambio de grado en la posición de la antena se detecta como un cambio de grado ± 55 mV en la salida de voltaje. El sistema de control detecta este voltaje y genera señales para activar los motores. Los motores y el mecanismo de engranaje correspondiente también están diseñados para girar la antena en el rango de 0o a 90o (o 180o o incluso más) en incrementos de 1o en ambas dimensiones. Generalmente, el rango del ángulo de elevación es de 0o a 90o, y el rango del ángulo de azimut puede ser de 0o a 180o o incluso 360o. Así es como está diseñado y funciona el sistema real. Pero aquí hablé de la demostración de tal sistema. Modelo de demostración: – La figura muestra el diseño del sistema. Hay dos motores. Ambos motores son motorreductores de 12 V CC con una velocidad de 10 RPM. El motor que hace girar el plato en el plano horizontal se conoce como motor de acimut, y otro motor lo hace girar en el plano vertical que es el motor de elevación. Se utilizan dos sensores de interruptor óptico para proporcionar información sobre la posición angular del motor. Utiliza una rueda codificadora que se fija al eje de cada motor. La rueda codificadora tiene orificios (ranuras) a 10o, 20o, 30o, de la misma manera. La disposición está realizada de tal manera que a medida que gira el motor, también gira la rueda; sus orificios pasan a través de la abertura del sensor y generan un pulso. Esto significa que el sensor genera un pulso cada 10o de rotación del motor. La figura en sí describe cómo se hace todo el arreglo, pero permítanme explicarlo paso a paso. • Todo el sistema va montado sobre una caja de madera que alberga el circuito y sirve de base o plataforma para todo el mecanismo. • El 1er motor DC (motor azimutal) se fija dentro de una caja de madera mediante tornillos y pernos. La rueda de codificación (rueda de azimut) se fija con su eje como se muestra • El sensor 1 MOC7811 (sensor de azimut) también se monta verticalmente usando un pequeño soporte de madera en la misma plataforma de madera para que los orificios de la rueda de codificación de acimut pasen a través de la abertura del sensor. • Una tira de metal en forma de AU de aproximadamente 2 pulgadas de ancho está soldada directamente al eje del motor de CC. un lado de la forma de U es bastante largo con respecto a los demás, como se muestra. • Esta tira se utiliza para montar el segundo motor de CC y otro sensor. El segundo motor de CC (motor de elevación) se monta en la correa en U usando una abrazadera de montaje y tornillos en el lado corto, mientras que el sensor 2 (sensor de elevación) se fija en el extremo del brazo largo (lateral) • Una placa (hecha de cartón y papel de aluminio) está fijada directamente en el eje de este motor 2. La segunda rueda codificadora (rueda elevadora) también está fijada en el extremo del eje del motor 2 como se muestra • Esta rueda y el sensor de elevación se fijan nuevamente de manera que los orificios de la rueda pasen a través de la abertura del sensor. Aquí está la instantánea del modelo. Modelo de demostración funcionando: – • Inicialmente, el ángulo de ambos motores se ajusta en 0o en la rueda de codificación. Significa que la antena parabólica tiene un ángulo de acimut de 0o y un ángulo de elevación de 0o. • El ángulo de azimut se puede configurar de 0o a 350o en incrementos de 10o. El usuario puede configurar el ángulo deseado usando los botones • A continuación, el usuario debe definir un ángulo de elevación. Se puede ajustar de 0o a 70o en pasos de 10o usando botones • Cuando se configuran ambos ángulos, el usuario presiona otro botón para girar el plato • Cuando se presiona el botón, el motor de azimut comienza a girar para establecer el ángulo de azimut. A medida que gira el motor, la rueda codificadora también gira y sus orificios pasan a través de la abertura del sensor. El sensor genera pulsos que proporcionan información sobre la posición angular del motor. El motor gira hasta que el ángulo establecido y el ángulo de rotación real del motor se igualan. Si el ángulo establecido es mayor que el ángulo real del motor, el motor gira en el sentido de las agujas del reloj y si el ángulo establecido es menor, el motor gira en el sentido contrario a las agujas del reloj. • El siguiente motor de elevación comienza a girar. Gira el plato y también la segunda rueda de codificación. Nuevamente el motor gira hasta que el ángulo establecido y el ángulo de rotación real del motor se vuelven iguales. También gira en sentido horario o antihorario dependiendo de si el ángulo establecido es mayor o menor que el ángulo real. • De este modo, la antena parabólica alcanza la posición angular deseada en los planos de acimut y elevación. Hardware Como se muestra en la figura, el circuito se construye utilizando sensores MOC7811, chip controlador de motor L293D, LCD 20×4 y microcontrolador ATMega16. • Los circuitos del sensor están construidos alrededor del MOC7811. Ambos circuitos de sensores son idénticos. El LED IR interno recibe alimentación de 5 V a través de una resistencia limitadora de corriente de 33,0 E y el fototransistor se conecta en configuración de interruptor mediante una resistencia externa de 1 K. La salida final del circuito del sensor es a través del colector de fototransistor. • Ambas salidas de sensor están conectadas a los pines de interrupción externos PD2 y PD3 del ATMega16. • Los pines PORTA PA0 a PA4 están conectados a tierra a través de una red de resistencias (5 resistencias de 1K). Se conectan cinco botones a estos pines de modo que cuando se presiona el botón, se proporciona la lógica 1 como entrada. El resto de pines PORTA están conectados con Vcc. • PORTC controla los pines de datos LCD D0 – D7. Dos pines de control Rs y En o LCD están conectados a los pines PORTB PB4 y PB5 respectivamente. El pin LCD RW está conectado a tierra para permitir la grabación. • Los pines PORTB PB0 – PB3 accionan 2 motores de CC a través del chip L293D. Estos pines están conectados a la entrada del L293D y dos motores están conectados a las salidas del L293D. • Un cristal de 16 MHz está conectado a los pines de entrada del cristal del ATMega16. Dos condensadores de 22 pf están conectados para polarización y estabilidad del cristal. • Botón de reinicio conectado como se muestra con el pin de entrada de reinicio para proporcionar un reinicio manual al microcontrolador. Operación: - • Inicialmente, la pantalla LCD muestra el ángulo AZ establecido y el ángulo EL establecido en 0o. También muestra el ángulo AZ actual y el ángulo EL como 0o. • El usuario debe configurar el ángulo AZ y el ángulo EL presionando los botones de aumento/disminución del ángulo AZ y los botones de aumento/disminución del ángulo EL • Cada vez que se presiona un botón, el ángulo cambia en 10o • Después de configurar los ángulos de rotación, se presiona el botón del plato. Ambos motores giran uno por uno hasta que los ángulos de la antena parabólica coincidan con el ángulo de acimut y el ángulo de elevación establecidos. Software • El software está escrito en lenguaje C. • Compilado usando AVR Studio 4 • Probado usando AVR simulatro1 para el dispositivo ATmega16 (disponible con AVR Studio 4)

Código fuente del proyecto

###

 //Programa para
 
Aquí tenéis el programa completo con los comentarios necesarios.

 #incluir

 #incluir

 #incluir

 #incluir

 unsigned int set_az_angle=0, set_el_angle=0,dish_az_angle=0,dish_el_angle=0, turn_reverse_flag=0,up_down_flag=0;

 ///////////////// función para enviar datos que se mostrarán en la pantalla LCD //////////////////////

 void lcd_senddata (datos de caracteres sin firmar)

 {

 _delay_ms(2);

 PUERTOB=(1<  //obtenemos la longitud de la cadena

 para(i=0;yo // escribe cada carácter uno por uno

 s++; 

}

 }

 ////////////// función para inicializar la pantalla LCD ///////////////////////////////// //////////

 anular lcd_init

 {

 lcd_sendcmd(0x3E); // 8 bits por carácter

 lcd_sendcmd(0x0E); // pantalla encendida y cursor encendido

 lcd_sendcmd(0x01); // borrar la memoria LCD y el cursor de inicio

 lcd_sendcmd(0x84); //vamos a la columna 4 de la línea 1

 lcd_printstr("Antena parabólica"); // mostrar mensaje

 lcd_sendcmd(0xC4); //vamos a la columna 4 de la línea 2

 lcd_printstr("control de ángulo"); 

}
 
////////////////// función para mostrar el valor del ángulo en la pantalla LCD ///////////////////////// //

 void display_value (ángulo int sin signo)

 {

 sin firmar int t1,a;

 carácter asci sin firmar (3);

 int sin signo t;

 t = ángulo;

 si(t>=100)

 {

 a=2;

 mientras(t>=10)

 {

 t1=t%10;

 asci(a)=t1+0x30;

 t=t/10;

 El--;

 }

 asci(0)=t+0x30;

 }

 demás

 {

 t1=t%10;

 asci(2)=t1+0x30;

 t=t/10; 

asci(1)=t+0x30;

 asci(0)=0x20;

 }

 lcd_senddata(asci(0));

 lcd_senddata(asci(1));

 lcd_senddata(asci(2));

 lcd_senddata(0xDF);

 }

 /////////////////////// función para incrementar el valor del ángulo de acimut ////////////////////

 vacío inc_az_angle

 {

 si(set_az_angle<360)

 set_az_angle+=10; // incrementa el ángulo establecido en 10o hasta que no sea 360o

 lcd_sendcmd(0x8D);
 
display_value(set_az_angle); 

}

 /////////////////////// función para disminuir el valor del ángulo de acimut ////////////////////

 vacío dec_az_angle

 {

 si(set_az_angle>0)

 set_az_angle-=10; // disminuye el ángulo establecido en 10o hasta que no sea 0o

 lcd_sendcmd(0x8D);

 display_value(set_az_angle); // mostrarlo en LCD 

}

 /////////////////////// función para incrementar el valor del ángulo de elevación //////////////////

 vacío inc_el_angle

 {

 if(set_el_angle<70) set_el_angle+=10;

 lcd_sendcmd(0xCD);

 display_value(set_el_angle); 

}

 /////////////////////// función para disminuir el valor del ángulo de elevación //////////////////

 vacío dec_el_angle

 {

 if(set_el_angle>0) set_el_angle-=10;

 lcd_sendcmd(0xCD);

 display_value(set_el_angle); 

}

 //////////////// función para rotar el plato /////////////////////////////// ///////

 vacío rotar_plato

 {

 si(set_az_angle>plato_az_angle) // el nuevo ángulo az establecido es mayor
 
rotar_reverse_flag=0; // girar el plato hacia la derecha

 demás // de lo contrario

 rotar_reverse_flag=1; // rotar el plato en el sentido contrario a las agujas del reloj

 if(set_el_angle>dish_el_angle) // si el nuevo conjunto el ángulo es mayor

 bandera_arriba_abajo=0; // mueve el plato hacia arriba

 demás // de lo contrario

 bandera_arriba_abajo=1; // mueve el plato hacia abajo

 si(rotate_reverse_flag==0)

 {

 //////// gire el plato CW hasta que el ángulo az establecido y el ángulo az del plato no sean iguales

 mientras(set_az_angle!=dish_az_angle) PORTB = 0x01;

 PUERTOB = 0x00; // parar cuando sea lo mismo

 }

 demás

 {

 // gira el plato en sentido antihorario hasta que el ángulo az establecido y el ángulo az del plato no sean iguales

 mientras(set_az_angle!=dish_az_angle) PORTB = 0x02;

 PUERTOB = 0x00; // parar cuando sea lo mismo

 } 

si(up_down_flag==0)

 {
 
// mueve el plato hacia arriba hasta que el ángulo establecido y el ángulo del plato no sean iguales

 while(set_el_angle!=dish_el_angle) PORTB = 0x04;

 PUERTOB = 0x00; // parar cuando sea lo mismo

 }

 demás

 {

 // mueve el plato hacia abajo hasta que se envíe el ángulo y el plato el ángulo no son iguales

 mientras(set_el_angle!=dish_el_angle) PORTB = 0x08;

 PUERTOB = 0x00; // parar cuando sea lo mismo

 } 

}  

int principal (vacío)

 {

 DDRC=0xFF; // inicializa los puertos como

 DDRD=0xC3; // entrada o salida

 DDRB=0xFF;

 DDRA=0x00;

 PORTC=0x00; 

PUERTOB=0x00;

 MCUCR = (1<

 RCIC=(1< // habilitar interrupciones externas 

saber ; // habilitar interrupciones globales

 lcd_init; // inicializa la pantalla LCD

 _delay_ms(2000); // espera 2 segundos

 lcd_sendcmd(0x01); // borrarLCD
 
lcd_printstr("Establecer ángulo AZ:"); // mostrar valores de ángulo

 display_value(set_az_angle);

 lcd_sendcmd(0xC0);

 lcd_printstr("Establecer ángulo EL:");

 display_value(set_el_angle);

 lcd_sendcmd(0x94);

 lcd_printstr("Ángulo del plato EL:");

 display_value(set_el_angle);

 lcd_sendcmd(0xD4);

 lcd_printstr("Ángulo del plato EL:");

 display_value(set_el_angle);

 bucle: while (PINA==0xE0); // bucle hasta que no se presione ningún interruptor 

interruptor (PINA)

 {

 caso 0xE1: // cuando se presiona el interruptor 1

 inc_az_angle; // incrementa el ángulo az

 _delay_ms(200); // retraso para el rebote de claves 

romper;

 caso 0xE2: // igual que arriba

 dec_az_angle;

 _delay_ms(200); 

romper;

 caso 0xE4:

 inc_el_angle;

 _delay_ms(200); 

romper;

 caso 0xE8:

 dec_el_angle;
 
_delay_ms(200); 

romper;

 caso 0xF0:

 rotar_plato; 

romper;  

}  

ir al bucle;

 }

 ///////////////// interrupción externa 0 rutina de servicio //////////////////////////// //

 ISR(INT0_vector)

 {

 si(rotate_reverse_flag==1) // si el plato gira al revés

 {

 if(dish_az_angle>0) plato_az_angle-=10; // disminuir el valor del ángulo en 10

 }

 más // de lo contrario

 {

 if(plato_az_angle<360) plato_az_angle+=10; // incrementa el valor del ángulo en 10

 }

 lcd_sendcmd(0xA2);

 display_value(plato_az_angle); // muestra el valor del ángulo en la pantalla LCD

 }

 ///////////////// interrupción externa 1 rutina de servicio //////////////////////////// //

 ISR(INT1_vector)

 {

 si(bandera_arriba_abajo==1) // si el plato se mueve hacia abajo

 {

 if(plato_el_angle>0) plato_el_angle-=10; // disminuir el valor del ángulo en 10
 
}

 más // de lo contrario

 {

 if(plato_el_angle<70) plato_el_angle+=10; // incrementarlo en 10

 }

 lcd_sendcmd(0xE2);

 display_value(plato_el_angle); // mostrarlo en LCD

 } 

###

Diagramas de circuito

circuito principal

Vídeo del proyecto

Volver al blog

Deja un comentario

Los comentarios deben ser aprobados antes de su publicación.