日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

STM32CubeMX教程15 ADC - 多重ADC转换

發(fā)布時(shí)間:2024/1/16 windows 39 coder
生活随笔 收集整理的這篇文章主要介紹了 STM32CubeMX教程15 ADC - 多重ADC转换 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、準(zhǔn)備材料

開(kāi)發(fā)板(正點(diǎn)原子stm32f407探索者開(kāi)發(fā)板V2.4)

STM32CubeMX軟件(Version 6.10.0)

keil μVision5 IDE(MDK-Arm)

ST-LINK/V2驅(qū)動(dòng)

野火DAP仿真器

XCOM V2.6串口助手

3個(gè)滑動(dòng)變阻器

2、實(shí)驗(yàn)?zāi)繕?biāo)

使用STM32CubeMX軟件配置STM32F407開(kāi)發(fā)板的ADC實(shí)現(xiàn)多重ADC采集,具體為使用ADC1_IN5、ADC2_IN6實(shí)現(xiàn)二重ADC采集,使用ADC1_IN5、ADC2_IN6和ADC3_IN5實(shí)現(xiàn)三重ADC采集

3、二重ADC轉(zhuǎn)換

3.0、前提知識(shí)

STM32F407的三個(gè)ADC可以組合實(shí)現(xiàn)多重ADC采集,當(dāng)僅僅開(kāi)啟一個(gè)ADC時(shí),該ADC只能工作在獨(dú)立模式;當(dāng)同時(shí)啟動(dòng)ADC1和ADC2,則以ADC1為主器件,ADC2為從器件可以工作在雙重ADC采集模式下;當(dāng)同時(shí)啟動(dòng)ADC1/2/3,則以ADC1為主器件,ADC2/3為從器件可以工作在三重ADC采集模式下;

在多重 ADC 模式下可實(shí)現(xiàn)以下6種模式

  1. 二/三重注入同時(shí)模式 + 規(guī)則同時(shí)模式
  2. 二/三重規(guī)則同時(shí)模式 + 交替觸發(fā)模式
  3. 二/三重注入同時(shí)模式
  4. 二/三重規(guī)則同時(shí)模式
  5. 二/三重交替模式
  6. 二/三重交替觸發(fā)模式

本實(shí)驗(yàn)我們只介紹二/三重規(guī)則同時(shí)模式,如下圖所示為CubeMX配置中可選的所有模式

工作在多重ADC模式下的DMA請(qǐng)求擁有三種DMA模式,這里只介紹DMA access mode 1/2,不會(huì)涉及DMA access mode 3

二重規(guī)則同時(shí)模式ADC采集時(shí)只能選擇DMA access mode 2,三重規(guī)則同時(shí)模式ADC采集時(shí)只能選擇DMA access mode 1

下面請(qǐng)讀者重點(diǎn)理解采集完成的數(shù)據(jù)是如何通過(guò)DMA存入用戶定義好的數(shù)組中的!

當(dāng)ADC工作在二重規(guī)則同時(shí)模式下,此時(shí)DMA模式為DMA access mode 2,在ADC1或ADC2轉(zhuǎn)換事件結(jié)束時(shí),會(huì)生成一個(gè)32位DMA傳輸請(qǐng)求,此請(qǐng)求會(huì)將存儲(chǔ)在 ADC_CDR 32 位寄存器高位半字中的 ADC2 轉(zhuǎn)換數(shù)據(jù)傳輸?shù)絊RAM,然后將存儲(chǔ)在ADC_CCR低位半字中的ADC1轉(zhuǎn)換數(shù)據(jù)傳輸?shù)?SRAM,也就是說(shuō)我們只需定義一個(gè)包含一個(gè)元素的uint32_t DataBuffer[1]數(shù)組,以DMA方式啟動(dòng)ADC轉(zhuǎn)換后,只需每次從高16位讀取ADC2采集的數(shù)據(jù),從低16位讀取ADC1采集的數(shù)據(jù)即可

當(dāng)ADC工作在三重規(guī)則同時(shí)模式下,此時(shí)DMA模式為DMA access mode 1,在ADC1、ADC2或ADC3轉(zhuǎn)換事件結(jié)束時(shí),會(huì)生成三個(gè)32位DMA傳輸請(qǐng)求,之后會(huì)發(fā)生三次從 ADC_CDR 32 位寄存器到SRAM的傳輸:首先傳輸 ADC1 轉(zhuǎn)換數(shù)據(jù),然后是 ADC2 轉(zhuǎn)換數(shù)據(jù),最后是 ADC3 轉(zhuǎn)換數(shù)據(jù),也就是說(shuō)我們需定義一個(gè)包含三個(gè)元素的uint32_t DataBuffer[3]數(shù)組,其中第一個(gè)元素DataBuffer[0]表示ADC1采集的數(shù)據(jù),第二個(gè)元素DataBuffer[1]表示ADC2采集的數(shù)據(jù),第三個(gè)元素DataBuffer[2]表示ADC3采集的數(shù)據(jù)

上述描述如下圖所示 (注釋1)

如下圖所示為多重ADC框圖,當(dāng)工作在二重ADC時(shí)不存在ADC3,ADC1/2/3三個(gè)ADC只有ADC1為主ADC,當(dāng)以多重ADC工作時(shí),只需要配置主ADC的DMA傳輸,從ADC無(wú)需設(shè)置,在啟動(dòng)多重ADC采集時(shí)也只能以DMA方式啟動(dòng)主ADC,從ADC以普通方式啟動(dòng)即可,不能將從ADC也以DMA方式啟動(dòng),多重ADC采集的數(shù)據(jù)均會(huì)存入32位的通用規(guī)則數(shù)據(jù)寄存器中

3.1、CubeMX相關(guān)配置

3.1.0、工程基本配置

打開(kāi)STM32CubeMX軟件,單擊ACCESS TO MCU SELECTOR選擇開(kāi)發(fā)板MCU(選擇你使用開(kāi)發(fā)板的主控MCU型號(hào)),選中MCU型號(hào)后單擊頁(yè)面右上角Start Project開(kāi)始工程,具體如下圖所示

開(kāi)始工程之后在配置主頁(yè)面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具體如下圖所示

詳細(xì)工程建立內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”

3.1.1、時(shí)鐘樹(shù)配置

系統(tǒng)時(shí)鐘使用8MHz外部高速時(shí)鐘HSE,HCLK、PCLK1和PCLK2均設(shè)置為STM32F407能達(dá)到的最高時(shí)鐘頻率,具體如下圖所示

3.1.2、外設(shè)參數(shù)配置

本實(shí)驗(yàn)需要需要初始化USART1作為輸出信息渠道,具體配置步驟請(qǐng)閱讀“STM32CubeMX教程9 USART/UART 異步通信”

設(shè)置TIM3通用定時(shí)器溢出時(shí)間100ms,外部觸發(fā)事件選擇更新事件,參數(shù)詳解請(qǐng)閱讀“STM32CubeMX教程6 TIM 通用定時(shí)器 - 生成PWM波”實(shí)驗(yàn),具體配置如下圖所示

在Pinout & Configuration頁(yè)面左邊功能分類欄目Analog中單擊其中ADC1,勾選IN5通道

Mode (ADC模式):修改為Dual regular simultaneous mode only(需要啟用ADC2通道才可以選擇二重ADC采集模式)

DMA Access Mode (DMA模式):選擇DMA access mode 2

DMA Continuous Requests (DMA連續(xù)轉(zhuǎn)化請(qǐng)求):使能(需要先增加DMA請(qǐng)求才可以使能)

其他參數(shù)與“STM32CubeMX教程13 ADC - 單通道轉(zhuǎn)換”實(shí)驗(yàn)均保持一致,具體配置如下圖所示

單擊Configuration中的DMA Settings選項(xiàng)卡對(duì)ADC1的DMA請(qǐng)求進(jìn)行設(shè)置,所有配置均與“STM32CubeMX教程14 ADC - 多通道DMA轉(zhuǎn)換”實(shí)驗(yàn)保持一致,具體配置如下圖所示

在Pinout & Configuration頁(yè)面左邊功能分類欄目Analog中單擊其中ADC2,勾選IN6通道,注意除 Rank DMA Continuous Requests 參數(shù)外所有參數(shù)配置必須與ADC1保持一致,否則ADC采集將出現(xiàn)錯(cuò)誤,具體配置如下圖所示

3.1.3、外設(shè)中斷配置

在Pinout & Configuration頁(yè)面左邊System Core/NVIC中勾選DMA2 Stream0 全局中斷,然后選擇合適的中斷優(yōu)先級(jí)即可,具體配置如下圖所示

3.2、生成代碼

3.2.0、配置Project Manager頁(yè)面

單擊進(jìn)入Project Manager頁(yè)面,在左邊Project分欄中修改工程名稱、工程目錄和工具鏈,然后在Code Generator中勾選“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后單擊頁(yè)面右上角GENERATE CODE生成工程,具體如下圖所示

詳細(xì)Project Manager配置內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”實(shí)驗(yàn)3.4.3小節(jié)

3.2.1、外設(shè)初始化調(diào)用流程

請(qǐng)閱讀“STM32CubeMX教程14 ADC - 多通道DMA轉(zhuǎn)換”實(shí)驗(yàn)“3.2.1、外設(shè)初始化調(diào)用流程”小節(jié)

3.2.2、外設(shè)中斷調(diào)用流程

請(qǐng)閱讀“STM32CubeMX教程14 ADC - 多通道DMA轉(zhuǎn)換”實(shí)驗(yàn)“3.2.2、外設(shè)中斷調(diào)用流程”小節(jié)

3.2.3、添加其他必要代碼

在adc.c中重新實(shí)現(xiàn)ADC轉(zhuǎn)換完成回調(diào)函數(shù)HAL_ADC_ConvCpltCallback(),具體代碼如下所示

源代碼如下

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    /*定時(shí)器中斷啟動(dòng)DMA二重ADC轉(zhuǎn)換*/
    uint32_t Volt1,Volt2;
    uint32_t adcValue=DataBuffer[0];	

    /*從低16位取出ADC1采集數(shù)據(jù)*/
    uint32_t ADC1_val=adcValue & 0x0000FFFF;	
    Volt1=3300*ADC1_val;	
    Volt1=Volt1>>12;		
    
    /*從高16位取出ADC2采集數(shù)據(jù)*/
    uint32_t ADC2_val=adcValue & 0xFFFF0000;
    ADC2_val= ADC2_val>>16;
    Volt2=3300*ADC2_val;
    Volt2=Volt2>>12;		
    
    printf("Volt1:%d, Volt2:%d\r\n",Volt1,Volt2);
}

在主函數(shù)main中啟動(dòng)二重ADC轉(zhuǎn)化,一些全局變量定義及啟動(dòng)源代碼如下

/*main.c全局變量定義*/
uint32_t DataBuffer[BATCH_DATA_LEN];

/*main.h變量聲明*/
#define BATCH_DATA_LEN 1
extern uint32_t DataBuffer[BATCH_DATA_LEN];

/*ADC啟動(dòng)代碼*/
HAL_ADC_Start(&hadc2);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,DataBuffer,BATCH_DATA_LEN);
HAL_TIM_Base_Start(&htim3);

為什么二重ADC轉(zhuǎn)化下DMA要將數(shù)據(jù)傳輸?shù)絬int32 DataBuffer[1]?

二重ADC轉(zhuǎn)化下DMA模式為DMA access mode 2,在該模式下ADC1轉(zhuǎn)換完成的數(shù)據(jù)會(huì)傳輸?shù)?2位的 DataBuffer[0] 的低16位,而ADC2轉(zhuǎn)換完成的數(shù)據(jù)會(huì)傳輸?shù)?2位的 DataBuffer[0] 的高16位

4、常用函數(shù)

/*多重ADC以DMA方式啟動(dòng)*/
HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)

5、燒錄驗(yàn)證

燒錄程序,單片機(jī)上電之后,串口不斷的輸出ADC1_IN5、ADC2_IN6的采集值轉(zhuǎn)化為的電壓值,筆者將兩個(gè)滑動(dòng)變阻器按照ADC1_IN5、ADC2_IN6的順序,分別從一端緩慢擰到另一端,可以從串口輸出的數(shù)據(jù)看到,三個(gè)通道采集到的電壓值從最小值0慢慢變到最大3300

6、三重ADC轉(zhuǎn)換

6.1、CubeMX相關(guān)配置

在Pinout & Configuration頁(yè)面左邊功能分類欄目Analog中單擊其中ADC3,勾選IN5通道,所有參數(shù)與二重ADC轉(zhuǎn)換ADC2參數(shù)一致,在配置ADC1為三重ADC規(guī)則通道采集時(shí)ADC3的觸發(fā)源參數(shù)會(huì)消失,因此無(wú)需理會(huì),具體ADC3參數(shù)配置如下圖所示

在Pinout & Configuration頁(yè)面左邊功能分類欄目Analog中單擊其中ADC1,將其模式修改為Triple regular simultaneous mode only,DMA模式修改為DMA access mode 1

ADC1的其他參數(shù)與二重ADC轉(zhuǎn)換時(shí)的參數(shù)一致,ADC2的配置、ADC1 DMA的配置和NVIC的設(shè)置均與二重ADC采集一致,具體ADC1參數(shù)配置如下圖所示

6.2、添加其他必要代碼

/*main.c全局變量定義*/
uint32_t DataBuffer[BATCH_DATA_LEN];

/*main.h變量聲明*/
#define BATCH_DATA_LEN 3
extern uint32_t DataBuffer[BATCH_DATA_LEN];

/*主函數(shù)中ADC啟動(dòng)代碼*/
HAL_ADC_Start(&hadc2);
HAL_ADC_Start(&hadc3);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,DataBuffer,BATCH_DATA_LEN);
HAL_TIM_Base_Start(&htim3);

/*adc.c中重新實(shí)現(xiàn)轉(zhuǎn)換完成中斷回調(diào)*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    /*定時(shí)器中斷啟動(dòng)DMA三重ADC轉(zhuǎn)換*/
    uint32_t val=0,Volt=0;
    for(uint8_t i=0;i<BATCH_DATA_LEN;i++)
    {
        val=DataBuffer[i];
        Volt=(3300*val)>>12;
        printf("ADC%d, val:%d, Volt:%d\r\n",i,val,Volt);
    }
    printf("\r\n");
}

為什么三重ADC轉(zhuǎn)化下DMA要將數(shù)據(jù)傳輸?shù)絬int32 DataBuffer[3]?

二重ADC轉(zhuǎn)化下DMA模式為DMA access mode 1,在該模式下ADC1轉(zhuǎn)換完成的數(shù)據(jù)會(huì)傳輸?shù)?2位的 DataBuffer[0],ADC2轉(zhuǎn)換完成的數(shù)據(jù)會(huì)傳輸?shù)?2位的 DataBuffer[1],ADC3轉(zhuǎn)換完成的數(shù)據(jù)會(huì)傳輸?shù)?2位的 DataBuffer[2]

6.3、實(shí)驗(yàn)現(xiàn)象

燒錄程序,單片機(jī)上電之后,串口不斷的輸出ADC1_IN5、ADC2_IN6和ADC3_IN5的采集值,筆者將三個(gè)滑動(dòng)變阻器按照ADC1_IN5、ADC2_IN6和ADC3_IN5的順序,分別從一端緩慢擰到另一端,可以從串口輸出的數(shù)據(jù)看到,三個(gè)通道采集到的ADC數(shù)據(jù)從最小值0慢慢變到最大4095

7、注釋詳解

注釋1:圖片來(lái)源STM32F4xx中文參考手冊(cè)

8、參考資料

主要參考STM32Cube高效開(kāi)發(fā)教程(基礎(chǔ)篇)320頁(yè)14.6小節(jié)實(shí)驗(yàn)

筆者認(rèn)為該章節(jié)提到一個(gè)BUG其實(shí)是錯(cuò)誤的,從ADC不應(yīng)該以DMA方式啟動(dòng),也無(wú)需在STM32CubeMX生成的工程代碼中手動(dòng)修改DMAContinuousRequests為ENABLE

更多內(nèi)容請(qǐng)瀏覽 STM32CubeMX+STM32F4系列教程文章匯總貼

總結(jié)

以上是生活随笔為你收集整理的STM32CubeMX教程15 ADC - 多重ADC转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。