RM新时代网站-首页

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

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

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

MM32F3270 ADC注入通道

jf_pJlTbmA9 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-09-27 15:59 ? 次閱讀

MM32F3270系列的ADC支持注入通道功能,每個(gè)ADC模塊具有4個(gè)注入通道。每個(gè)注入通道具有獨(dú)立的數(shù)據(jù)寄存器,注入通道具有比規(guī)則通道更高的優(yōu)先級。

規(guī)則通道是按照指定的通道順序進(jìn)行轉(zhuǎn)換。注入通道是指在規(guī)則通道轉(zhuǎn)換過程中,如果突然需要進(jìn)行其他某個(gè)通道的采樣,則會在規(guī)則通道該次轉(zhuǎn)換完成后停止轉(zhuǎn)換,進(jìn)行注入通道轉(zhuǎn)換直到轉(zhuǎn)換結(jié)束,再繼續(xù)規(guī)則通道轉(zhuǎn)換。

在一些特定場合使用ADC時(shí)可能會遇到很多情況,不僅僅簡單的按規(guī)則通道來采樣,有時(shí)候需要立刻采樣,這就要用到注入通道。

注入通道模式介紹

注入通道工作模式分為自動注入和事件注入兩種模式:

a) 自動注入:任意通道工作完成后自動開始注入通道工作;

b) 事件注入:注入事件到來, A/D轉(zhuǎn)換完成當(dāng)前轉(zhuǎn)換后開始注入通道轉(zhuǎn)換,完成注入通道轉(zhuǎn)換后繼續(xù)執(zhí)行任意通道轉(zhuǎn)換。

自動注入轉(zhuǎn)換模式

任意通道配置通道轉(zhuǎn)換完成后,自動開始注入通道轉(zhuǎn)換。如果任意通道是連續(xù)掃描模式,需要清除ADST才能停止轉(zhuǎn)換。配置自動注入轉(zhuǎn)換模式應(yīng)禁止注入事件發(fā)生。

wKgaomUD8aKAci4CAAGUYc_uk7U265.png 自動注入模式-通道轉(zhuǎn)換時(shí)序圖

事件注入工作模式

注入事件下禁止自動注入模式。注入事件發(fā)生后(包括軟件和觸發(fā)),如果當(dāng)前轉(zhuǎn)換正在進(jìn)行,則完成當(dāng)前轉(zhuǎn)換后開始注入通道轉(zhuǎn)換。

wKgZomUD8aSAbSGJAAG2PrjJ6LA216.png 任意通道轉(zhuǎn)換時(shí)注入事件轉(zhuǎn)換通道時(shí)序圖

在注入通道轉(zhuǎn)換期間有任意通道事件產(chǎn)生,注入轉(zhuǎn)換不會結(jié)束,但會保存任意通道事件。完成本次轉(zhuǎn)換序列后,開始任意通道事件的轉(zhuǎn)換。

wKgaomUD8aaATYywAAHCv7VworI950.png 注入通道轉(zhuǎn)換時(shí)任意事件轉(zhuǎn)換通道發(fā)生時(shí)序圖

使用觸發(fā)開始注入通道轉(zhuǎn)換,必須保證觸發(fā)事件的間隔長與注入序列,注入通道轉(zhuǎn)換期間發(fā)生注入事件將被忽略。

觸發(fā)信號

ADC轉(zhuǎn)換的觸發(fā)源包括軟件觸發(fā)、定時(shí)器和外部事件。

在觸發(fā)信號產(chǎn)生后,延時(shí)N個(gè)PCLK2的時(shí)鐘周期再開始采樣。如果是觸發(fā)掃描模式,只有第一個(gè)通道采樣被延時(shí),其余通道是在上一個(gè)采樣結(jié)束后立即開始。

設(shè)置ADC_ANY_CR寄存器的JTRGEN位可以使用外部事件觸發(fā)注入通道轉(zhuǎn)換。設(shè)置ADC_ANY_CR寄存器的JTRGSEL位可以選擇注入通道外部觸發(fā)源。

具體的外部觸發(fā)源選擇情況,可以參考AD控制寄存器(ADC_ADCR.TRGSEL 或ADC_ANY_CR.JTRGSEL)相關(guān)位的描述。外部觸發(fā)可設(shè)置延時(shí)控制,具體參考AD控制寄存器(ADC_ADCR.TRGSHIFT 或 ADC_ANY_CR.J TRGSHIFT)相關(guān)位的描述。

實(shí)驗(yàn)

本次實(shí)驗(yàn)使用ADC的注入通道:將ADC1的通道0配置為規(guī)則通道模式,通過軟件觸發(fā),并使用DMA傳輸數(shù)據(jù)。將ADC1的通道1配置為注入通道模式,通過外部事件觸發(fā),并使用中斷,在中斷服務(wù)子程序中,就可以獲取AD值。

開始只有ADC1的通道0進(jìn)行AD轉(zhuǎn)換,通道1不進(jìn)行AD轉(zhuǎn)換。當(dāng)外部事件發(fā)生后,通道0當(dāng)前轉(zhuǎn)換結(jié)束后停止,通道1開始進(jìn)行轉(zhuǎn)換直至結(jié)束,通道0繼續(xù)進(jìn)行AD轉(zhuǎn)換,經(jīng)MCU處理將電壓數(shù)據(jù)打印出來。

程序設(shè)計(jì)

ADC1 配置初始化

void ADC1BasicConfigWithParameter(void)
{
    ADC_InitTypeDef  ADC_InitStruct;
    ADC_TypeDef* ADCn;
    ADCn = ADC1;
    ADC_StructInit( ADC_InitStruct);

    ADCxClockSet(ADCn, ENABLE);        
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStruct.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;
    ADC_InitStruct.ADC_Mode = ADC_Mode_Continue;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

    ADC_Init(ADCn,  ADC_InitStruct);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 0, ADC_SMPR1_SAMCTL0_240_5);   

    ADC_InjectedSequencerConfig(ADC1, ADC_ANY_CR_JTRGSEL_EXTI12, ADC_ANY_CR_JTRGSHIFT_64);
    ADC_InjectedSequencerLengthConfig(ADC1, ADC_Inject_Seqen_Len1);    
    ADC_InjectedSequencerChannelConfig(ADC1, ADC_InjectedChannel_1, ADC_Channel_1);  

    ADC1->ANYCR |= (1<<4);
    DMAInit();
    ADC_DMACmd(ADCn, ENABLE);
    ADC_Cmd(ADCn, ENABLE);   
}

外部事件初始化

ADC觸發(fā)源選擇外部事件觸發(fā)方式,配置EXTI_Line12下降沿觸發(fā)外部中斷,通過PB12復(fù)用為外部中斷/事件線。

void EXTIX_Init(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFG, ENABLE);

    //Set to pull-up input
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
    GPIO_StructInit( GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  
    GPIO_Init(GPIOB,  GPIO_InitStructure);

    //GPIOB.12
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource12);
    EXTI_StructInit( EXTI_InitStructure);
    EXTI_InitStructure.EXTI_Line = EXTI_Line12;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
    //Falling edge trigger
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init( EXTI_InitStructure);
}

ADC1中斷服務(wù)函數(shù)

外部事件觸發(fā)ADC注入通道采樣,轉(zhuǎn)換完成便會觸發(fā)ADC中斷,在中斷服務(wù)子程序中獲取AD值。

void ADC1_2_IRQHandler(void)
{
    if(RESET != ADC_SREXT_JEOSIF) 
    {
        ADC1->SREXT |= (1 << 20);   //Clear the bit by writing about 1 
        ADCVAL = ADC_GetInjectedCurrentConvertedValue(ADC1);
        Flag_InjectConvert = 1;
        if(RESET != EXTI_GetFlagStatus(EXTI_Line12))  {
            EXTI_ClearITPendingBit(EXTI_Line12);
        }
    }
}

DMA中斷服務(wù)函數(shù)

規(guī)則通道使用DMA中斷進(jìn)行數(shù)據(jù)傳輸,在DMA中斷服務(wù)函數(shù)中調(diào)用ADCFilter()函數(shù)對獲取的AD值做濾波處理。

void DMA1_Channel1_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_IT_TC1))  {
        DMA_ClearITPendingBit(DMA1_IT_TC1);
        ADCFilter();
    }
}

主函數(shù)

示例中將獲取的AD值與3.3V比對,轉(zhuǎn)換為ADC輸入通道的電壓,并間隔300ms打印。

s32 main(void)
{
    DELAY_Init();
    CONSOLE_Init(115200);
    ADC1_ConfigInit();
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while(1) 
    {
        if(Flag_InjectConvert)
        {
            Flag_InjectConvert = 0;
            fValue = ((float)ADCVAL / 4095) * 3.3; 
            // ADC injection channel
            printf("ADC1_CH_1 = %fVrnn", fValue);
        }   
        if(Flag_ADCFilter) 
        {
            Flag_ADCFilter = 0;
            //Convert the filtered value to voltage  
            ADCVolatge = ((float)ADCFilterValue / 4095) * 3.3;
            //ADC regular channels
            printf("ADC1_CH_0 = %fVrnn", ADCVolatge);
            ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
        }
        DELAY_Ms(300);
    }
}

演示

在開發(fā)板上將PA0(ADC1通道0)連接板上GND,將PA1(ADC1通道1)連接板上3.3V。

運(yùn)行程序,開始時(shí)只有ADC1通道0(規(guī)則通道)進(jìn)行AD轉(zhuǎn)換。給PB12一個(gè)下降沿信號,此時(shí)外部事件觸發(fā)ADC1通道1(注入通道)進(jìn)行AD轉(zhuǎn)換,通道0當(dāng)前轉(zhuǎn)換完成后停止AD轉(zhuǎn)換,通道1進(jìn)行轉(zhuǎn)換直到結(jié)束,通道0進(jìn)行AD轉(zhuǎn)換。串口調(diào)試助手顯示如下:

wKgZomUD8aiAf9F9AAE0ko-aJq4383.png

各通道輸出數(shù)據(jù)和采樣電壓一致,與預(yù)期相符。在一些ADC應(yīng)用場合中,通常將注入通道和規(guī)則通道混合使用,在規(guī)則通道轉(zhuǎn)換的過程中立刻進(jìn)行注入通道采樣,充分發(fā)揮ADC外設(shè)的特性。

來源:靈動MM32MCU

審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    17123

    瀏覽量

    350978
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6495

    瀏覽量

    544460
  • 時(shí)序圖
    +關(guān)注

    關(guān)注

    2

    文章

    58

    瀏覽量

    22443
收藏 人收藏

    評論

    相關(guān)推薦

    MM32F3270系列32位MCU的特點(diǎn)有哪些

    上海靈動微電子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3內(nèi)核的32位微控制器,MM32F3270適用于要求高集成度的高性能控制領(lǐng)域,如:工業(yè)控制、消防監(jiān)控
    發(fā)表于 11-03 07:20

    靈動微課堂 (第195講) | MM32F3270 ADC注入通道

    MM32F3270系列的ADC支持注入通道功能,每個(gè)ADC模塊具有4個(gè)注入
    發(fā)表于 01-10 11:35

    靈動微電子MM32F3270系列MCU的特點(diǎn)介紹

    上海靈動微電子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3內(nèi)核的32位微控制器,MM32F3270適用于要求高集成度的高性能控制領(lǐng)域,如:工業(yè)控制、消防監(jiān)控
    發(fā)表于 03-22 16:57 ?2156次閱讀

    【國產(chǎn)MCU移植】MM32F3270 EVBoard

    【國產(chǎn)MCU移植】MM32F3270 EVBoard
    發(fā)表于 12-03 17:21 ?5次下載
    【國產(chǎn)MCU移植】<b class='flag-5'>MM32F3270</b> EVBoard

    基于MM32F3270 以太網(wǎng) Client使用

    接下來給大家介紹基于TCP包的通訊。內(nèi)容分為基于MM32F3270以太網(wǎng)Client的使用與基于MM32F3270以太網(wǎng)Server的使用。
    發(fā)表于 02-08 15:10 ?0次下載
    基于<b class='flag-5'>MM32F3270</b> 以太網(wǎng) Client使用

    MM32F3270 產(chǎn)品手冊(中文版)

    MM32F3270 產(chǎn)品手冊(中文版)
    發(fā)表于 02-23 18:40 ?0次下載
    <b class='flag-5'>MM32F3270</b> 產(chǎn)品手冊(中文版)

    MM32F3270 勘誤表(中文版)

    MM32F3270 勘誤表(中文版)
    發(fā)表于 02-23 18:42 ?0次下載
    <b class='flag-5'>MM32F3270</b> 勘誤表(中文版)

    MM32F3270 勘誤表(英文版)

    MM32F3270 勘誤表(英文版)
    發(fā)表于 02-23 18:43 ?0次下載
    <b class='flag-5'>MM32F3270</b> 勘誤表(英文版)

    使用MM32F3270基于Azure RTOS (ThreadX) 的移植

    使用MM32F3270基于Azure RTOS (ThreadX) 的移植
    的頭像 發(fā)表于 10-27 10:15 ?756次閱讀
    使用<b class='flag-5'>MM32F3270</b>基于Azure RTOS (ThreadX) 的移植

    基于MM32F3270 I2S使用

    基于MM32F3270 I2S使用
    的頭像 發(fā)表于 09-27 15:50 ?796次閱讀
    基于<b class='flag-5'>MM32F3270</b> I2S使用

    使用MM32F3270 FSMC驅(qū)動OLED

    使用MM32F3270 FSMC驅(qū)動OLED
    的頭像 發(fā)表于 09-27 15:30 ?942次閱讀
    使用<b class='flag-5'>MM32F3270</b> FSMC驅(qū)動OLED

    使用MM32F3270 FSMC驅(qū)動TFT-LCD

    使用MM32F3270 FSMC驅(qū)動TFT-LCD
    的頭像 發(fā)表于 09-27 15:34 ?1007次閱讀
    使用<b class='flag-5'>MM32F3270</b> FSMC驅(qū)動TFT-LCD

    基于MM32F3270以太網(wǎng)Client使用

    基于MM32F3270以太網(wǎng)Client使用
    的頭像 發(fā)表于 09-27 15:44 ?695次閱讀
    基于<b class='flag-5'>MM32F3270</b>以太網(wǎng)Client使用

    基于MM32F3270以太網(wǎng)UDP使用

    基于MM32F3270以太網(wǎng) UDP使用
    的頭像 發(fā)表于 09-27 15:42 ?494次閱讀
    基于<b class='flag-5'>MM32F3270</b>以太網(wǎng)UDP使用

    基于MM32F3270以太網(wǎng)Client_Socket使用

    基于MM32F3270以太網(wǎng)Client_Socket使用
    的頭像 發(fā)表于 09-27 15:37 ?537次閱讀
    基于<b class='flag-5'>MM32F3270</b>以太網(wǎng)Client_Socket使用
    RM新时代网站-首页