Showing posts with label interfacing ultrsonic sensors. Show all posts
Showing posts with label interfacing ultrsonic sensors. Show all posts

Sunday, 19 July 2015

Interfacing Ultrasonic Sensors with Atmega

About Ultrasonic Sensors:

An ultrasonic sensor module has an ultrasonic transmitter, receiver and a control circuit.
It has 4 pins:
     Trigger
     Echo
     Vcc
     Ground

When we give trigger signal, the module will send 8 cycles of 40kHz ultrasonic pulses. These pulses go into the air, and at the same time, the ECHO pin becomes HIGH.  After reflection from any any object/obstacle on its path they are reflected back and are received by the receiver. Now the ECHO pin goes to LOW state.




So, our code has to perform two task:
     1. Give Trigger Signal.
     2. Based on the time for which ECHO pin remains HIGH, calculate the distance.

We can keep a note of time by two methods:
    1. Polling. (Run a while loop).
    2. Interrupt. (Stop the timer when ECHO pin becomes LOW).


Calculating Distance:
   
       Velocity of ultrasonic signal =  velocity of sound waves = v = 340 m/s.
       Distance in cm = v * t (in microseconds) / 2. 
       d =  t/58 cm.

Based on the above calculations, the code for Atmega32 is:


#include<avr/io.h>
#include<util/delay.h>
#include<compat/deprecated.h>
#include"uart.c"
#include"uart.h"
#include<avr\interrupt.h>
#include<stdlib.h>
uint8_t counter;
void ultraj(void);
int calculate(void);


void main()
{
DDRC = 0xFF;
PORTC = 0;
uart_init(UART_BAUD_SELECT(9600,F_CPU));
while(1)
{
ultraj();
}
}

void ultraj()
{
PORTC = 0xFF;
   DDRA = 0x01;
char buf[40] = {0};
int distance;
cbi(PORTA,0);
_delay_us(10);
sbi(PORTA,0);
_delay_us(10);
cbi(PORTA,0);
TCNT0 = 0x00;
TIMSK = (1<<TOIE0);
cbi(PORTA,1);
sei();
while(!(PINA&(1<<1)));
TCCR0 = 0x03;
while(PINA&(1<<1));
TCCR0 = 0x00;
distance =  calculate();
itoa(distance,buf,10);
uart_puts("disttnace :  ");
uart_puts(buf);
uart_puts("\n\r");
_delay_ms(70);
}
int calculate()
{
int timea,timeb,timec,timed;
int dist;
char chara[20] = {0};
timea = counter*255;
timeb = TCNT0+timea;
timec = timeb*2.44;
timed = (timec/58);
itoa(timed,chara,10);
uart_puts(chara);
dist = timed;
return dist;
}

ISR(TIMER0_OVF_vect)
{
counter++;
}








Powered by Blogger.