sábado, 2 de junio de 2018

Medir velocidad con encoder, atmega AVR

En este programa se mide la velocidad con un encoder el primer microcontrolador simula los pulsos del encoder een el segundo se implementa el medidor de velocidad, deben tener la libreria del LCD Esta programado en el Atmega164p en lenguaje c

/*
 * medir_velocidad_con_encoder.c
 *
 * Created: 17/03/2016 12:31:58
 *  Author: Toshiba Satellite
 */ 


#include 
#define F_CPU 8000000UL
#include 
#include 
#include "lcd.h"
#include 

uint8_t EEMEM   dir_distancia;

int pulsosv,velocidad;
int danterior;
unsigned int pulsosd;
unsigned int distancia;
unsigned int msm[16];

void configurar(void);

int main(void)
{
 configurar();
    while(1)
    {
        //TODO:: Please write your application code 
  //calculo de la disttancia
  distancia=(pulsosd*0.0261666*0.001)+danterior;
  
  lcd_gotorc(1,1);
  sprintf(msm,"%d   ",distancia);
  lcd_puts(msm);
  lcd_gotorc(1,7);
  lcd_puts("Km");
  
  lcd_gotorc(2,1);
  sprintf(msm,"%d   ",velocidad);
  lcd_puts(msm);
  lcd_gotorc(2,5);
  lcd_puts("Km/h");
    }
}

void configurar(void)
{
 DDRD=0b00000000;   //entrada para int0 sin pull up porq viene de un sensor
 DDRA=255;
 PORTD=0b00001000;
 
 //configuracion de la interruptions
 EICRA=0b00001011;
 EIMSK=0b00000011;
 EIFR=0b00000011;
 
 //inicializar lcd
 lcd_init();
 
 //
 
 //configurar eeprom
 danterior=eeprom_read_byte(&dir_distancia);
 
 //configuracion del timer
 TCCR1A=0;
 OCR1A=31249;
 TCCR1B=0b00001100;
 TIMSK1=2;
 TIFR1=2;
 
 sei();
 
}

ISR(INT0_vect)

{
 pulsosd++;
 pulsosv++;
}

ISR(TIMER1_COMPA_vect)
{
 
 
 if (pulsosv>36)
 {
  velocidad=pulsosv*0.08333*6.28*0.05*3.6;
  pulsosv=0;
 }
 
}

ISR(INT1_vect)
{
 eeprom_write_byte(&dir_distancia,distancia);
 sbi(PORTB,0);
}

//
Aqui esta el programa que genera los pulsos del encoder
/*
 * variador_de_frecuencia.c
 *
 * Created: 18/03/2016 11:47:32
 *  Author: Toshiba Satellite
 */ 


#include 
#define F_CPU 8000000UL
#include 
#include 

void configurar(void);

int main(void)
{
 configurar();
    while(1)
    {
        //TODO:: Please write your application code 
  
  ADCSRA=0b11000110;
  _delay_ms(2);
  OCR0A=ADCH;
    }
}

void configurar(void)
{
 DDRB=0b00001000;  //salida de OC0A
 
 //configuracion del timer
 TCCR0A=0b01000010;
 TCCR0B=0b00000100;
 
 
 //configuracion del ADC
 ADMUX=0b01100000;
 DIDR0=0b00000000;
 
}
//

No hay comentarios.:

Publicar un comentario