Вы находитесь на странице: 1из 7

Controlando un Servomotor con un pic16f877, por medio de la interrupcin del timer0.

Cdigo que realice para entender el funcionamiento del servomotor, aclaro que no es la nica forma de realizarlo, y no conozco cual sea la mejor, esta es la primera aplicacin que realizo para controlar uno.Si crees que un poco de teora no te vendr mal te recomiendo este link: [Servomotor]. Bueno si ya conoces la teora, o eres de los que creen que aqu ay que arriesgar, manos a la obra.

Estoy usando el pic16f877a, 3 botones, 1 lcd, y por su puesto un Servo.

Como ya sabemos la forma de controlar el servo es por medio de PWM, osea un tiempo en alto y otro en bajo, a una frecuencia de 50hz -Osea todo el ciclo completo cada 20mS-, mi servo es el de la imagen, usado en aeromodelismo, no cuenta con datasheet, -no tiene marca- y no hace un giro exacto de 180, Su tiempo de operacin ronda de los 0.7mS para 0 y 2.7mS para hacer un giro de casi180.

[Cdigo]
#include <16f877a.h> #use delay(clock=20000000) #fuses HS, NOWDT, NOLVP, NOPROTECT #define LCD_E PIN_d0 #define LCD_CK PIN_d1 #define LCD_DAT PIN_d2 #define LCD_LED PIN_d3 #include <3pins.c> #use fast_io(B) int cont=0; int pos=16; #int_timer0 void Pwm() { set_timer0(150); cont++; if(cont>=200) {

cont=0; } if(cont<pos) { output_high(PIN_B0); } if(cont=pos) { output_low(PIN_B0); } } void main() { lcd_init(); set_tris_b(0b11111110); // Pin B0 como salida, setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // Preescaler de 4 EXT_INT_EDGE(l_TO_H); // se desborda de Alto a bajo enable_interrupts(INT_timer0); // Activar timer0 enable_interrupts(global); // Activar Interrupciones Globales set_timer0(150); while(1) { lcd_gotoxy(1,1); printf(lcd_putc,"Posicion: "); if(Input(Pin_b4)) delay_ms(100); if(Input(Pin_b4)) { pos=7; lcd_gotoxy(1,2); printf(lcd_putc," } if(Input(Pin_b5)) delay_ms(100); if(Input(Pin_b5)) { pos=15; lcd_gotoxy(1,2); printf(lcd_putc," } if(input(pin_b6)) delay_ms(100); if(Input(Pin_b6)) { pos=27; lcd_gotoxy(1,2); printf(lcd_putc," } } }

0 Grados

");

90 Grados

");

180 Grados

");

[Descripcin del cdigo] El objetivo del cdigo es que al presionar un botn conectado al pin_B4 ponga en alto por 0.7mS el pin_B0 del pic y transcurrido ese tiempo mantenga ese pulso en bajo por 17.3mS, y repetir este proceso indefinidamente, asegurando el ciclo de trabajo por 20mS. -De similar forma para 90 y 180 con sus respectivos tiempos-. La forma en la que logro esto es usando el timer0, el cual usando el oscilador de 20Mhz, iniciando el timer0 con un valor de 150 y con un preescaler de 4 obtengo que cada 100uS -0.1 mS- el timer0 desvordara y atender la interrupcin llamada #int_timer0, dentro de esta interrupcin ay una variable llamada cont, la cual contara las veces que desborda el timer0, dentro de esta misma funcin ay 3 condiciones, la primera reviza si el contador no a sobrepasado los 200 desvordamientos para no superar los 20mS (200 * 0.1mS = 20mS), una ves que sobrepase el contador se reinicia a 0, la otra condicin es para poner el servo en la posicin indicada por los botones, (B4, B5, B6). Por ejemplo si queremos ponerlo en 90 presionamos el boton B5, el cual tiene un valor de 15 en la variable pos la cual es checada en la segunda condicin, la cual compara el valor cont con el valor pos y si cont es menor a pos pone en alto el pin_B0, y la tercera es cuando los dos valores son idnticos apaga esta seal por los 18.5mS restantes (185 desbordamientos).

A mi parecer unos de los elementos mas interesantes en la construccin de los Robots son los Servomotores, y ya que mi carrera esta enfocada a la Robotica es imprescindible hacer uso de ellos. Pero que son? Bueno intentare explicarlos a continuacin. Si ya estas empapado de informacin y mucha teora acerca de que son y como esta conformados y lo que realmente quieres es hacer mover un servomotor, te recomiendo visites este enlace: Servomotor [CCS]

[Introduccin] Un servomotor -tambin llamado servo- es un dispositivo similares a los motores de corriente continua, y lo que lo caracteriza es que puede ubicarse en cierta posicion dentro de su rango de operacin -la cual varia en cada servo- y mantenerse estable en dicha posicin. Su componente principal es un motor de corriente continua, bsicamente al aplicar un voltaje al motor girara en un sentido a una velocidad considerable pero con un torque muy bajo, para aumentar el torque de este se usa una caja reductora, la cual transforma la velocidad de giro del motor en torsin.

[Componentes] Los componentes bsicos del servomotor son los siguientes:

1) Motor de CC: Es el actuador del servomotor es el dispositivo que genera el movimiento. 2) Tren de engranajes: Son los encargados de darle al servomotor una de sus mejores caractersticas, un buen torque. 3) Potenciometro: Es el elemento que conectado a la circuiteria nos indica en que posicin se encuentra el servomotor. 4) Circuito de control: Es toda la circuiteria interna que procesa la seal PWM, genera el cambio de giro del motor y procesa la lectura del potenciometro para indicarnos en que angulo se encuentra.

[Funcionamiento] La modulacin por ancho de pulsos o PWM (power width modulation), es el sistema mas empleado para el control de servomotores, Como funciona esto? Bsicamente se le tiene que estar aplicando un pulso peridico, para que el servomotor se posicione en un punto especifico, Y si dejo de aplicarle dicho pulso? Si al servo se le deja de aplicar este pulso dejara de ejercer una fuerza y cualquier fuerza externa podr hacer girar el eje del motor aunque este conectado a la alimentacin. As que para mantener al servo en la misma posicin y no quede expuesto a perderla, se necesita mandarle el mismo pulso repetidas veces.

Cada servomotor tiene condiciones distintas de operacin tanto en su alimentacin que varia de 4 a 8 volts, el giro maximo que pueden realizar -Normalmente de 0 a 180- as como la duracin del pulso que varia entre 1mS y 3 mS, normalmente la frecuencia a la que se operan es a 50hz quiere decir que todo el ciclo de operacin (Tiempo en alto y bajo del pulso) se ejecutara cada 20 mS, aunque en ciertos casos el ciclo de operacin puede rondar entre 10 y 30 mS

sin ningn problema. Haciendo cuentas, si operamos el servomotor a 50Hz, y queremos posicionar nuestro servomotor en 180, mandamos un pulso en alto con una duracin de 3mS (o depende del servo) luego ese pulso se detendra (Mantener en bajo dicho pulso) 17mS y se repetir este ciclo indefinidamente y as poder asegurar que el motor no quedara expuesto a fuerzas externas que muevan el eje.

[Conexiones] Los servomotores tienen 3 terminales, 2 corresponden a la conexin elctrica y el 3ro por donde inyectaremos nuestra seal, esta terminal la podemos conectar directamente a cualquier microcontrolador ya que internamente trae su etapa de potencia. De acuerdo a la marca del servomotor estas terminales pueden ser de distintos colores. Aqu las mas comunes:

[Vdeo] Si no entendiste ni media palabra de lo que e dicho, encontre un video en youtube, el cual puede dejar mas claro, esto de los servos. &amp;amp;lt;p&amp;amp;gt;&amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp ;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&amp;amp;amp;amp;amp;a mp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;am p;amp;lt;p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp; amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;p&a mp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; amp;lt;/center&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a mp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;am p;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;am p;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&a mp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;amp;a

mp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;amp;gt;&a mp;amp;lt;/p&amp;amp;gt; Como mencione antes, los servomotores pueden girar de 0 a 180 normalmente, existen algunos que llegan hasta 210, pero si requieres que den giros completos Ariel Palazzesi explica en su pagina como trucar un servomotor.

Вам также может понравиться