在使用超聲波探測器的時候,因為計算距離是需要靠echo引腳的高低電平變化的時間差來進行數(shù)據(jù)的判斷细层。在某些未知的情況下,有可能echo引腳不會返回高電平唬涧,程序將會一直等待返回疫赎。
解決這個問題考慮使用TIMMER或者WDT來解決,這里我使用WDT(看門狗)來解決碎节。
先來一段百度上關于看門狗的定義捧搞。
看門狗,又叫watchdog timer狮荔,是一個定時器電路胎撇,一般有一個輸入,叫喂狗(kicking the dog/service the dog)殖氏,一個輸出到MCU的RST端晚树,MCU正常工作的時候,每隔一段時間輸出一個信號到喂狗端雅采,給 WDT清零爵憎,如果超過規(guī)定的時間不喂狗(一般在程序跑飛時),WDT定時超過婚瓜,就會給出一個復位信號到MCU宝鼓,使MCU復位。防止MCU死機. 看門狗的作用就是防止程序發(fā)生死循環(huán)巴刻,或者說程序跑飛胡陪。
接著上一篇文章的代碼進行改進碍舍。
import utime
from driver import GPIO
from machine import WDT # 引用WDT
class HAASHCSR04:
wdt = None
triger_gpio = None
echo_gpio = None
def __init__(self):
global triger_gpio, echo_gpio, wdt
wdt = WDT(timeout=2000) # 初始化WDT,設定喂狗時間為2S
triger_gpio = GPIO()
triger_gpio.open('hc_triger')
triger_gpio.write(0)
echo_gpio = GPIO()
echo_gpio.open('hc_echo')
echo_gpio.write(0)
def start_scan(self):
cnt = 0
while True:
try:
self.start_hc()
utime.sleep_ms(800) # 這里根據(jù)需要設定SLEEP時間
cnt +=1
print('>_< ->' + str(cnt))
except:
break
def start_hc(self):
global triger_gpio, echo_gpio, wdt
try:
triger_gpio.write(1)
utime.sleep_us(10)
triger_gpio.write(0)
while(echo_gpio.read()==0):
pass
start_us = utime.ticks_us()
while(echo_gpio.read()==1): #如果一直沒有返回高電平乒验,程序會一直卡在這里
pass
print('喂狗')
wdt.feed() # 如果程序一切正常,喂狗
end_us = utime.ticks_us()
rang_us = utime.ticks_diff(end_us,start_us)/10000
dist = rang_us*340/2
print("dist is: %0.2f CM" % dist)
return dist
except Exception as ex:
print(ex)
- 在代碼當中引用 WDT
- 在類的構造函數(shù)當中初始化喂狗時間 【wdt = WDT(timeout=2000) 】
- 如果echo接受到了高電平,我們進行喂狗了嚎。如果沒有接受到高電平,時間超過2S呐伞,開發(fā)板重新啟動。
另外癣防,根據(jù)今日把開發(fā)板跑了大半天,發(fā)現(xiàn)如果對于測試的距離的精度有比較高的要求刑枝。可以采取將多次的返回結果,掐頭(去掉最大)去尾(去掉最醒肝堋)取平均分。