在一些智能充電器中,單片機要一直監測電池的電壓,一旦超過某一數值,就由恒流充電切換到恒壓充電。撇開充電器製作相關的各種知識和概念不說我們集中注意力來考察:當電壓接近那個設定的臨界值時發生的一些事情。
當電壓接近臨界值的時候,系統還處於恒流充電狀態,於是電壓開始朝突破臨界值的方向上升……在某一時刻,電壓突破了臨界值,程式檢測到了這一數值變化,立即將充電狀態由恒流切換為恒壓。然而,由於恒流狀態時載入在電池上的電壓要遠遠高於恒壓時所保持的電壓,所以幾乎在同一瞬間,單片機監測到的電池電壓又跳回了臨界值以下——於是,系統又頭腦簡單地將工作模式切換回了恒流狀態……如此反覆,在電池電壓處於該臨界值附近的時候,這樣的事情會頻繁地發生許多次,直到徹底切換為恒壓狀態。
以上是從微觀角度所假想發生的事情,實際情形也許要更為複雜一些。不過從宏觀角度來看,可能發生的現象是:表明充電器充電模式的指示燈頻繁地交替閃爍——這不是我們需要的效果。
有什麼方法能避免這種令人頭痛的事情發生呢?說來很簡單,將切換工作模式的臨界電壓值由一個變為上下兩個門限。從恒流切換到恒壓狀態需要一個較高的門限,這個“較高”是相對原先的單個門限值來說的;從恒壓再跳回恒流狀態,需要實際電壓低於一個相對原先單門限更低的值——高低門限之間的差值至少要大於“當充電器在兩種充電模式間切換時造成的前後電壓差值的典型大小”。 這裡應用的改變充電器充電狀態的觸發特性,叫做施密特特性。採用軟體方式實現這種雙門限的觸發方式,就稱為“軟體施密特觸發器”。
編寫“軟體施密特觸發器”的要點是:明確“兩態”、“兩限”。“兩態”是指目前狀態處於兩種狀態中的哪一種。數值當前正從小變大或是從大變小,這都是隨機和局部的,並不能以此作為決定目前狀態的依據。唯一有資格決定目前狀態的就是上一次的狀態。根據記錄的目前狀態決定下一步的監測對象,這是最可靠的方法。簡單打個比方來說,假設我們處於恒壓狀態,那麼現在我們需要監測的就是下門限;一旦電壓低於了下門限,我們的目前狀態就變成了恒流狀態。於是,我們只要執著於上門限就可以了。而這裡說的“兩限”就是上下兩個門限。