色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ADC,DMA,多路,單次/連續轉換 (標準外設庫)

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-03-04 11:26 ? 次閱讀

今天回答一個朋友的問題吧,ADC如何使用DMA采集多通道模擬電壓。

1寫在前面

這個問題其實之前寫過一些相關文章,原理我之前也有相關描述。如果想要徹底弄明白其原理,建議閱讀《參考手冊》、結合標準外設庫來理解。

現在很多人習慣使用STM32CubeMX來直接生成初始化代碼,如果沒有掌握STM32CubeMX、HAL庫,使用STM32CubeMX生成的代碼,或許就不能滿足你的應用。

同時,STM32CubeMX生成的代碼,想要根據代碼進一步了解其原理,其實很難

ADC轉換一些基礎原理,我這里就不過多描述了,請直接看下面標準外設庫源碼、及后面給的注釋。

下面寫2點:ADC軟件單次觸發轉換,和連續轉換。

2

ADC,DMA,單次觸發轉換

這里以ADC,使用DMA,通過軟件單次觸發轉換為例。主要需注意幾個相關參數即可。

1.GPIO配置

2.DMA配置

3.ADC配置

4.ADC單次觸發轉換

5.源代碼

/* 靜態變量 ------------------------------------------------------------------*/static volatile uint16_t sADC_Buf[3];/************************************************函數名稱 : ADC_GPIO_Configuration功 能 : ADC引腳配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; /* 使能時鐘 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure);}/************************************************函數名稱 : ADC_DMA_Configuration功 能 : ADC DMA配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure; /* 使能時鐘 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); /* 配置DMA */ DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));//外設地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&sADC_Buf[0]); //內存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //傳輸方向:外設 -> 內存 DMA_InitStructure.DMA_BufferSize = 3; //傳輸長度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設遞增:關閉 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存遞增:打開 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//數據寬度 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //正常模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //優先級 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure);}/************************************************函數名稱 : ADC_Configuration功 能 : ADC參數配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Configuration(void){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; /* 使能時鐘 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC配置 */ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; //瀏覽模式(多通道) ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //連續轉化模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數據右對齊 ADC_InitStructure.ADC_NbrOfConversion = 3; //轉換通道數 ADC_Init(ADC1, &ADC_InitStructure); /* 通道配置 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_3Cycles); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); //使能ADC的DMA功能 ADC_Cmd(ADC1, ENABLE); //使能ADC}/************************************************函數名稱 : ADC_Initializes功 能 : ADC初始化參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Initializes(void){ ADC_GPIO_Configuration(); ADC_DMA_Configuration(); ADC_Configuration();}/************************************************函數名稱 : ADC_Get功 能 : 轉換參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Get(void){ DMA_Cmd(DMA2_Stream0, DISABLE); //關閉DMA //內存地址 DMA_MemoryTargetConfig(DMA2_Stream0, (uint32_t)sADC_Buf, DMA_Memory_0); DMA_ClearFlag(DMA2_Stream0, DMA_FLAG_TCIF0); //清除標志位 DMA_Cmd(DMA2_Stream0, ENABLE); //使能DMA ADC_SoftwareStartConv(ADC1); //啟動轉換 while(RESET == DMA_GetFlagStatus(DMA2_Stream0, DMA_FLAG_TCIF0)); //等待轉換完成 //得到3條通道轉換結果:sADC_Buf //進行相關換算,處理...}

提示:以上源代碼只為方便學習和理解,請結合實際應用修改、或增減代碼。

3

ADC,DMA,連續轉換

我這里寫的連續,是ADC連續轉換,同時,DMA循環存儲。大部分配置和上面差不多,這種方式也用的比較多,寫給大家。

1.DMA配置

2.ADC配置

3.源代碼

/* 靜態變量 ------------------------------------------------------------------*/static volatile uint16_t sADC_Buf[3];/************************************************函數名稱 : ADC_GPIO_Configuration功 能 : ADC引腳配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; /* 使能時鐘 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure);}/************************************************函數名稱 : ADC_DMA_Configuration功 能 : ADC DMA配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure; /* 使能時鐘 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); /* 配置DMA */ DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));//外設地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&sADC_Buf[0]); //內存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //傳輸方向:外設 -> 內存 DMA_InitStructure.DMA_BufferSize = 3; //傳輸長度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設遞增:關閉 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存遞增:打開 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//數據寬度 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循環模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //優先級 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure);}/************************************************函數名稱 : ADC_Configuration功 能 : ADC參數配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Configuration(void){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; /* 使能時鐘 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC配置 */ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; //瀏覽模式(多通道) ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //連續轉化模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數據右對齊 ADC_InitStructure.ADC_NbrOfConversion = 3; //轉換通道數 ADC_Init(ADC1, &ADC_InitStructure); /* 通道配置 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_3Cycles); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); //使能ADC的DMA功能 ADC_Cmd(ADC1, ENABLE); //使能ADC ADC_SoftwareStartConv(ADC1); //啟動轉換}/************************************************函數名稱 : ADC_Initializes功 能 : ADC初始化參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Initializes(void){ ADC_GPIO_Configuration(); ADC_DMA_Configuration(); ADC_Configuration();}/************************************************函數名稱 : ADC_Get功 能 : 轉換參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Get(void){ //得到3條通道轉換結果:sADC_Buf //進行相關換算,處理...}

這種方式比較簡單,直接去讀取轉換結果就行。實際應用需要濾波,求平均之類的操作。

提示:以上源代碼只為方便學習和理解,請結合實際應用修改、或增減代碼。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • adc
    adc
    +關注

    關注

    99

    文章

    6533

    瀏覽量

    545453
  • 模擬電壓
    +關注

    關注

    6

    文章

    64

    瀏覽量

    18336
  • GPIO
    +關注

    關注

    16

    文章

    1216

    瀏覽量

    52282
  • stm32cubemx
    +關注

    關注

    5

    文章

    284

    瀏覽量

    14914
收藏 人收藏

    評論

    相關推薦

    ADC器件連續轉換轉換的區別是什么?

    轉換指的是, ADC根據信號請求對輸入信號進行一切換,將轉換值存儲到內部
    發表于 11-28 06:23

    運用MSPM0的DMA和Event功能實現ADC多路周期性采樣

    電子發燒友網站提供《運用MSPM0的DMA和Event功能實現ADC多路周期性采樣.pdf》資料免費下載
    發表于 09-06 15:01 ?0次下載
    運用MSPM0的<b class='flag-5'>DMA</b>和Event功能實現<b class='flag-5'>ADC</b><b class='flag-5'>多路</b>周期性采樣

    STM32F10x標準外設參考手冊

    STM32F10x標準外設參考手冊
    發表于 06-24 09:26 ?12次下載

    ESP32 ADC DMA連續采樣模式無法保證采樣率怎么處理?

    系統負載很高,需要ADC 固定頻率 DMA模式連續采集 2個通道的 電壓, (200HZ 以上) 用采集無法保證采樣頻率,也很占帶寬。
    發表于 06-21 07:02

    關于定時器觸發ADC連續采樣dma傳輸的疑問求解?

    adcdma_read(連續);timer_group例程都看明白了,最近準備把他們結合一下,
    發表于 06-14 07:25

    stm8s關于AD連續轉換轉換的寄存器問題求解

    stm8s 寄存器ADC_CR1 的CONT位控制 連續轉換/轉換
    發表于 05-11 07:09

    STM32F302 TIM15觸發ADC規則掃描DMA連續傳輸ADC數據失敗的原因?

    在測試STM32F302RB的ADC功能的時候遇到了問題:用TIM15 更新事件作為 TRGO源 觸發ADC2轉換DMA2_Channel_1
    發表于 05-06 06:20

    STM8L151 ADC采用DMA多通道連續采集遇到通道數據滾動怎么解決?

    數據同時偏移。網上搜了一下,有很多人遇到過,但是都不說解決方法。折騰了一天無解,只能在這里求救了。ADC初始化程序如下: void ADC_DMA_Config(void)//ADC初始化,A
    發表于 04-30 08:22

    stm32f303采用LL,4個ADC連續多通道掃描,應該如何設置DMA

    stm32f303,采用LL,4個ADC連續多通道掃描,應該如何設置DMAADC轉換
    發表于 04-30 07:06

    求助,關于STM8L051Halt低功耗與DMA問題求解

    如題,最近在做一個項目,主要需要實現的是多路ADC采集電壓,通過DMA讀取到RAM。不加低功耗模式(halt)的時候是正常的,但是一旦加上Halt模式之后,ADC
    發表于 04-26 06:33

    STM32 ADC+DMA多通道轉換數據錯位的原因?怎么解決?

    ]?,即為ADC采樣的值。 2、?HAL配置:? ?掃描模式使能,連續轉換模式使能,DMA連續
    發表于 04-10 07:24

    stm32F103中ADC多通道轉換使用DMA,串口調試助手沒有數據傳輸的原因?

    (ADC_GetCalibrationStatus(ADC1) == SET);//獲取指定ADC的校準狀態 //使能指定的ADC1的軟件轉換
    發表于 04-08 07:17

    STM32F1用AD采樣和AD+DMA連續采樣的結果有偏差是怎么回事?

    請教大家一個問題, 硬件是一樣的,采樣電阻接地。 負載不工作:AD采樣時,可以采樣到0x 00;AD+DMA連續采樣,采樣到 0x 0F到0x 12抬高了采樣值,負載開啟時:AD
    發表于 03-29 06:17

    STM32F205利用DMA實現多通道ADC采樣,但是每啟動一轉換才能更新一結果是為什么?

    1、ADC配置采樣12個規則通道,采用、掃描模式,允許DMA,配置每次轉換結束都有DMA r
    發表于 03-27 06:37

    STM32 ADC+DMA多路采集,使用DMA時,是不是要額外加上4倍的DMA傳輸時間?

    4通道采集時,按1-2-3-4-1順序轉換,一路通道的轉換時間是(采樣時間+12.5)周期,還是4 *(采樣時間+12.5)周期?使用DMA時,是不是要額外加上4倍的
    發表于 03-26 07:44
    主站蜘蛛池模板: 青青久久久 | 久久精品视频在线看15 | 岛国精品在线观看 | 久久青青草原综合伊人 | 日韩亚洲欧洲在线rrrr片 | 国产性夜夜性夜夜爽91 | 芒果视频看片在线观看 | 蜜桃TV成人网站免费打开 | 欧美另类与牲交ZOZOZO | 97人人添人人澡人人澡人人澡 | 99香蕉精品视频在线观看 | 欧美男男网站免费观看videos | 久久久国产精品免费A片3D | 日本一二三区在线视频 | 97视频在线观看视频最新 | 花蝴蝶高清影视视频在线播放 | 免费无码国产欧美久久18 | 中文无码熟妇人妻AV在线 | 亚洲一区免费观看 | 乌克兰粉嫩摘花第一次 | 狠狠久久免费视频在线 | 久久婷五月综合色啪首页 | 51久久夜色精品国产 | 国产AV99激情久久无码天堂 | 被强J高H纯肉公交车啊 | 女人久久WWW免费人成看片 | 欧美精品一区二区三区视频 | 国产免费人成在线视频视频 | 欧美精品成人久久网站 | 欧洲精品不卡1卡2卡三卡四卡 | 俄罗斯videosbest8| 老板揉搓秘书丰满大乳 | 亚洲 欧美 制服 校园 动漫 | 欧美成人亚洲高清在线观看 | 国产一区精选播放022 | 久久天天婷婷五月俺也去 | 国产精品96久久久久久AV不卡 | 朝鲜女人性猛交 | 九九九九九热 | 三级黄在线 | 人人干人人爽 |