Stap 12: Controle en problemen van de module HCSR-04
Pinout
GND - common ground
Deze pin wordt aangesloten op de grond net van het schema
VCC - macht spoor
Deze pin moet worden gekoppeld aan de lijn van de macht van onze schakeling, die - in mijn geval wordt verzorgd door de 5V buck converter.
TRIG - trigger pin
De gebruiker moet een microseconde lang impuls verschaffen over deze pin, dan wachten op de echo te komen op de echo-pin. Merk op, dat echo is hoog in de eerste tientallen milliseconden, zorg ervoor dat u wacht die uit bij initialisatie. Deze pin wordt beweerd, dan programma heeft te wachten op een stijgende rand en een timer, TMR1 te starten. De WASTE_10_US(); een macro is ik schreef, het bestaat uit voldoende "NOP" montage-instructies om een totale tijd voor 10 microseconden. Tellen wordt gestopt wanneer de echo-puls laag weer gaat. Uit de teller registratienummer weten we de tijd die nodig is voor het geluid terug te krijgen uit een eventuele belemmering. We weten de snelheid van het geluid - kunnen we de afstand berekenen!
ECHO - echo pin
Deze pin wordt gebruikt voor het detecteren van de weerkaatste geluidsgolven. Ik aangesloten op een pin die interrupt, voor het geval heeft - maar het wordt gebruikt in eenvoudige ingangsfunctie. Een stijgende rand de eerder genoemde teller stopt, en slaat het op in een variabele, die kort na wordt verwerkt.
Een kleine truc gemakkelijker te maken de PIC-s
De timing van de pulsen wordt weergegeven in het gegevensblad van deze module. Zoals eerder vermeld, moet u wachten op de eerste ~ 100 ms, dan geven 10 microseconde trigger pulsen op de TRIG pin. Dergelijke duw resulteert in een uitbarsting van de 8 cyclus van de zender 'luidspreker' komen. Vervolgens moeten we wachten op een echo te komen. De echo is gevangen genomen door de ontvanger, en omgezet naar een impuls met een variabele lengte op de ECHO-pin. De lengte van de impuls van deze echo is recht evenredig met de afstand tot de eerste hindernis. Het gegevensblad geeft een eenvoudige formule voor het berekenen van dit:
afstand [cm] = t gemeten [microseconden] / 58
Dit geeft de afstand in centimeters. Ik verdeel alleen door 5.8, dus de afstand in millimeter wordt geretourneerd. Aangezien ik niet per se uiterst nauwkeurige lezingen hoeven, zal ik hier een kleine twist toevoegen. Ik wil alleen om te voorkomen dat belemmeringen, kan me niet schelen hoe ver ze zijn, dus er is geen gebruik van de berekening van de afstand in dubbele variabele types. Dat soort berekeningen nemen een lange tijd, die in dit geval is volstrekt onnodig. Dus laten we de berekeningen een beetje te vereenvoudigen. Wij weten dat de ontvangen impuls lengte in microseconden nodig is om erachter te komen de afstand. De basis van onze tijd is echter niet een zeer ronde één, 83.33 [ns]. Dus, in plaats van de graaf van TMR1, vermenigvuldiging met de basis om de lengte in microseconden dan verdelen door 5,8 om de afstand in millimeter, tijd zullen wij iets eenvoudiger en dommer. Laten we stellen wat betekent één enkele TMR1 graaf in millimeter:
1 graaf 83.33 [ns] = = 0.08333 [us], die gedeeld door 5.8 resultaten in 0.014 [mm] voor elke TMR1 [graaf]
Hebben gezegdd dat, kunnen we het volgende schrijven:
1 [count] .......................... 0.014 [mm]
x [graaf]... y [mm]
en over het schrijven van de volgende formule:
y [mm] = (x * 0.014) / 1 = x * 0.014 = x / 71.42
We weten dus dat kunnen we de afstand tot een obstakel door te delen TMR1 count en voorzien van 71.42. Dit, echter, is nog steeds een precisie-calculus dat lang duurt, zodat we een kijkje nemen en beseffen dat dit er niet ver van 64, een mooie 'ronde' nummer. Delen met de machten van 2 in de software is heel eenvoudig, kan worden gedaan via het verschuiven van rechts zes keer. Verschuiven byte is een inheemse instructie voor de PIC, en het is heel erg snel in vergelijking met een dubbele verdeling. Dus, laten we ronde 71.42 tot 64 en gewoon shift TMR1 6 keer om een idee over hoe dicht een obstakel is verlaten!
Laten we eens kijken het verschil dat deze truc bij een aantal van 8000 (bijvoorbeeld geeft):
originele: 8000 / 71.42 = 112 [mm]
lastig: 8000 / 64 = (8000 >> 6) = 125 [mm]
De fout is dus ongeveer 10%, niet veel vergeleken met de enorme hoeveelheid tijd die we zojuist hebt opgeslagen!
Problemen
Ik heb niet eventuele problemen tijdens het werken met deze module, het enige dat gebeurde was dat de draad tussen de PIC en de ECHO-pin bleef verbroken, en de PIC gewacht eindeloos randen op die pin raakte. Dit was gemakkelijk te vangen, aangezien de rode LED die knevels op elke seconde, gestopt. Ik wist onmiddellijk dat het programma bevroor, en de enige plek die het kan bevriezen dit wachten voor rand routine is. Probleem opgelost na één minuut!
Één meer ding: deze dingen werken met 5 [V], dus het hebben van slechts 4.8 [V] bij volledige lading betekent, dat wij te ver bent rekken. Als de spanning is niet genoeg om te vangen van de echo, zullen de MCU hangen, wachten op de ECHO te komen!