0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文分享MM32F0140 COMP的學(xué)習(xí)筆記

科技觀察員 ? 來源:靈動MM32 MCU ? 作者:靈動小姐姐 ? 2022-04-15 14:51 ? 次閱讀

COMP簡介

COMP作為比較器,可用于比較模擬輸入電壓,并集成數(shù)字濾波器,其結(jié)果可輸出至I/O口或定時器。

MM32F0140的COMP包含連接外部輸入的COMP正相通道1 ~ 4,連接CRV及其他外部輸入的COMP反相輸入通道1 ~ 4;支持多種速率和功耗,支持比較結(jié)果的濾波功能,支持通過外部事件將CPU從睡眠和停機(jī)模式喚醒,帶有輪詢功能。

COMP的功能框圖如圖1所示,COMP存在多個正相輸入與多個反相輸入通道,正相輸入可從各外部引腳之間選取,反相輸入可從外部引腳或者CRV電壓分壓值,CRV的電壓可選擇VDDA或者內(nèi)部參考電壓(VREFINT)的分壓。當(dāng)正相輸入電壓高于反相輸入電壓,輸出比較結(jié)果為高輸出,當(dāng)正相輸入電壓低于反相輸入電壓,輸出比較結(jié)果為低輸出,比較結(jié)果可輸出至定時器或I/O口。

pYYBAGJZFdOAB9WZAAEJvDTuQ44184.png

圖1.COMP功能框圖

COMP配置

COMP的配置包含關(guān)于輸出濾波、遲滯電壓、輸出極性、輸出方向選擇、正相輸入選擇、反相輸入選擇、功耗選擇及比較器工作模式選擇,其中在使用I/O端口用作比較器輸入時,需配置對應(yīng)引腳為模擬輸入模式;比較器也具有鎖定機(jī)制,可保證比較器的設(shè)置不會被無效寄存器訪問或因程序計數(shù)器破壞而改變。

遲滯電壓

遲滯電壓能夠防止噪聲干擾,保證系統(tǒng)工作更加穩(wěn)定,可通過操作比較器控制狀態(tài)寄存器(COMPx_CSR)的HYST位,對遲滯電壓進(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則為同相輸出。

輸出方向

通過操作比較器控制狀態(tài)寄存器(COMPx_CSR)的OUT_SEL位,可配置輸出結(jié)果到特定的定時器中,COMP輸出方向列表如圖2所示。

poYBAGJZFd6AGxsDAADleJ36XM4638.png

圖2.COMP輸出方向

正相輸入

操作比較器控制狀態(tài)寄存器(COMPx_CSR)的INP_SEL位,可對比較器的正相輸入信號源進(jìn)行選擇,共有4種信號源,正相通道如圖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)

poYBAGJZFeOAFCulAADDSL61jw4512.png

圖3.COMP正相輸入

反相輸入

操作比較器控制狀態(tài)寄存器(COMPx_CSR)的INM_SEL位,可對比較器的反相輸入信號源進(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)

poYBAGJZFeiAdA6zAADykUg2zIA615.png

圖4.COMP反相輸入

功耗模式

在具體應(yīng)用中,可通過調(diào)整比較器功耗和響應(yīng)時間得到最優(yōu)的結(jié)果,功耗模式共包含四種,能夠通過軟件操作比較器控制狀態(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個時鐘周期不變,則輸出有效,“n”為圖5中所例舉的時鐘周期數(shù)。

pYYBAGJZFe6APMKDAAEtJh66W50775.png

圖5.輸出濾波配置

工作模式

普通工作模式

COMP的輸入通道可以在普通工作模式下通過軟件選擇,配置比較器控制狀態(tài)寄存器(COMPx_CSR)的INP_SEL位和INM_SEL位選擇正相輸入與反相輸入,將COMPx_CSR寄存器的EN位置1,使能比較器,COMP比較所選擇的INP和INM端口上的信號,比較結(jié)果存放于COMPx_CSR寄存器的OUT位。若在配置COMP的INM_SEL位時選擇CRV,則需要配置比較器外部參考電壓寄存器(COMP_CRV)的CRV_SEL位,然后將CRV_EN置位。

輪詢工作模式

COMP可以在輪詢工作模式下通過硬件輪詢的方式分時監(jiān)測多個通道的比較結(jié)果,配置比較器輪詢寄存器(COMPx_POLL)的PER1OD位來選擇所需要的輪詢等待周期,配置F1XN位決定INM端口的信號是否跟隨INP端口輪詢變化,配置POLL_CH位決定所需要輪詢的通道是1/2/3 或者1/2,POLL_EN位置1啟動輪詢功能,再配置COMPx_CSR寄存器的EN位,使比較器開始上電工作,輪詢比較的結(jié)果存放于COMPx\_POLL寄存器的POUT位,其中POUT[2]、POUT[1]、POUT[0]位分別存放輪詢通道3/2/1的比較結(jié)果。

鎖定機(jī)制

為使比較器設(shè)置不會被無效寄存器訪問或因程序計數(shù)器破壞而改變,可將比較器控制狀態(tài)寄存器設(shè)置為寫保護(hù)。操作比較器控制狀態(tài)寄存器(COMPx_CSR)的LOCK位置1,使比較器鎖定,整個COMPx_CSR寄存器變成只讀,該位可由系統(tǒng)復(fù)位清零。

實驗

本實驗使用COMP的0號比較器,將正相輸入通道0與反相輸入通道0進(jìn)行比較,通過串口打印當(dāng)前的比較狀態(tài)。配置比較器控制狀態(tài)寄存器的OFLT位,設(shè)置為若比較結(jié)果保持4個時鐘周期不變,則輸出有效;配置HYST位使遲滯電壓為90mV,配置POL位使輸出極性為同相輸出,配置OUT_SEL位為0使輸出結(jié)果不進(jìn)入任何TIM,配置INP_SEL與INM_SEL位選擇正相輸入通道0與反相輸入通道0,配置MODE位使功耗為高速/高功耗;通過EN位置位使能COMP,給予正相輸入通道與反相輸入通道電壓,通過串口觀察比較結(jié)果

啟用COMP外設(shè)時鐘 enable_clock()

實驗使用COMP進(jìn)行正相輸入電壓與反相輸入電壓對比,采用串口打印的方式觀察實驗結(jié)果,所使用的引腳均屬于GPIOA組,因此需要啟用COMP、UART1及GPIOA的外設(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所對應(yīng)的引腳,正相通道0的對應(yīng)引腳為PA1,反相通道0的對應(yīng)引腳為PA5,模式配置為模擬輸入;由于實驗現(xiàn)象通過串口顯示,故配置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ù)據(jù)長度、停止位、傳輸模式及是否使用校驗。

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()

實驗使用COMP的0號比較器,操作比較器控制狀態(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é)合上述操作,通過讀取比較器控制狀態(tài)寄存器(COMP_CSR)的OUT位,獲取當(dāng)前輸出狀態(tài);本實驗使對應(yīng)引腳由杜邦線連接VCC或GND,從而給予正相輸入通道與反相輸入通道電壓,每按下任意按鍵就獲取一次當(dāng)前輸出狀態(tài),當(dāng)正相輸入高于反相輸入,輸出為高輸出,串口打印"- positive";當(dāng)正相輸入低于反相輸入,輸出為低輸出,串口打印"- inverse"。實驗結(jié)果如圖6所示,當(dāng)PA1接VCC且PA5接GND時,當(dāng)前輸出狀態(tài)為高輸出,按下任意按鍵,串口顯示"- positive";當(dāng)PA1接GND且PA5接VCC時,當(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. */
        }
    }
}

poYBAGJZFlOAJESuAAB0ol2S0MQ762.png

圖6.實驗結(jié)果

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 比較器
    +關(guān)注

    關(guān)注

    14

    文章

    1651

    瀏覽量

    107221
  • MM32
    +關(guān)注

    關(guān)注

    1

    文章

    106

    瀏覽量

    767
收藏 人收藏

    評論

    相關(guān)推薦

    基于MM32F5260的LVGL使用教程

    MM32F5260 是款搭載了基于 Arm v8-M 架構(gòu) 32 位 Star-MC1 內(nèi)核(兼容 Cortex-M33)的 MCU 產(chǎn)品,其工作頻率可達(dá) 120MHz,配置浮點運算單元
    的頭像 發(fā)表于 11-25 09:12 ?731次閱讀
    基于<b class='flag-5'>MM32F</b>5260的LVGL使用教程

    MM32F5270】Keil開發(fā)環(huán)境搭建

    本文是對MM32F5270相關(guān)的靈動官網(wǎng)資料和社區(qū)現(xiàn)有幾篇環(huán)境搭建帖的整理和總結(jié)。詳細(xì)且完整的記錄了——如何從零搭建MM32F5270 Keil開發(fā)環(huán)境以及如何編譯運行MM32F5270 SDK中
    的頭像 發(fā)表于 11-06 16:14 ?2771次閱讀
    【<b class='flag-5'>MM32F</b>5270】Keil開發(fā)環(huán)境搭建

    buck電路環(huán)路補償中comp電容電阻起什么作用

    環(huán)路補償是開關(guān)電源設(shè)計中的關(guān)鍵環(huán)節(jié),它確保了電源的穩(wěn)定性和響應(yīng)速度。在Buck轉(zhuǎn)換器中,環(huán)路補償通常涉及到補償網(wǎng)絡(luò),該網(wǎng)絡(luò)由個補償電容(Comp電容)和個補償電阻(Comp電阻)組
    的頭像 發(fā)表于 09-12 16:04 ?1241次閱讀

    測試UCC2808的誤差放大器開環(huán)增益,當(dāng)在COMP上施加電壓comp會出現(xiàn)梯形的波,怎么解決?

    我的需要測試PWM芯片UCC2808的誤差放大器開環(huán)增益,其誤差放大器正向端在芯片內(nèi)部接了2V電壓,輸出端COMP同時還是PWM輸入,反相端為FB。當(dāng)在COMP上施加電壓comp會出現(xiàn)梯形的波,電壓越大,梯形面積越大,輔助運放
    發(fā)表于 08-29 06:46

    LM318中的COMP1 COMP2 COMP3這三個管腳有什么用,應(yīng)該怎么接?

    請問下LM318中的COMP1 COMP2 COMP3這三個管腳有什么用,應(yīng)該怎么樣接?如果只是用于普通的跟隨器是否還有必要接?求各位大神回答~謝謝啦!
    發(fā)表于 08-28 06:05

    篇:V1.5-STM32f103c8t6智能小車筆記 標(biāo)準(zhǔn)庫開發(fā) 6612電機(jī)驅(qū)動新手入門項目

    這是全網(wǎng)最詳細(xì)、性價比最高的STM32實戰(zhàn)項目入門教程,通過合理的硬件設(shè)計和詳細(xì)的視頻筆記介紹,硬件使用STM32F103主控資料多方便學(xué)習(xí),通過3萬字筆記、12多個小時視頻、20多章
    的頭像 發(fā)表于 08-12 18:25 ?1639次閱讀
    第<b class='flag-5'>一</b>篇:V1.5-STM32<b class='flag-5'>f</b>103c8t6智能小車<b class='flag-5'>筆記</b> 標(biāo)準(zhǔn)庫開發(fā) 6612電機(jī)驅(qū)動新手入門項目

    LM318 COMP管腳是什么引腳,干什么用的?

    LM318 COMP 管腳是什么引腳,干什么用的,PSPICEFORTI 里面沒有318的COMP管腳在怎么應(yīng)用
    發(fā)表于 07-31 07:45

    小度發(fā)布首款百度心大模型學(xué)習(xí)機(jī)

    近日,小度科技推出了款基于心大模型的學(xué)習(xí)機(jī)——小度學(xué)習(xí)機(jī)Z30。這款學(xué)習(xí)機(jī)針對學(xué)習(xí)計劃、診斷
    的頭像 發(fā)表于 05-29 09:10 ?825次閱讀

    CoMP多點協(xié)同技術(shù)外場應(yīng)用

    當(dāng)前5G同頻組網(wǎng)場景多,且普遍采用多天線技術(shù),小區(qū)間交疊覆蓋大,交疊區(qū)存在較大的同頻干擾,影響用戶感知。同時在小區(qū)邊緣,用戶上行性能受限,導(dǎo)致網(wǎng)絡(luò)體驗偏差。多點協(xié)同(CoMP
    的頭像 發(fā)表于 05-24 08:05 ?374次閱讀
    <b class='flag-5'>CoMP</b>多點協(xié)同技術(shù)外場應(yīng)用

    芯??萍紤?yīng)用筆記:CS32F0XX TIMER外設(shè)模塊指導(dǎo)

    本應(yīng)用筆記旨在展示使用 CS32F0xx 微控器,針對定時器外設(shè)的應(yīng)用。幫助用戶了解 CS32F0xx 定時器的基本特性、操作模式及相關(guān)應(yīng)用的示例代碼。提供的些高級應(yīng)用以便縮短用戶開
    發(fā)表于 05-16 10:52

    STM8L151內(nèi)部比較器COMP1怎么用?為什么喚醒不了?

    如題,使用STM8L151G4U6的COMP1作為比較器檢測外部輸入電壓是否高于內(nèi)部參考1.24V的時候,在單片機(jī)沒有休眠的情況下,可以正常觸發(fā)中斷,也可以讀取比較器輸出結(jié)果,但是旦單片機(jī)進(jìn)入
    發(fā)表于 04-24 07:13

    跟優(yōu)秀的人,學(xué)習(xí)筆記!文末有看海的點評

    很多同學(xué)私信我,說自己學(xué)習(xí)時不會記筆記,要么是記錄的非常潦草,沒有保留有效信息。要么是把所有信息都抄到筆記本上,結(jié)果變成了抄書,自己都不想看。 我們學(xué)習(xí)時,怎么高效記錄
    的頭像 發(fā)表于 03-22 18:19 ?1187次閱讀
    跟優(yōu)秀的人,<b class='flag-5'>學(xué)習(xí)</b>記<b class='flag-5'>筆記</b>!文末有看海的點評

    allegro學(xué)習(xí)筆記

    電子發(fā)燒友網(wǎng)站提供《allegro學(xué)習(xí)筆記.zip》資料免費下載
    發(fā)表于 02-29 09:14 ?1次下載

    ElfBoard學(xué)習(xí)筆記分享

    與獨特視角。今天就跟大家分享篇共創(chuàng)官學(xué)習(xí)筆記,共同見證攜手進(jìn)步的真實寫照:本篇文章來源于ElfBoard的首批共創(chuàng)官oo,感謝分享!最近很榮幸能夠參加飛凌嵌入式舉
    的頭像 發(fā)表于 01-06 16:56 ?446次閱讀
    ElfBoard<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>分享

    LTM4625 comp FB管腳增加電容導(dǎo)致輸出電壓過大是什么原因?

    LTM4625電源芯片在COMP和FB管腳同時增加10nF電容,會導(dǎo)致FB電壓升高到0.7V左右,導(dǎo)致輸出電壓增大,COMP和FB管腳,單獨加電容電壓正常,這是什么原因
    發(fā)表于 01-05 07:46