SX1278與STM8L的精美結合

 

轉發請注重原創出處,謝謝!

 

一.   引言

 

能耗對於電池供電的產品來說是一個重大的問題,一旦電能耗盡設備將“罷工”,在某些場合電能意味着電子產品的生命。物聯網時代將會有越來越多電池供電的設備通過無線通信連接,降低能耗再次擺在工程師的桌面上—解決它。不但具備空曠環境傳輸5km的超長距離優勢,還將休眠能耗降低到極致(0.4uA,帶RTC爲1.4uA)。我們是怎麼做到的呢?接下來,一步一步解密。

二.   硬件設計

1.   選用低功耗器件

終端MCU選用STM8L151C8T6,它屬於超低功耗,不帶RTC休眠爲400nA,帶RTC下休眠爲1.4uA。該MCU擁有較大的RAM(4KB)和自帶EEPROM(2KB),不用擴展外部存儲設備,進行一步降低功耗和成本。

終端射頻芯片選用SX1278,在休眠模式下,該芯片功耗低至忽略不計。

2.   儘可能快地讓射頻模塊休眠

SX1278屬於LoRa TM擴頻調製技術,它的遠距離優勢得益於調製增益,不是靠增大發射功率(那將消耗更多電能)。該射頻芯片的電流消耗如下:休眠<0.2uA,空閒=1.6mA,接收=12mA,發射(最大功率)=120mA.

終端MCU通過“中斷+定時器超時”方式控制SX1278,一旦射頻完成發送或接收,立即進入休眠模式。

 

第一:

雖然MCU是停機了,但是電路板還有其他的芯片在工作,它們仍然在消耗電量,所以我們在停機前應該要把其他芯片給關閉(可以通過特定的指令或者片選線)。條件好的可以直接用切斷它們的電源。

第二:

我是這樣理解的:進入停機模式後,只是MCU中最耗電的內核部分被關了,而所有寄存器和內存中的值是保持不變的,所以它的外設還在消耗電量,所以我們要在停機之前把開啓的外設給關了。這裏要注意一點:外設開啓時是先開時鐘再設置寄存器,關閉時先清除寄存器再關閉時鐘。我是這樣理解的:操縱一個外設的寄存器肯定是需要時鐘的,如果我們先把時鐘給關了,那麼還怎麼操作寄存器呢,如果光關了時鐘,不清寄存器的相應位,那麼外設還處於“靜態耗電”的狀態。在研究低功耗的過程中,我被這個坑了好久。關於這一點的實例可以參考這篇博客:

http://blog.csdn.net/qq_25186745/article/details/52777375

第三:

關於IO口的電平,這個是非常重要的一點,和之前提到的外設一樣,GPIO也是一種外設,但是特殊的是,這個外設是和芯片外部直接打交道的,如果GPIO外部接了個上拉電阻,而你在停機之前設置的IO口是低電平的,那麼電流不就通過電阻,流到IO口裏來了,比如正常的說接了個10k的上拉電阻,接到3.3v電壓上,那麼電流就是330uA,這個值可不小呢,stm8l在停機時極限最小電流好像能達到0.4uA。那麼你這個電路就是因爲這個電阻,停機電流比別人大了將近800倍了,那麼假如你的產品能待機1年,人家待機800年,這還怎麼比?所以IO口是絕對不能被忽視的。stm8l芯片復位以後所有引腳都是浮空輸入模式,理論上懸浮空輸入時IO口的狀態爲高阻態是最省電的,那麼我們只要把所有IO都DeInit就可以了。但是事實上不是,我把沒有用到的管腳全部推輓輸出高電平或低電平,不用的外部晶振的引腳要改爲上拉輸入才省電,外部有上拉下拉電阻的引腳分別推輓輸出高電平和低電平,一般電路中上拉電阻比較多(比如IIC的總線外部都有上拉的)。和外部芯片相連的引腳都推輓輸出低電平,因爲外部芯片斷電後所有引腳都是高阻態或接地的吧,如果你弄個高電平,就可能會有電流流過去。

但是。。但是。。。。但是。。。。。。不是所有STM8L系列的芯片GPIO都是一樣的。

比如

/ 所有端口輸出開漏,低電平

    GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    GPIO_Init(GPIOE, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    GPIO_Init(GPIOF, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    GPIO_Init(GPIOG, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

 

或者

 

/ 所有端口輸出開漏,高電平

    GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

    GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

    GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

    GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

    GPIO_Init(GPIOE, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

    GPIO_Init(GPIOF, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

    GPIO_Init(GPIOG, GPIO_Pin_All, GPIO_Mode_Out_OD_Hig_Slow);

 

或者是輸入上拉,輸入浮空。。。。。。。。。。。。。。。。。。。。。功耗是完全不一樣的

精品來了

經過很長的努力,終於把SX1278和STM8L的總體功耗降低爲 1.4ua。是的,你沒有聽錯,1.4ua

 

 

 

模塊再發送的時候功耗在65ma--120ma

 

工程程序https://download.csdn.net/download/u013184273/10932372

電路圖https://download.csdn.net/download/u013184273/10932365

 

其中電路圖是CADENCE才能打開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章