У меня есть рис 18F4550, как прочитать расстояние от ультразвукового датчика - PullRequest
0 голосов
/ 19 апреля 2019

У меня PIC 18f4550, и мне нужно написать код в picBasic pro.
Я подключаю двигатели постоянного тока, ультразвуковой датчик и ИК-датчики ... и т. Д.
Я сделал все, но все еще не понял, как подключить ультразвуковой датчик.

вот ультразвуковые контакты в PIC

trisb.3=0    'trigger ultrasound
trisb.4=1    ' Echo from Ultrasound

мне нужен пример кода

1 Ответ

1 голос
/ 22 апреля 2019

Основные шаги для его программирования:

1-Подать TRIGGER на ультразвуковой модуль
2-Listen for Echo
3-пусковой таймер при получении ECHO HIGH
4-ступенчатый таймер, когда ECHO становится НИЗКИМ
Значение таймера 5-Read
6-Преобразовать его в расстояние
7-Дисплей это

Расчет расстояния

  • Расстояние = Скорость * Время
  • Пусть d будет расстояние между ультразвуковым датчиком и целью
  • Общее расстояние, пройденное ультразвуковым взрывом: 2d (вперед и назад)
  • Скорость звука в воздухе: 340 м / с = 34000 см / с
  • Таким образом, d = (34000 * Время) / 2, где Время = (TMR1H: TMR1L) / (1000000)
  • Следовательно, d = (TMR1H: TMR1L) /58,82 см
  • TMR1H: TMR1L = TMR1L | (TMR1H << 8) <br>

Код MikroC

// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections

void main()
{
  int a;
  char txt[7];
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);          // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off

  TRISB = 0b00010000;           //RB4 as Input PIN (ECHO)

  Lcd_Out(1,1,"Developed By");
  Lcd_Out(2,1,"Mina Karam");

  Delay_ms(3000);
  Lcd_Cmd(_LCD_CLEAR);

  T1CON = 0x10;                 //Initialize Timer Module

  while(1)
  {
    TMR1H = 0;                  //Sets the Initial Value of Timer
    TMR1L = 0;                  //Sets the Initial Value of Timer

    PORTB.F0 = 1;               //TRIGGER HIGH
    Delay_us(10);               //10uS Delay
    PORTB.F0 = 0;               //TRIGGER LOW

    while(!PORTB.F4);           //Waiting for Echo
    T1CON.F0 = 1;               //Timer Starts
    while(PORTB.F4);            //Waiting for Echo goes LOW
    T1CON.F0 = 0;               //Timer Stops

    a = (TMR1L | (TMR1H<<8));   //Reads Timer Value
    a = a/58.82;                //Converts Time to Distance
    a = a + 1;                  //Distance Calibration
    if(a>=2 && a<=400)          //Check whether the result is valid or not
    {
      IntToStr(a,txt);
      Ltrim(txt);
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1,"Distance = ");
      Lcd_Out(1,12,txt);
      Lcd_Out(1,15,"cm");
    }
    else
    {
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1,"Out of Range");
    }
    Delay_ms(400);
  }
}
...