MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B
目錄
- 硬知識
- 比較器B介紹
- 比較器 B 的特點
- 比較器 B 的結構
- 模擬輸入部分
- 比較部分
- 基準電壓部分
- 低通濾波部分
- 比較器和普通運放的區別
- 比較器B測量電阻原理
- 利用比較器B實現電容觸摸按鍵原理
- 比較器B控制寄存器
- COMP_B API (機翻)
- 介紹
- 處理初始化和輸出的函數
- 參數
- 處理中斷的函數
- 參數
- 處理COMP_B輔助特性的函數
- 參數
- 上機實戰
- 整體代碼
- 實驗現象
平臺:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)
硬知識
比較器B介紹
???????比較器B模塊包含多達16個通道的比較功能,具有以下特性:
? 反相和同相端輸入多路復用器;
? 比較器輸出可編程RC濾波器;
? 輸出提供給定時器A捕獲輸入;
? 端口輸入緩沖區程序控制;
? 中斷能力;
? 可選參考電壓發生器、電壓滯后發生器;
? 外部參考電壓輸入;
? 超低功耗比較器模式;
? 中斷驅動測量系統——支持低功耗運行。
比較器 B 的特點
???????比較器 B 模塊可用于精確的斜率式模數轉換,電壓監控和外部模擬信號的監控。比較器 B 有如下特點:同相端和反相端均有輸入復用器;比較器輸出端具有軟件選擇的 RC 濾波器;比較器的輸出可以作為定時器 A 的捕獲輸入;端口輸入緩沖由軟件控制;具有中斷功能,并支持在低功耗模式響應;可選擇的參考電壓發生器,電壓滯回發生器;可使用共享參考源作為參考電壓;超低功耗比較模式。
比較器 B 的結構
???????比較器B的結構框圖如下圖所示。可以看出比較器 B 模塊大概可以分為 5 個部分:模擬輸入部分、核心部分、低通濾波部分、基準電壓部分和比較器輸出部分。
模擬輸入部分
???????模擬輸入部分通過CBIPSEL和SBIMSEL控制位控制模擬信號的輸入,每個輸入通道都是相對獨立的,且都可以引入比較器B的“+”輸入端或“-”輸入端。通過CBSHORT控制位可以將比較器B的模擬信號輸入短路。比較器B的輸入端也可通過CBRSEL和CBEX控制位的配合引入內部基準電壓生成器產生的參考電壓。
通過相應寄存器的配置,比較器B可進行如下模擬電壓信號的比較:
? 兩個外部輸入電壓信號的比較;
? 每個外部輸入電壓信號與內部基準電壓的比較。
比較部分
???????整個比較器 B 工作需將 CBCTL1 控制寄存器的 CBON 位置為 1,單片機上電復位時,此位為 0;CBCTL1 中的 CBEX 位控制輸入方向。
基準電壓部分
???????比較器B的基準電壓部分的結構框圖如圖所示。
???????基準電壓部分通過接入梯形電阻電路或內部共享電壓來達到產生不同參考電壓VREF的目的。如圖所示,CBRSx控制位可選擇參考電壓的來源。若CBRSx為10,內部梯形電阻電路電壓來自內部共享電壓,內部共享電壓可通過CBREFLx控制位產生1.5V、2.0V或2.5V電壓。若CBRSx為01,內部梯形電阻電路電壓來自VCC,可通過CBON實現參考電源的開關。若CBRSx為00或11,內部梯形電阻電路無電源可用,被禁止。若CBRSx為11,參考電壓來自內部共享電壓。當CBRSx不為11時,當CBMRVS為0且CBOUT為1時,參考電壓來自VREF1;當CBMRVS和CBOUT均為0時,參考電壓來自VREF0。當梯形電阻電路可用時,可通過CBREF1和CBREF0控制位對參考電壓源進行分壓,分壓倍數可為1/5、2/5、3/5、4/5、1/4、3/4、1/3、2/3、1/2和1。CBMRVS控制位實現對控制VREF電壓的來源信號的控制。若CBMRVS控制位為0,CBOUT控制VREF電壓信號的來源;若CBMRVS控制位為1,CBMRVL控制位控制VREF電壓信號的來源。
低通濾波部分
???????比較器B的輸出可以選擇使用或不使用內部RC濾波器。當CBF控制位設為1時,比較器輸出信號經過RC濾波,反之,不使用RC濾波。
???????如果在比較器的輸入端,模擬電壓的電壓差很小,那么比較器的輸出會產生振蕩。如圖所示,當比較器“+”輸入端的電壓減少并越過“-”輸入端參考比較電壓時,若比較器輸出沒有經過內部濾波器的過濾,在電壓穿越的時刻,比較器輸出將會產生較大的振蕩;若比較器輸出經過內部濾波器的過濾,在電壓穿越的時刻,比較器的輸出振蕩較小。
比較器和普通運放的區別
比較器就是一類特殊的運放。
(1) 一般情況,不要混用普通運放和比較器,那樣很可能是用家具當劈柴燒。
(2) 比較器的壓擺率比普通運放高,簡單說,就是“快” 。 (3) 相比于比較器,普通運放內部有補償電容,不易自激振蕩。
(4) 輸入端:普通運放正常工作時兩輸入端幾乎沒有壓差,所以其輸入端往往有電壓嵌
位保護。比較器的輸入端則沒有,混用時應特別注意。
(5) 輸出端:運放輸出端一般是圖騰柱輸出,多數不能滿幅輸出。(軌至軌型除外)
比較器B測量電阻原理
???????利用比較器B測量電阻的電路示意圖如圖所示。被測電阻和一個標準參考電阻分別連接到兩個GPIO端口,被測電阻可以是固定的,也可以是可變的,如溫控電阻等。被測電阻和標準電阻的另外一端連接一個固定電容并接入比較器B的正輸入端。比較器的負輸入端接內部0.25VCC參考電壓,比較器輸出連接定時器A。
???????對被測電阻的測量過程為:
???????將Px.x引腳拉高,通過標準參考電阻Rref對電容進行充電;
???????將Px.x引腳拉低,通過標準參考電阻Rref對電容進行放電;
???????再將Px.x引腳拉高,通過標準參考電阻Rref對電容進行充電;
???????然后將Px.y引腳拉低,通過被測電阻Rmeas對電容進行放電。
???????如此往復,利用定時器A準確測量通過Rref和通過Rmeas對電容進行放電的時間,測量過程如圖所示。
???????被測電阻的計算公式為
???????式中,Nmeas為電容通過被測電阻放電時定時器A的捕獲計數值;Nref為電容通過標準參考電阻放電時定時器A的捕獲計數值。
利用比較器B實現電容觸摸按鍵原理
???????人體是具有一定電容的。當我們把PCB上的銅畫成如圖所示形式時,就做出了一個最基本的觸摸感應按鍵。
???????上圖中左邊的圖顯示了一個基本的觸摸按鍵,中間圓形陰影部分為銅(可以稱為“按鍵”),在這按鍵中會引出一根導線與單片機相連,單片機通過這根導線來檢測是否有按鍵“按下”(檢測的方法將在后面介紹);外圍的陰影部分也是銅,不過外圍的這些銅是與GND大地相連的。在“按鍵”和外圍的銅之間是空隙(可以稱為空隙d)。圖6.3.6中右邊的圖是左圖的截面圖,當沒有手指接觸時,只有一個電容Cp;當有手指接觸時,“按鍵”通過手指就形成了電容Cf。由于兩個電容是并聯的,所以手指接觸“按鍵”前后,總電容的變化率為C% = ((Cp+Cf)- Cp)/ Cp =Cf/Cp。
???????利用比較器B實現一個張弛振蕩觸摸按鍵的電路如圖6.3.8所示。在輸入端,比較器正輸入端接內部參考電壓,比較器負輸入端接在電阻Rc與感應電容之間,CBOUT與TACLK相連。當感應電容CSENSOR兩端沒有電壓時,通過比較器B的比較,CBOUT將輸出高電平,之后通過Rc對感應電容進行充電。當感應電容兩端的電壓高于內部比較器“+”輸入端的參考電壓時,通過比較器B的比較,CBOUT將輸出低電平,感應電容通過Rc放電。放電的過程中若感應電容兩端的電壓低于內部比較器“+”輸入端的參考電壓,CBOUT又輸出高電平,通過Rc對感應電容放電,如此往復,比較器B的輸出端CBOUT將輸出具有一定頻率的矩形波。該矩形波的頻率可反映感應電容的充放電時間,進而可檢測感應電容的變化,因此只需在固定時間內,利用定時器A作為頻率計計算張弛振蕩器的輸出頻率。如果在某一時刻輸出頻率有較大的變化的話,就說明電容值已經被改變,即按鍵被“按下”了。
???????基于張弛振蕩器的電容觸摸按鍵檢測方法示意圖如下圖所示,當手指觸摸到電容觸摸按鍵以后,電容由C1變化至C2,張弛振蕩器的輸出頻率會降低很多,然后利用定時器在門限時間內計算比較器B的輸出頻率,即可實現對感應電容的檢測。
比較器B控制寄存器
???????比較器 B 的輸出既可以輸出到內部模塊也可以輸出到外部引腳,也可以用于產生中斷。比較器 B 模塊可以在比較器輸出的上升沿或者下降沿產生中斷,所用的邊沿由 CBCTL1 的CBIES 選擇。比較器 B 模塊具有獨立的中斷向量,中斷被響應后硬件會自動清除中斷標志位 CBIFG。
COMP_B API (機翻)
介紹
???????COMP_B API提供了一組使用MSP430Ware COMP_B模塊的函數。提供了初始化COMP_B模塊、設置輸入參考電壓和管理COMP_B模塊中斷的功能。
???????COMP_B模塊提供比較兩個模擬信號的能力,并使用可使用軟件和輸出引腳來表示正端信號是否高于負端信號。COMP_B可以用來產生遲滯。可以使用16個不同的輸入,也可以少至2個輸入。COMP_B模塊還可以控制REF模塊來生成參考電壓作為輸入。
???????COMP_B模塊可以產生多個中斷。可以為輸出時產生一個中斷,或是輸出分為上升或下降單獨的中斷。
???????COMP_B API被分成三組函數:
處理初始化和輸出的函數,
處理中斷的函數,
處理COMP_B輔助特性的函數。
處理初始化和輸出的函數
Comp_B_init(uint16_t baseAddress, Comp_B_initParam ? param) //初始化Comp B模塊 Comp_B_configureReferenceVoltage(uint16_t baseAddress, Comp_B_configureReferenceVoltageParam ? param) //在初始化過程中向選定的終端生成參考電壓 Comp_B_selectReferenceVoltage(uint16_t baseAddress, uint16_t selectType, uint16_t selectVRef) //修改比較器輸出如何在VREFO或VREF1之間選擇 Comp_B_enable(uint16_t baseAddress) //打開Comp_B模塊 Comp_B_disable(uint16_t baseAddress) //關閉Comp_B模塊 Comp_B_outputValue(uint16_t baseAddress) //返回Comp B模塊的輸出值參數
baseAddress
COMP_B_BASEComp_B_initParam
//***************************************************************************** // //! \brief Used in the Comp_B_init() function as the param parameter. // //***************************************************************************** typedef struct Comp_B_initParam {//! Selects the input to the positive terminal.//! \n Valid values are://! - \b COMP_B_INPUT0 [Default]//! - \b COMP_B_INPUT1//! - \b COMP_B_INPUT2//! - \b COMP_B_INPUT3//! - \b COMP_B_INPUT4//! - \b COMP_B_INPUT5//! - \b COMP_B_INPUT6//! - \b COMP_B_INPUT7//! - \b COMP_B_INPUT8//! - \b COMP_B_INPUT9//! - \b COMP_B_INPUT10//! - \b COMP_B_INPUT11//! - \b COMP_B_INPUT12//! - \b COMP_B_INPUT13//! - \b COMP_B_INPUT14//! - \b COMP_B_INPUT15//! - \b COMP_B_VREFuint8_t positiveTerminalInput;//! Selects the input to the negative terminal.//! \n Valid values are://! - \b COMP_B_INPUT0 [Default]//! - \b COMP_B_INPUT1//! - \b COMP_B_INPUT2//! - \b COMP_B_INPUT3//! - \b COMP_B_INPUT4//! - \b COMP_B_INPUT5//! - \b COMP_B_INPUT6//! - \b COMP_B_INPUT7//! - \b COMP_B_INPUT8//! - \b COMP_B_INPUT9//! - \b COMP_B_INPUT10//! - \b COMP_B_INPUT11//! - \b COMP_B_INPUT12//! - \b COMP_B_INPUT13//! - \b COMP_B_INPUT14//! - \b COMP_B_INPUT15//! - \b COMP_B_VREFuint8_t negativeTerminalInput;//! Selects the power mode at which the Comp_B module will operate at.//! \n Valid values are://! - \b COMP_B_POWERMODE_HIGHSPEED [Default]//! - \b COMP_B_POWERMODE_NORMALMODE//! - \b COMP_B_POWERMODE_ULTRALOWPOWERuint16_t powerModeSelect;//! Controls the output filter delay state, which is either off or enabled//! with a specified delay level. This parameter is device specific and//! delay levels should be found in the device's datasheet.//! \n Valid values are://! - \b COMP_B_FILTEROUTPUT_OFF [Default]//! - \b COMP_B_FILTEROUTPUT_DLYLVL1//! - \b COMP_B_FILTEROUTPUT_DLYLVL2//! - \b COMP_B_FILTEROUTPUT_DLYLVL3//! - \b COMP_B_FILTEROUTPUT_DLYLVL4uint8_t outputFilterEnableAndDelayLevel;//! Controls if the output will be inverted or not//! \n Valid values are://! - \b COMP_B_NORMALOUTPUTPOLARITY [Default]//! - \b COMP_B_INVERTEDOUTPUTPOLARITYuint16_t invertedOutputPolarity; } Comp_B_initParam;Comp_B_configureReferenceVoltageParam
//***************************************************************************** // //! \brief Used in the Comp_B_configureReferenceVoltage() function as the param //! parameter. // //***************************************************************************** typedef struct Comp_B_configureReferenceVoltageParam {//! Decides the source and max amount of Voltage that can be used as a//! reference.//! \n Valid values are://! - \b COMP_B_VREFBASE_VCC//! - \b COMP_B_VREFBASE1_5V//! - \b COMP_B_VREFBASE2_0V//! - \b COMP_B_VREFBASE2_5Vuint16_t supplyVoltageReferenceBase;//! Is the numerator of the equation to generate the reference voltage for//! the lower limit reference voltage.uint16_t lowerLimitSupplyVoltageFractionOf32;//! Is the numerator of the equation to generate the reference voltage for//! the upper limit reference voltage.uint16_t upperLimitSupplyVoltageFractionOf32;//! is the reference accuracy setting of the Comp_B. Clocked is for low//! power/low accuracy.//! \n Valid values are://! - \b COMP_B_ACCURACY_STATIC//! - \b COMP_B_ACCURACY_CLOCKEDuint16_t referenceAccuracy; } Comp_B_configureReferenceVoltageParam;selectType
/*determines whether VREF instance is chosen automatically or manually Valid values are:*/ COMP_B_VREF_AUTO_SELECT /* [Default] - VREF instance is chosen by comparator output state.*/ COMP_B_VREF_MANUAL_SELECT /*- VREF instance is chosen by user (CBCTL1. CBMRVL bit) Modified bits are CBMRVS of CBCTL1 register.*/selectVRef
/*selects VREF0 or VREF1. Only applicable if VREF instance is set up to be chosen manually Valid values are:*/ COMP_B_SELECT_VREF0 /*[Default]*/ COMP_B_SELECT_VREF1 /*Modified bits are CBMRVL of CBCTL1 register*/處理中斷的函數
Comp_B_enableInterrupt(uint16_t baseAddress, uint16_t interruptMask) //啟用選擇的Comp B中斷源 Comp_B_disableInterrupt(uint16_t baseAddress, uint16_t interruptMask) //禁用選擇的Comp B中斷源 Comp_B_clearInterrupt(uint16_t baseAddress, uint16_t interruptFlagMask) //清除Comp_B中斷標志 Comp_B_getInterruptStatus(uint16_t baseAddress, uint16_t interruptFlagMask) //獲取當前Comp B中斷狀態 Comp_B_setInterruptEdgeDirection(uint16_t baseAddress, uint16_t edgeDirection) //設置將觸發中斷的邊緣方向 Comp_B_toggleInterruptEdgeDirection(uint16_t baseAddress) //反轉將觸發中斷的邊緣方向參數
baseAddress
COMP_B_BASEinterruptMask
/*is the bit mask of the interrupt sources to be enabled. Mask value is the logical OR of any of the following:*/ COMP_B_OUTPUT_INT /*- Output interrupt*/ COMP_B_OUTPUTINVERTED_INT /*- Output interrupt inverted polarity*/ /*Modified bits of CBINT register.*/interruptFlagMask
/*is a bit mask of the interrupt sources to be cleared. Mask value is the logical OR of any of the following:*/ COMP_B_OUTPUT_FLAG /*- Output interrupt*/ COMP_B_OUTPUTINVERTED_FLAG /*- Output interrupt inverted polarity Modified bits of CBINT register.*/edgeDirection
/*determines which direction the edge would have to go to generate an interrupt based on the non-inverted interrupt flag. Valid values are:*/ COMP_B_RISINGEDGE /*[Default] - sets the bit to generate an interrupt when the output of the Comp_B falls from LOW to HIGH if the normal interrupt bit is set(and HIGH to LOW if the inverted interrupt enable bit is set).*/ COMP_B_FALLINGEDGE /*- sets the bit to generate an interrupt when the output of the Comp_B rises from HIGH to LOW if the normal interrupt bit is set(and LOW to HIGH if the inverted interrupt enable bit is set). Modified bits are CBIES of CBCTL1 register.*/處理COMP_B輔助特性的函數
Comp_B_shortInputs(uint16_t baseAddress) //短路在初始化過程中選擇的兩個輸入引腳 Comp_B_unshortInputs(uint16_t baseAddress) //禁用初始化過程中選擇的兩個輸入引腳的短路 Comp_B_disableInputBuffer(uint16_t baseAddress, uint8_t inputPort) //禁用所選輸入端口的輸入緩沖區,以有效地允許模擬信號傳遞 Comp_B_enableInputBuffer(uint16_t baseAddress, uint8_t inputPort) //使所選輸入端口的輸入緩沖區允許數字信號的通過 Comp_B_swapIO(uint16_t baseAddress) //切換輸入終端的位,同時也反轉Comp_B的輸出參數
baseAddress
COMP_B_BASEinputPort
//is the port in which the input buffer will be disabled. Valid values are: COMP_B_INPUT0 //[Default] COMP_B_INPUT1 COMP_B_INPUT2 COMP_B_INPUT3 COMP_B_INPUT4 COMP_B_INPUT5 COMP_B_INPUT6 COMP_B_INPUT7 COMP_B_INPUT8 COMP_B_INPUT9 COMP_B_INPUT10 COMP_B_INPUT11 COMP_B_INPUT12 COMP_B_INPUT13 COMP_B_INPUT14 COMP_B_INPUT15 COMP_B_VREF //Modified bits are CBPDx of CBCTL3 register.上機實戰
P6.5 (CB5) 為輸入,與內部產生的參考電壓比較
正常模式,濾波器選延遲最短的
設下門檻為Vcc*(11/32) = 1.134375V, 上門檻為Vcc*(21/32) = 2.165625V
靜態模式
啟用比較器,復用P1.6為比較器輸出
//Allow power to Comparator moduleComp_B_enable(COMP_B_BASE);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1,GPIO_PIN6);整體代碼
#include "driverlib.h"#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x))) #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void) {PMM_setVCore(PMM_CORE_LEVEL_3); //高主頻工作需要較高的核心電壓//XT1引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作為FLL參考時鐘,先8分頻,再50倍頻 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作為ACLK時鐘源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為MCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為SMCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//設置外部時鐘源的頻率,使得在調用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK時可得到正確值UCS_setExternalClockSource(32768, 4000000); }int main(void) {WDT_A_hold(WDT_A_BASE);SystemClock_Init();//Initialize the Comparator B module/** Base Address of Comparator B,* Pin CB5 to Positive(+) Terminal* Reference Voltage to Negative(-) Terminal* Normal Power Mode* Output Filter On with minimal delay* Non-Inverted Output Polarity*/Comp_B_initParam initParam = {0};initParam.positiveTerminalInput = COMP_B_INPUT5;initParam.negativeTerminalInput = COMP_B_VREF;initParam.powerModeSelect = COMP_B_POWERMODE_NORMALMODE;initParam.outputFilterEnableAndDelayLevel = COMP_B_FILTEROUTPUT_DLYLVL1;initParam.invertedOutputPolarity = COMP_B_NORMALOUTPUTPOLARITY;Comp_B_init(COMP_B_BASE, &initParam);//Set the reference voltage that is being supplied to the (-) terminal/** Base Address of Comparator B,* Reference Voltage = Vcc = 3.3V,* Lower Limit of Vcc*(11/32) = 1.134375V,* Upper Limit of Vcc*(21/32) = 2.165625V,* Static Mode Accuracy*/Comp_B_configureReferenceVoltageParam refVoltageParam = {0};refVoltageParam.supplyVoltageReferenceBase = COMP_B_VREFBASE_VCC;refVoltageParam.lowerLimitSupplyVoltageFractionOf32 = 11;refVoltageParam.upperLimitSupplyVoltageFractionOf32 = 21;refVoltageParam.referenceAccuracy = COMP_B_ACCURACY_STATIC;Comp_B_configureReferenceVoltage(COMP_B_BASE, &refVoltageParam);//Allow power to Comparator moduleComp_B_enable(COMP_B_BASE);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1,GPIO_PIN6);__bis_SR_register(GIE);while(1){} }實驗現象
用萬用表測量P1.6輸出電壓,可觀察到,當CB5輸入電壓高于上門檻電壓時,P1.6輸出3.3V,當CB5輸入電壓低于下門檻電壓時,P1.6輸出0V,當處于兩者之間時,電壓連續變化。
總結
以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语音信号预处理3——计算原始chirp信
- 下一篇: PWA(Progressive Web