一、比較器內部結構
STC15W408AS單片機內置比較器功能。的比較器內部規劃如下圖所示:
比較器正極輸入端CMP+電平可以與比較器負極輸入端CMP-的電平進行比較,也可以與內部BandGap參考電壓(1.27V附近)進行比較。
二、STC15W系列與比較器相關的特殊功能寄存器
2.1 比較器控制寄存器1:CMPCR1
CMPCR1 : 比較器控制寄存器1
CMPEN:比較器模塊使能位
CMPEN=1,使能比較器模塊;
CMPEN=0,禁用比較器模塊, 比較器的電源關閉。
CMPIF:比較器中斷標志位(Interrupt Flag)
在 CMPEN為1的情況下:
當比較器的比較結果由LOW變成HIGH時, 若是PIE被設置成1, 那么內建的某一個叫做CMPIF_p的寄存器會被設置成1;
當比較器的比較結果由HIGH變成LOW時, 若是NIE被設置成1, 那么內建的某一個叫做CMPIF_n的寄存器會被設置成1;
當CPU 去讀取 CMPIF 的數值時, 會讀到 (CMPIF_p || CMPIF_n);
當CPU對CMPIF寫0后, CMPIF_p 以及 CMPIF_n 都會被清除為0 .
而中斷產生的條件是 [ (EA==1) && (((PIE==1)&&(CMPIF_p==1)) || ((NIE==1)&&(CMPIF_n==1))) ]
CPU接受中斷后, 并不會自動清除此CMPIF標志, 用戶必須用軟件寫”0”去清除它。
PIE:比較器上升沿中斷使能位( Pos-edge Interrupt Enabling)
PIE = 1, 使能比較器由LOW變HIGH的事件 設定CMPIF_p/產生中斷;
PIE = 0, 禁用比較器由LOW變HIGH的事件 設定CMPIF_p/產生中斷。
NIE:比較器下降沿中斷使能位 ( Neg-edge Interrupt Enabling)
NIE = 1, 使能比較器由HIGH變LOW的事件 設定CMPIF_n/產生中斷;
NIE = 0, 禁用比較器由HIGH變LOW的事件 設定CMPIF_n/產生中斷。
PIS:比較器正極選擇位
PIS = 1, 選擇ADCIS[2:0] 所選擇到的 ADCIN 做為比較器的正極輸入源
PIS = 0,選擇外部P5.5為比較器的正極輸入源
NIS:比較器負極選擇位
NIS = 1,選擇外部管腳P5.4為比較器的負極輸入源
NIS = 0,選擇內部BandGap電壓BGV為比較器的負極輸入源
CMPOE:比較結果輸出控制位
CMPOE = 1,使能比較器的比較結果輸出到P1.2
CMPOE = 0, 禁止比較器的比較結果輸出
CMPRES:比較器比較結果 (Comparator Result)標志位
CMPRES = 1,CMP+的電平高于CMP-的電平(或內部BandGap參考電壓的電平);
CMPRES = 0,CMP+的電平低于CMP-的電平(或內部BandGap參考電壓的電平)
此 bit 是一個”只讀(read-only)”的bit ; 軟件對它做寫入的動作沒有任何意義。軟件所讀到的結果是“經過ENLCCTL控制后的結果”, 而非Analog比較器的直接輸出結果。
2.2 比較器控制寄存器2:CMPCR2
比較器控制寄存器2
INVCMPO:比較器輸出取反控制位 (Inverse Comparator Output)
INVCMPO = 1,比較器取反后再輸出到P1.2;
INVCMPO = 0,比較器正常輸出。
比較器的輸出, 采用“經過ENLCCTL控制后的結果”, 而非Analog比較器的直接輸出結果。
DISFLT:去除比較器輸出的 0.1uS Filter
DISFLT = 1, 關掉比較器的輸出0.1uS Filter (可以讓比較器速度有少許提升);
DISFLT = 0, 比較器的輸出有0.1uS 的 Filter。
LCDTY[5:0]:比較器輸出端 Level-Change control的 filter 長度(Duty)選擇
bbbbbb:=
當比較器由LOW變HIGH, 必須偵測到該后來的HIGH持續至少bbbbbb個時鐘, 此芯片線路才認定比較器的輸出是由LOW轉成HIGH; 如果在bbbbbb個時鐘內, Analog比較器的輸出又回復到LOW, 此芯片線路認為什么都沒發生, 視同比較器的輸出一直維持在LOW;
當比較器由HIGH變LOW, 必須偵測到該后來的LOW持續至少bbbbbb個時鐘, 此芯片線路才認定比較器的輸出是由HIGH轉成LOW; 如果在bbbbbb個時鐘內, Analog比較器的輸出又回復到HIGH, 此芯片線路認為什么都沒發生, 視同比較器的輸出一直維持在HIGH.
若是設定成 000000, 代表沒有 Level-Change Control。
三、比較器測試程序
#include "stc15.h"
void CmpInit();
void main()
{
CmpInit();
EA = 1; // CPU開放中斷
while (1);
}
// 初始化比較器模塊
void CmpInit()
{
// P5.5為比較器正極
// P5.4為比較器的負極
// P1.2為比較器的結果輸出口
CMPCR1 = 0; // 初始化比較器
CMPCR1 |= 0x80; // 使能比較器模塊
CMPCR1 |= 0x02; // 使能比較器的比較結果輸出到P1.2
CMPCR1 |= 0x20; // 使能比較器的上升沿中斷
}
// 比較器中斷服務函數
void cmp_isr() interrupt 21 //比較器中斷向量入口
{
CMPCR1 &= ~0x40; // 清除完成標志
P12 = CMPCR1 & 0x01; // 將比較器結果CMPRES輸出到測試口顯示
}
評論
查看更多