COMP簡(jiǎn)介
COMP作為比較器,可用于比較模擬輸入電壓,并集成數(shù)字濾波器,其結(jié)果可輸出至I/O口或定時(shí)器。
MM32F0140的COMP包含連接外部輸入的COMP正相通道1 ~ 4,連接CRV及其他外部輸入的COMP反相輸入通道1 ~ 4;支持多種速率和功耗,支持比較結(jié)果的濾波功能,支持通過(guò)外部事件將CPU從睡眠和停機(jī)模式喚醒,帶有輪詢(xún)功能。
COMP的功能框圖如圖1所示,COMP存在多個(gè)正相輸入與多個(gè)反相輸入通道,正相輸入可從各外部引腳之間選取,反相輸入可從外部引腳或者CRV電壓分壓值,CRV的電壓可選擇VDDA或者內(nèi)部參考電壓(VREFINT)的分壓。當(dāng)正相輸入電壓高于反相輸入電壓,輸出比較結(jié)果為高輸出,當(dāng)正相輸入電壓低于反相輸入電壓,輸出比較結(jié)果為低輸出,比較結(jié)果可輸出至定時(shí)器或I/O口。

圖1.COMP功能框圖
COMP配置
COMP的配置包含關(guān)于輸出濾波、遲滯電壓、輸出極性、輸出方向選擇、正相輸入選擇、反相輸入選擇、功耗選擇及比較器工作模式選擇,其中在使用I/O端口用作比較器輸入時(shí),需配置對(duì)應(yīng)引腳為模擬輸入模式;比較器也具有鎖定機(jī)制,可保證比較器的設(shè)置不會(huì)被無(wú)效寄存器訪(fǎng)問(wèn)或因程序計(jì)數(shù)器破壞而改變。
遲滯電壓
遲滯電壓能夠防止噪聲干擾,保證系統(tǒng)工作更加穩(wěn)定,可通過(guò)操作比較器控制狀態(tài)寄存器(COMPx_CSR)的HYST位,對(duì)遲滯電壓進(jìn)行配置。遲滯電壓可配置為:90mV(HYST[1:0]=11)、30mV(HYST[1:0]=10)、15mV(HYST[1:0]=01)、0mV(HYST[1:0]=00)。
輸出極性
輸出極性用于設(shè)置輸出為同相輸出或反相輸出,操作比較器控制狀態(tài)寄存器(COMPx_CSR)的POL位,POL配置為1則為反相輸出,POL位配置為0則為同相輸出。
輸出方向
通過(guò)操作比較器控制狀態(tài)寄存器(COMPx_CSR)的OUT_SEL位,可配置輸出結(jié)果到特定的定時(shí)器中,COMP輸出方向列表如圖2所示。

圖2.COMP輸出方向
正相輸入
操作比較器控制狀態(tài)寄存器(COMPx_CSR)的INP_SEL位,可對(duì)比較器的正相輸入信號(hào)源進(jìn)行選擇,共有4種信號(hào)源,正相通道如圖3所示。
正相通道0 COMPx_INP0(INP\_SEL[1:0]=00)
正相通道1 COMPx_INP1(INP\_SEL[1:0]=01)
正相通道2 COMPx_INP2(INP\_SEL[1:0]=10)
正相通道3 COMPx_INP3(INP\_SEL[1:0]=11)

圖3.COMP正相輸入
反相輸入
操作比較器控制狀態(tài)寄存器(COMPx_CSR)的INM_SEL位,可對(duì)比較器的反相輸入信號(hào)源進(jìn)行選擇,部分反相通道如圖4所示。
反相通道0 COMPx_INM0(INM\_SEL[2:0]=000)
反相通道1 COMPx_INM1(INM\_SEL[2:0]=001)
反相通道2 COMPx_INM2(INM\_SEL[2:0]=010)
反相通道3 COMPx_INM3(INM\_SEL[2:0]=011)
反相通道4 COMPx_INM4(INM\_SEL[2:0]=100)

圖4.COMP反相輸入
功耗模式
在具體應(yīng)用中,可通過(guò)調(diào)整比較器功耗和響應(yīng)時(shí)間得到最優(yōu)的結(jié)果,功耗模式共包含四種,能夠通過(guò)軟件操作比較器控制狀態(tài)寄存器(COMPx_CSR)的MODE位進(jìn)行功耗設(shè)置。
高速/高功耗(MODE[1:0]=00)
中速/中等功耗(MODE[1:0]=01)
低速/低功耗(MODE[1:0]=10)
極低速/極低功耗(MODE[1:0]=11)
輸出濾波
操作比較器控制狀態(tài)寄存器(COMPx_CSR)的OFLT位,可進(jìn)行輸出濾波的配置,若比較結(jié)果保持n個(gè)時(shí)鐘周期不變,則輸出有效,“n”為圖5中所例舉的時(shí)鐘周期數(shù)。

圖5.輸出濾波配置
工作模式
普通工作模式
COMP的輸入通道可以在普通工作模式下通過(guò)軟件選擇,配置比較器控制狀態(tài)寄存器(COMPx_CSR)的INP_SEL位和INM_SEL位選擇正相輸入與反相輸入,將COMPx_CSR寄存器的EN位置1,使能比較器,COMP比較所選擇的INP和INM端口上的信號(hào),比較結(jié)果存放于COMPx_CSR寄存器的OUT位。若在配置COMP的INM_SEL位時(shí)選擇CRV,則需要配置比較器外部參考電壓寄存器(COMP_CRV)的CRV_SEL位,然后將CRV_EN置位。
輪詢(xún)工作模式
COMP可以在輪詢(xún)工作模式下通過(guò)硬件輪詢(xún)的方式分時(shí)監(jiān)測(cè)多個(gè)通道的比較結(jié)果,配置比較器輪詢(xún)寄存器(COMPx_POLL)的PER1OD位來(lái)選擇所需要的輪詢(xún)等待周期,配置F1XN位決定INM端口的信號(hào)是否跟隨INP端口輪詢(xún)變化,配置POLL_CH位決定所需要輪詢(xún)的通道是1/2/3 或者1/2,POLL_EN位置1啟動(dòng)輪詢(xún)功能,再配置COMPx_CSR寄存器的EN位,使比較器開(kāi)始上電工作,輪詢(xún)比較的結(jié)果存放于COMPx\_POLL寄存器的POUT位,其中POUT[2]、POUT[1]、POUT[0]位分別存放輪詢(xún)通道3/2/1的比較結(jié)果。
鎖定機(jī)制
為使比較器設(shè)置不會(huì)被無(wú)效寄存器訪(fǎng)問(wèn)或因程序計(jì)數(shù)器破壞而改變,可將比較器控制狀態(tài)寄存器設(shè)置為寫(xiě)保護(hù)。操作比較器控制狀態(tài)寄存器(COMPx_CSR)的LOCK位置1,使比較器鎖定,整個(gè)COMPx_CSR寄存器變成只讀,該位可由系統(tǒng)復(fù)位清零。
實(shí)驗(yàn)
本實(shí)驗(yàn)使用COMP的0號(hào)比較器,將正相輸入通道0與反相輸入通道0進(jìn)行比較,通過(guò)串口打印當(dāng)前的比較狀態(tài)。配置比較器控制狀態(tài)寄存器的OFLT位,設(shè)置為若比較結(jié)果保持4個(gè)時(shí)鐘周期不變,則輸出有效;配置HYST位使遲滯電壓為90mV,配置POL位使輸出極性為同相輸出,配置OUT_SEL位為0使輸出結(jié)果不進(jìn)入任何TIM,配置INP_SEL與INM_SEL位選擇正相輸入通道0與反相輸入通道0,配置MODE位使功耗為高速/高功耗;通過(guò)EN位置位使能COMP,給予正相輸入通道與反相輸入通道電壓,通過(guò)串口觀察比較結(jié)果
啟用COMP外設(shè)時(shí)鐘 enable_clock()
實(shí)驗(yàn)使用COMP進(jìn)行正相輸入電壓與反相輸入電壓對(duì)比,采用串口打印的方式觀察實(shí)驗(yàn)結(jié)果,所使用的引腳均屬于GPIOA組,因此需要啟用COMP、UART1及GPIOA的外設(shè)時(shí)鐘。
void enable_clock()
{
/* Enable COMP clock. */
RCC->APB2ENR |= RCC_APB2_PERIPH_COMP;
/* Enable GPIOA clock. */
RCC->AHB1ENR |= RCC_AHB1_PERIPH_GPIOA;
/* Enable UART1 clock. */
RCC->APB2ENR |= RCC_APB2_PERIPH_UART1;
}
配置引腳 pin_init()
配置COMP的正相輸入通道0與反相輸入通道0所對(duì)應(yīng)的引腳,正相通道0的對(duì)應(yīng)引腳為PA1,反相通道0的對(duì)應(yīng)引腳為PA5,模式配置為模擬輸入;由于實(shí)驗(yàn)現(xiàn)象通過(guò)串口顯示,故配置UART的TX(PA9)與RX(PA10)引腳。
void pin_init()
{
/* PA1 - COMP PInput_0. */
GPIOA->CRL &= ~GPIO_CRL_MODE1_MASK;
GPIOA->CRL |= GPIO_CRL_MODE1(GPIO_PinMode_In_Analog); /* PA1 Analog input. */
/* PA5 - COMP NInput_0. */
GPIOA->CRL &= ~GPIO_CRL_MODE5_MASK;
GPIOA->CRL |= GPIO_CRL_MODE5(GPIO_PinMode_In_Analog); /* PA5 Analog input. */
/* Setup PA9, PA10. */
GPIOA->CRH &= ~GPIO_CRH_MODE9_MASK;
GPIOA->CRH |= GPIO_CRH_MODE9(GPIO_PinMode_AF_PushPull); /* PA9 multiplexed push-pull output. */
GPIOA->AFRH &= ~GPIO_AFRH_AFR_MASK;
GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE9_SHIFT); /* Use AF1. */
GPIOA->CRH &= ~GPIO_CRH_MODE10_MASK;
GPIOA->CRH |= GPIO_CRH_MODE10(GPIO_PinMode_In_Floating); /* PA10 floating input. */
GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE10_SHIFT); /* Use AF1. */
}
UART初始化 uart_init()
初始化UART,配置時(shí)鐘頻率、波特率、數(shù)據(jù)長(zhǎng)度、停止位、傳輸模式及是否使用校驗(yàn)。
void uart_init()
{
/* Clear the corresponding bit to be used. */
UART1->CCR &= ~( UART_CCR_PEN_MASK | UART_CCR_PSEL_MASK | UART_CCR_SPB0_MASK | UART_CCR_SPB1_MASK | UART_CCR_CHAR_MASK );
UART1->GCR &= ~( UART_GCR_AUTOFLOWEN_MASK | UART_GCR_RXEN_MASK | UART_GCR_TXEN_MASK );
/* WordLength. */
UART1->CCR |= UART_CCR_CHAR_MASK;
/* XferMode. */
UART1->GCR |= (UART_XferMode_RxTx << UART_GCR_RXEN_SHIFT);
/* Setup baudrate, BOARD_DEBUG_UART_FREQ = 48000000u, BOARD_DEBUG_UART_BAUDRATE = 9600u. */
UART1->BRR = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) / 16u;
UART1->FRA = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) % 16u;
/* Enable UART1. */
UART1->GCR |= UART_GCR_UARTEN_MASK;
}
COMP初始化 comp_init()
實(shí)驗(yàn)使用COMP的0號(hào)比較器,操作比較器控制狀態(tài)寄存器(COMP1_CSR),配置輸出濾波、遲滯電壓、輸出極性、輸出方向選擇、正相輸入通道、反相輸入通道及功耗模式。
void comp_init()
{
/* Output filter. */
COMP->CSR[0] |= COMP_CSR_OFLT(COMP_OutFilter_4); /* If the comparison result remains unchanged for four clock cycles, the output is valid. COMP_OutFilter_4 = 2. */
/* Hysteresis. */
COMP->CSR[0] |= COMP_CSR_HYST(COMP_Hysteresis_Alt3); /* 90mV, COMP_Hysteresis_Alt3 = 3. */
/* No invert output. */
COMP->CSR[0] |= COMP_CSR_POL(false); /* In-phase output. */
/* Not output to other peripheral input. */
COMP->CSR[0] |= COMP_CSR_OUTSEL(COMP_OutMux_None); /* COMP_OutMux_None = 0. */
/* Positive side. */
COMP->CSR[0] |= COMP_CSR_INPSEL(COMP_InMux_Alt0); /* COMP_INP[0], PA1, COMP_InMux_Alt0 = 0. */
/* Inverse side. */
COMP->CSR[0] |= COMP_CSR_INMSEL(COMP_InMux_Alt0); /* COMP_INM[0], PA5, COMP_InMux_Alt0 = 0. */
/* The faster the speed, the higher the power consumption. */
COMP->CSR[0] |= COMP_CSR_MODE(COMP_Speed_High); /* COMP_Speed_High = 0, high speed, high power. */
}
main()函數(shù)
main()函數(shù)結(jié)合上述操作,通過(guò)讀取比較器控制狀態(tài)寄存器(COMP_CSR)的OUT位,獲取當(dāng)前輸出狀態(tài);本實(shí)驗(yàn)使對(duì)應(yīng)引腳由杜邦線(xiàn)連接VCC或GND,從而給予正相輸入通道與反相輸入通道電壓,每按下任意按鍵就獲取一次當(dāng)前輸出狀態(tài),當(dāng)正相輸入高于反相輸入,輸出為高輸出,串口打印"- positive";當(dāng)正相輸入低于反相輸入,輸出為低輸出,串口打印"- inverse"。實(shí)驗(yàn)結(jié)果如圖6所示,當(dāng)PA1接VCC且PA5接GND時(shí),當(dāng)前輸出狀態(tài)為高輸出,按下任意按鍵,串口顯示"- positive";當(dāng)PA1接GND且PA5接VCC時(shí),當(dāng)前輸出狀態(tài)為低輸出,按下任意按鍵,串口顯示"- inverse"。
void main()
{
enable_clock();
pin_init();
uart_init();
printf("comp_basic example.\r\n");
comp_init();
printf("press any key to get compare result ...\r\n");
while (1)
{
getchar();
if ( 0u != ( COMP_CSR_OUT_MASK & COMP->CSR[0] ) )
{
printf("- positive.\r\n"); /* The positive input voltage is higher than the negative input voltage. */
}
else
{
printf("- inverse.\r\n"); /* The positive input voltage is lower than the negative input voltage. */
}
}
}

圖6.實(shí)驗(yàn)結(jié)果
-
比較器
+關(guān)注
關(guān)注
14文章
1929瀏覽量
111933 -
MM32
+關(guān)注
關(guān)注
1文章
108瀏覽量
1395
發(fā)布評(píng)論請(qǐng)先 登錄
基于靈動(dòng)MM32F0140微控制器的汽車(chē)傳感控制
基于靈動(dòng)MM32F0140國(guó)產(chǎn)32位單片機(jī)的Mini-LED應(yīng)用
基于靈動(dòng)MM32F0010微控制器的空氣炸鍋應(yīng)用方案
國(guó)產(chǎn)MCU-靈動(dòng)微MM32F0050系列微控制器的簡(jiǎn)單分享
一文講解LDO學(xué)習(xí)筆記
戴睿A16:17mm機(jī)身,1.6kg輕盈,打造移動(dòng)辦公學(xué)習(xí)全能體驗(yàn)。#戴睿 #戴睿筆記本
SN8F5762中文規(guī)格書(shū)
多軸運(yùn)動(dòng)控制器JMC-F2-A6中文手冊(cè)
極海APM32F407 uc/os3學(xué)習(xí)筆記之任務(wù)管理介紹
硬件原理圖學(xué)習(xí)筆記
PIC16F630/676中文數(shù)據(jù)手冊(cè)
靈動(dòng)微電子推出全新超值型MM32F0050系列MCU
STM32Cube學(xué)習(xí)筆記 (十六篇全)
移植RT-Thread到靈動(dòng)微MM32F5265開(kāi)發(fā)板教程
一文分享MM32F0140 COMP的學(xué)習(xí)筆記
評(píng)論