![]() |
就是一個比較器,負輸入端選擇內部的1.19V基準,從P3.7輸入比較電壓。 |
Y_G_G 發表于 2023-7-20 00:17 STC8H的比較器比PWM好懂多了; /*********比較器初始化函數****************/ Void CMPint(Void) { CMPCR2 = OX00;//清零 CMPCR2 &=0xBF; //1011 1111, 開啟0.1us濾波 CMPCR2 |= 0x3F;//0001 1111, 比較器結果經過63個去抖時鐘后輸出 CMPCR1 = 0x00; //清零 CMPCR1 |= 0x10; //0001 0000,開啟比較器下降沿中斷(根據需要修改) CMPCR1 &= 0XF7; //1111 0111,P3.7為CMP+輸入腳 CMPCR1 &= 0xFB; //1111 1011,內部1.19V為CMP-輸入腳 CMPCR1 &= 0xFD; //1111 1101,禁止比較器輸出(根據需要是否輸出) CMPCR1 |= 0x80; //開啟比較器模塊 } 此函數在main主函數中作初始化函數,去抖可根據自己需要修改。 需要執行的任務放在比較器中斷函數內 /******比較器中斷函數,級別在初始化中設置為最高級3*********/ void CMP_Isr() interrupt 21 { CMPCR1 &= 0xBF;//1011 1111,使CMPIF=0,清中斷標志 想要執行的任務;//要簡潔明了,不要占用過多步驟,如多可執行一個標志位,由標志位觸發執行相關復雜任務。 } |
談到比較,必須有兩個量。一個是標準,一個是對象。 標準取什么?可以外部分搭建,也可以從內部獲取。即然CPU嵌入了比較器,設計者必會給出一個內部的標準。建議你使用。 比較的對象:電池,必須將它映射到標準附近,否則如何比較呢?最簡單的方法就是用電阻分壓至標準附近。 但這會浪費電池的能量。 節能:如果不需要時時刻刻檢測,可以加控制開關,只在檢測時接入分壓電阻(不是主題,不在此討論細節)。 如果必須時時刻刻檢測,可以加大電阻的阻值。或其它更高級的方案(不在此討論)。 |
![]() |
STC的比較器就跟它的PWM一樣,數據手冊洋洋灑灑一大堆,你啃半天都不一定知道它在說什么 電池供電還是用帶ADC的單片機好一點,可以精確處理,也可以知道電池的實際電壓 關鍵是STC帶ADC的單片機并沒有比不帶ADC的單片機貴多少,有的型號甚至是更便宜 |
不如將電池電壓送到ADC,得到電壓值,然后根據電壓值判斷,這樣的好處是,比較的電壓門限可以設置,比較靈活。 |