Взаимодействие ультразвукового датчика с контроллером PIC18F4520 - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь отобразить расстояние на моем ЖК-дисплее, но на нем отображаются нежелательные данные

Шаги программирования

Микроконтроллер PIC18F4520 должен передать как минимум 10-кратный импульс запуска на HC-SR04 Trig Pin.После получения триггерного импульса, HC-SR04 автоматически отправляет восемь звуковых волн 40 кГц и ожидает выхода с передним фронтом на выводе Echo.Когда захват переднего фронта происходит на выводе Echo, который подключен к входу PIC18F4520, запустите таймер PIC18F4520 и снова дождитесь падения фронта на выводе Echo.Как только на выводе Echo фиксируется задний фронт, микроконтроллер считывает счетчик таймера.Этот счетчик времени используется для расчета расстояния до объекта.Расчет (расстояние в см)

Скорость звука = 343 м / с = 34300 см / с = 34,3 см / мс = 0,0343 см / usec

Расстояние = скорость * время

= (34300 * ТАЙМЕР) / 2 = 17150 * (ТАЙМЕР) = 17150xT (сек) = 0,01715xT (usec) = 17,15 xT (мсек)

Я пытался по-разному, но не смог отобразить правильное расстояниевот мой код

#include<p18f4520.h>                
#include<string.h>                   

void delay_ms(int ms);
void delay_us(int us);
void Data(char Value);             
void Cmd(char Value);                
void Send2Lcd(const char Adr,rom const char *Lcd);

void main()                            
{
    char Dist_Array1[5];
    int Time=0,j=0;
    int Distance;   
    TRISB=0XFF;
    TRISC=0X00;        /*  (RC1,RC0 - >O/P Setting by Zero)      */
    TRISD=0X00;        /*  PORTD (0 - 7)pins Config as Output    */
    delay_ms(15);                      /*  Minimum 
                Delay To Power On LCD Module To Recieve Mode*/
    Cmd(0X30);  delay_ms(5);          /*  LCD                      Specification Commands                          */
    Cmd(0X30);  delay_ms(1);          /*  LCD                         Specification Commands                          */
    Cmd(0X30);  delay_ms(2);          /*  LCD                       Specification Commands                          */
    Cmd(0X38);                         /*  LCD Double                       Line Display Command                     */
    Cmd(0X06);                         /*  LCD Auto                    Increment Location Address Command         */
    Cmd(0X01);                         /*  LCD Display                        Clear Command                           */
    Cmd(0X0C);                         /*  LCD Display                     ON Command                              */
    Send2Lcd(0x80,"  Distance");
    Send2Lcd(0xc0,"Measurement");
    delay_ms(3);
    delay_ms(1000);

    TMR1H=0; TMR1L=0;       /* Load Timer1 with 0*/
    OSCCON=0x72;        /* Use internal                    oscillator frequency */

    while(1)
    {  
        Cmd(0x01);
        PORTCbits.RC3=0;    // trigger OFF
        delay_us(2);
        PORTCbits.RC3=1; // trigger ON
        delay_us(10);       
        PORTBbits.RB1=0; // trigger OFF

        while(PORTBbits.RB0==0 );       // RB0 is             connected to Echo pin
        T1CONbits.TMR1ON=1;         
        TMR1H=0; 
        TMR1L=0;        /* Load Timer1 with 0*/

        while(PORTBbits.RB0==1  );          
        T1CONbits.TMR1ON=0;

        Time = (TMR1L | (TMR1H<<8)); 
        Distance = (int)(Time/58.2);
        Cmd(0x01); 
        for(j=0;j<=2;j++)
        {
            Dist_Array1[j]=Distance%10+'0';  
            Distance=Distance/10;
        }
        Cmd(0x80);
        for(j=2;j>=0;j--)
        {
            Data(Dist_Array1[j]);
            delay_ms(100);           
        }
    }
    Cmd(0x01); 
}   

void Cmd(char Value){
     PORTD=Value;
     PORTCbits.RC1=0;    /*  RC1=0(RS=0)                        [Command Registr Selection])    */
     PORTCbits.RC0=0;   /*  RC0=0(R/W=0)    [Write                  Process])                */
    PORTCbits.RC2=1;                /*     RC2=1(Enable=1)  [Enable Line ON]                */
    delay_ms(4);                    /*  Minimun Delay                For Hold On Data                      */
    PORTCbits.RC2=0;                /*  
    RC2=0(Enable=0) [Enable Line OFF]               */
}   

void Data(char Value){
    PORTD=Value;
    PORTCbits.RC1=1;               /*  RC1=1(RS=1)                                [Data Registr Selection])       */
    PORTCbits.RC0=0;                /*  RC0=0(R/W=0)                      [Write Process])                */
    PORTCbits.RC2=1;               /*  RC2=1(Enable=1)                       [Enable Line ON]                */
    delay_ms(4);                   /*  Minimun Delay                    For Hold On Data                      */
    PORTCbits.RC2=0;               /*  RC2=0(Enable=0)                      [Enable Line OFF]               */
}

void Send2Lcd(const char Adr,rom const char *Lcd)
{
     Cmd(Adr);
     while(*Lcd!='\0')  
     {
        Data(*Lcd); 
        Lcd++;  
      }
}

void delay_ms(int ms)
{
    int i,count;
    for(i=1;i<=ms;i++)
    {
        count=498;
        while(count!=1)
        {
            count--;
        }
    }
}

void delay_us(int us)
{
    us=us>>1;
    while(us!=1)
        us--;
}

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Когда захват переднего фронта происходит на выводе Echo, который подключен к входу PIC18F4520, запустите таймер PIC18F4520 и снова дождитесь падения фронта на выводе Echo.Как только на выводе Echo фиксируется задний фронт, микроконтроллер считывает счетчик таймера.

Это не измеряет задержку эха.Он измеряет эхо длительность , которое не имеет никакого отношения к расстоянию.Вы должны запустить таймер, как только будет сгенерирован сигнал, и прочитать таймер, как только будет получен передний фронт.

Существует больше работы, чтобы исключить шум, устранить эхо вообще, устранить неполадки и т. Д..

0 голосов
/ 20 декабря 2018

Я вполне уверен, что очищать таймер после запуска его - плохая идея:

while(PORTBbits.RB0==0 );       // RB0 is             connected to Echo pin
T1CONbits.TMR1ON=1;         
TMR1H=0; 
TMR1L=0;        /* Load Timer1 with 0*/ 

По крайней мере, ваше окончательное время будет коротким к тому времени, которое требуется длядве инструкции для выполнения.В худшем случае все чтение может быть мусором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...