[ARM] interfacing ultrasonic sensor hc sr05 with lpc i768

Status
Not open for further replies.

Rakesh Menon

Newbie level 4
Joined
Sep 1, 2013
Messages
7
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Visit site
Activity points
102
hi
I was working with interfacing of hc sr04 ultrasonic sensor with lpc1768 so as to display the distance from an obstacle to the sensor on an LCD display in centimeters ..
there were no errors in the code, but distance is not being varied its showing always as 0 cm..
i could not find the problem.. i'm sure that sensor is in good condition

i'm attaching the code




Microcontroller: LPC1768-Cortex M3
Clock: 12mhz
Compiler Keil uVision 4
********************************************************************************/

Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "lpc17xx.h"
#include "type.h"
#include "delay.h"
#include "lcd.h"                      //header file to program LCD
#define US_PORTCLR LPC_GPIO0->FIOCLR
#define US_PORTSET LPC_GPIO0->FIOSET
#define US_DDR     LPC_GPIO0->FIODIR
#define US_PIN     LPC_GPIO0->FIOPIN
#define US_ECHO   5                // pot 0 5th pin for echo
#define US_TRIG 6             // p0.6 for trigger
#define US_ERROR 0xffff
#define  US_NO_OBSTACLE 0xfffe
 
uint32_t d;
 
uint16_t getPulseWidth()
    {
 
                        uint32_t i,result;
 
       //Wait for the rising edge
       for(i=0;i<600000;i++)
       {
          if(!(US_PIN & (1<<US_ECHO))) continue; else break;
       }
 
       if(i==600000)
          return 0xffff; //Indicates time out
 
       //High Edge Found
 
       //Setup Timer1
      LPC_SC->PCONP |= 1 << 1;                                         //Power up Timer 0
            LPC_SC->PCLKSEL0 |= ( 1 << 2)|(1<<3);                        // Clock for timer = CCLK /8 -->12000000/8hz
                         LPC_TIM0->TC=0x00000000; // init counter
 
        LPC_TIM0->TCR |= 1 << 1;       // reset timer
                         LPC_TIM0->TCR |= 1 << 0;                                      // Start timer
 
       //Now wait for the falling edge
       for(i=0;i<600000;i++)
       {
          if(US_PIN & (1<<US_ECHO))
          {
             if((LPC_TIM0->TC) > 60000) break; else continue;
          }
          else
           break;
       }
 
       if(i==600000)
          return 0xffff; //Indicates time out
 
       //Falling edge found
 
       result=(LPC_TIM0->TC); //STORE COUNT IN RESULT
 
       //Stop Timer
       LPC_TIM0->TCR |= 0 << 0;
 
 
       if(result > 60000)
          return 0xfffe; //No obstacle
       else
          return (result>>1);
    }
 
int main(void)
 {
 
         uint16_t r;
         LPC_PINCON->PINSEL0|=(0<<10)|(0<<11)|(0<<12)|(0<<13);// MAKING P0.5,6 AS GPIO
        SystemInit();
 
  lcd_init();                                   //initialization of LCD
         delay(500);
 
  lcd_gotoxy(0,0);                              //function to move the cursor position to (0th row & 5th column )
 
 
  lcd_string("Hc sr04 test"); //function to display a string
         delay(500);
  while(1)
        {
                //Set Ultra Sonic Port as out
         US_DDR|=(1<<US_TRIG);
 
         delay_us(10);
 
         //Give the US pin a 15us High Pulse
         US_PORTSET|=(1<<US_TRIG);   //High
 
        delay_us(15);
 
         US_PORTCLR|=(1<<US_TRIG);//Low
 
         delay_us(20);
        //Now make the pin input
         US_DDR&=(~(1<<US_ECHO));
       //Measure the width of pulse
         r=getPulseWidth();
 
 
         //Handle Errors
         if(r==US_ERROR)
         {
            lcd_clear();
               lcd_gotoxy(0,0);
               delay_us(100);
              lcd_string("error");
         }
         else  if(r==US_NO_OBSTACLE)
         {
            lcd_gotoxy(0,0);
\ 
               delay_us(100);
               lcd_string("clear");
         }
         else
         {
 
 
 
            d=(r/58.0); //Convert to cm
            lcd_gotoxy(1,0);
               lcd_string("d=");
               delay_us(100);
                lcd_gotoxy(1,4);
               lcd_showvalue(d);
              delay_ms(50);
              lcd_gotoxy(1,7);
              lcd_string("cm");
            delay_ms(100);
}
 }
 }

 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…