Ultrasonic Distance Sensor
with
PIC microcontroller
Ultrasonic distance sensor uses to measure the object
distance without physically contact. This type of sensor can be use in robots, machines, vehicles, distance measuring tools and etc.
Now we will know that how to work ultrasonic sensor and
what will the hardware/circuit required. Ultrasonic sensor has four pins 2 are
supply voltage pins, one digital signal output pin and forth pin uses for
trigger the sensor to get distance. From microcontroller side only single
digital input and single digital output pin would be need to communicate with
sensor. You can use any of the controller I/O port pins for this purpose.
Ultrasonic sensor works by
transmitting an ultrasonic burst and providing an output pulse that corresponds
to the time required for the burst echo to return to the sensor. By measuring
the echo pulse width, the distance to target can easily be calculated. For more
information see sensor manufacturer’s datasheet.
Software working procedure
- First
set the “trigger” pin for 10us to
start ranging.
- Wait
until “echo” pin not goes to high.
- Start
timer and incensement until “echo” pin
not goes to low.
- When
“echo” pin goes to low, stop timer.
- Calculate
time to distance by given formula.
Tm =
time (us) per increment of timer register
Count
= total increased register value
Distance (centimeter)
= (Tm * Count) / 58.82
Codes:-
#include <p18f2520.h>
#define Echo_pin PORTBbits.RB5
unsigned int rawDist, b;
int get_sensor_data(void);
void delay_10us(void);
int check_TM(void);
void main()
{
TRISB
= 0xF1;
PORTB
= 0x00;
T1CON
= 0x10;
T3CON
= 0x00;
while(1)
{
get_sensor_data(); // Use this
function where you need.
for(b=0;b<5;b++)
for(b=0;b<65000;b++); // Delay between next measurement.
}
}
int get_sensor_data()
{
int
data;
// Active sensor
PORTBbits.RB6
= 0;
PORTBbits.RB6
= 1;
delay_10us();
PORTBbits.RB6
= 0;
// Get data from sensor
while(Echo_pin
!= 1);
data
= check_TM();
return
(data < 400) ? data : 0;
}
void delay_10us()
{
TMR3H
= 0xFF; //
10us delay according to 20Mhz crystal
TMR3L
= 0xCE;
T3CONbits.TMR3ON
= 1;
while(PIR2bits.TMR3IF
== 0);
T3CONbits.TMR3ON
= 0;
PIR2bits.TMR3IF
= 0;
}
int check_TM()
{
int
a;
if(Echo_pin
== 1) // Check ECHO pin for high.
{
TMR1H
= 0x00;
TMR1L
= 0x00;
PIR1bits.TMR1IF
= 0;
T1CONbits.TMR1ON
= 1;
T0CONbits.TMR0ON
= 0; //
Timer register value increse in every 400ns
while(Echo_pin
!= 0); //
Timer register value will increase unilt ECHO pin is high.
T1CONbits.TMR1ON
= 0;
T0CONbits.TMR0ON
= 1;
a
= (TMR1L + (TMR1H * 256));
a
= (a / 2.5)/58.82; // 400ns time per increment of timer register.
a
+= 1;
return
a;
}
else
return 0;
}
No comments:
Post a Comment