Proyectos‎ > ‎

Rotor de antena

publicado a la‎(s)‎ 3 ago. 2010 11:43 por Dario Fernandez   [ actualizado el 3 ago. 2010 12:07 ]
Este es el cógigo en CCS para programar un PIC16F883 para manejar un rotor de antena.

#include "rotor_v01.h"
#include <stdio.h>
#include <string.h>
#define LEDON output_high(PIN_C4)     //enciende un led en el pin_c4                   
#define LEDOFF output_low(PIN_C4)     //apaga el led
#define MOTOROFF output_low(PIN_C0)   //salida para el relay que alimenta el motor pin_c0
#define MOTORON output_high(PIN_C0)   //este es un relay simple
#define MOTORHO output_low(PIN_C1)    //salida para el relay invierte el sentido de giro pin_c1
#define MOTORAHO output_high(PIN_C1)  //este es un relay doble inversor
#define BT_IZ PIN_C2                  //botón de sentido de giro izquierda
#define BT_DR PIN_C3                  //botón de sentido de giro derecha  

int valor=0x00;

/*
 como el consumo del motor es variable, se toma un promedio de
 10 mediciones para establilizar el valor del mismo
*/
void toma_adc(void){
int i; //0-255
int16 xxx=0; // 0-255<int16
valor=0;
// Lectura del canal 0
set_adc_channel(0);
for(i=0;i<10;i++) {
delay_ms(1);
xxx=xxx+read_adc();
delay_ms(1); //para que se estabilice
}
valor=xxx/10;
}

void main() {
int sentido;
int flag_motor;
setup_oscillator(OSC_4MHZ|OSC_INTRC);
setup_adc_ports(sAN0|VSS_VDD); //configuramos el pin A0 como analogico
setup_adc(ADC_CLOCK_INTERNAL); //configura el converso
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
set_tris_a(0b11111111); // 0 Salida - 1 Entrada
set_tris_c(0b10000000); //
delay_ms(10);
printf("inicializando \n\r");
sentido=0;
MOTORHO;
do {
toma_adc();
if (valor>=50) {
MOTOROFF;
delay_ms(200);
flag_motor=0;
printf("Motor off, Valor= %u \n\r",valor);
if (sentido==0) {
sentido=1;
MOTORAHO;
delay_ms(50);
MOTORON;
delay_ms(1000);
MOTOROFF;
delay_ms(50);
} else {
sentido=0;
MOTORHO;
delay_ms(50);
MOTORON;
delay_ms(1000);
MOTOROFF;
delay_ms(50);
}
printf("sentido = %u \n\r",sentido);
delay_ms(2000);
if (input(BT_IZ)==0) {
if (flag_motor==1) {
flag_motor=0;
MOTOROFF;
delay_ms(1000);
} else {
MOTORAHO;
sentido=1;
MOTORON;
flag_motor=1;
delay_ms(100);
}
}
if (input(BT_DR)==0) {
if (flag_motor==1) {
flag_motor=0;
MOTOROFF;
delay_ms(1000);
} else {
MOTORHO;
sentido=0;
MOTORON;
delay_ms(100);
flag_motor=1;
}
}
LEDON;
delay_ms(100);
LEDOFF;
delay_ms(100);
}while(true);
}

y para la configuración del rotor_v01.h

#include <16F887.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer           
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES NOIESO                     //Internal External Switch Over mode enabled
#FUSES NOFCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V

#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=COM1)
Comments