国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32 hal庫使用筆記(五)ADC—單通道/雙通道DMA傳輸

這篇具有很好參考價值的文章主要介紹了STM32 hal庫使用筆記(五)ADC—單通道/雙通道DMA傳輸。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

實現(xiàn)目的:利用ADC采集光敏傳感器/煙霧傳感器的值,并利用串口打印

實驗平臺:正點原子精英版

一、簡介

1.DMA的介紹

參考:STM32 hal庫使用筆記(四)DMA—內(nèi)存到內(nèi)存/內(nèi)存到外設(shè)_亂碼小伙的博客-CSDN博客

2.ADC簡介

? ? ?ADC(Analog-Digital Converter)模擬-數(shù)字轉(zhuǎn)換器 ADC可以將引腳上連續(xù)變化的模擬電壓轉(zhuǎn)換為內(nèi)存中存儲的數(shù)字變量,建立模擬電路到數(shù)字電路的橋梁;

? ? 12位逐次逼近型ADC,1us轉(zhuǎn)換時間;

? ? 輸入電壓范圍:0~3.3V,轉(zhuǎn)換結(jié)果范圍:0~4095;

? ? 18個輸入通道,可測量16個外部和2個內(nèi)部信號源;

? ? 規(guī)則組和注入組兩個轉(zhuǎn)換單元,可利用模擬看門狗自動監(jiān)測輸入電壓范圍。

3.一些概念

? ? ADC數(shù)據(jù)寄存器是32位,但是只用到16位,所以一般采用右對齊方式,方便計算。

? ? 如果多通道轉(zhuǎn)換ADC,次數(shù)頻繁,間隔時間短(循環(huán)模式),會導(dǎo)致數(shù)據(jù)寄存器的數(shù)值被覆蓋,所以要利用DMA轉(zhuǎn)運(yùn)。

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

? ? 注入組限制較多,一般采用規(guī)則組進(jìn)行轉(zhuǎn)換。

? ? TCONV = 采樣時間 + 12.5個ADC周期,采樣時間=n個ADC周期,ADC采用頻率最大是14MHZ,由于ADC掛載總線的頻率是72MHZ所以進(jìn)行6分頻,采用周期是12MHZ。

? ? ADC有一個內(nèi)置自校準(zhǔn)模式。校準(zhǔn)可大幅減小因內(nèi)部電容器組的變化而造成的準(zhǔn)精度誤差。校準(zhǔn)期間,在每個電容器上都會計算出一個誤差修正碼(數(shù)字值),這個碼用于消除在隨后的轉(zhuǎn)換中每個電容器上產(chǎn)生的誤差。HAL_ADCEx_Calibration_Start(),進(jìn)行校準(zhǔn)。

二、HAL庫配置

1.時鐘樹的設(shè)置

按照下圖配置即可:

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

?2.ADC的配置

關(guān)于串口的配置參考:STM32 hal庫使用筆記(二)中斷—串口中斷_亂碼小伙的博客-CSDN博客

? ? 本實驗不使用串口中斷,中斷部分的配置不用操作

2.1 單通道(代碼對應(yīng)3.1)

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

1)關(guān)閉掃描模式,由于只有一個通道;

2)關(guān)閉連續(xù)轉(zhuǎn)換模式,每次需要ADC轉(zhuǎn)換時打開ADC轉(zhuǎn)換即可;

3)采用規(guī)則組;

4)軟件觸發(fā)模式;

5)28.5個ADC周期,所以整個采采樣周期是30個ADC周期。

配置完成后生成代碼即可。

2.2 DMA雙通道(代碼對應(yīng)3.2)

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

1)開啟雙通道

2)掃描模式打開

3)轉(zhuǎn)換組設(shè)置為2

4)打開通道1

5)周期28.5個

6)打開通道2

7)周期28.5個

注意每個ADC的每個通道只能對應(yīng)一個GPIO。

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

ADC數(shù)據(jù)是16位的,所以采用半字字寬。

配置完成后,生成代碼即可。

三、代碼編寫

3.1?

以下代碼在adc.c中編寫

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  /** Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)//配置ADC時鐘,通道、序列 
  {
    Error_Handler();
  }
  HAL_ADCEx_Calibration_Start(&hadc1);//用戶添加,ADC校準(zhǔn),據(jù)了解最新版HAL庫已經(jīng)刪除 
}

用戶編碼區(qū):

uint32_t adc_get_result(void)
{
    HAL_ADC_Start(&hadc1);//單次轉(zhuǎn)換模式,每次轉(zhuǎn)換完成后ADC轉(zhuǎn)換會自動停止
    HAL_ADC_PollForConversion(&hadc1, 10);//ADC轉(zhuǎn)換,轉(zhuǎn)換參數(shù)ms
    return (uint16_t)HAL_ADC_GetValue(&hadc1);
}

以下在main.c

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
     
    /* USER CODE BEGIN 3 */
    HAL_Delay(2000);
      unsigned char arrary[4];
        arrary[0] = ((adc_get_result()/1000))+0x30;      
		arrary[1] = (((adc_get_result()%100)/10))+0x30;
		arrary[2] = ((adc_get_result()%10)/10)+0x30;
        arrary[3] = ((adc_get_result()%1)/10)+0x30;
    //unsigned char MyArray[1]={adc_get_result()};
      //HAL_UART_Transmit(&huart1, MyArray,1, 10000);
    HAL_UART_Transmit(&huart1, arrary,4,1000);
  }
  /* USER CODE END 3 */
}

實驗現(xiàn)象:用手蓋住和放開有明顯變化

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

3.2

添加接收數(shù)據(jù)數(shù)組:uint16_t g_adc_dma_buf[2];

以下代碼均在adc.c中編寫:

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  /** Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 2;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
   HAL_ADC_Start_DMA(&hadc1,(uint32_t *)(g_adc_dma_buf) ,0);//觸發(fā)ADC轉(zhuǎn)換,DMA傳輸數(shù)據(jù)
}

?HAL_ADC_Start_DMA(&hadc1,(uint32_t *)(g_adc_dma_buf) ,0);這個可以省略,因為DMA不是循環(huán)模式,ADC也不是連續(xù)模式,所以每次采集ADC都需要重新開啟。

用戶編碼區(qū):

void adc_dma_enable(uint32_t cndtr)
{
    
    __HAL_ADC_DISABLE(&hadc1);
    
    __HAL_DMA_DISABLE(&hdma_adc1);
    
    while (__HAL_DMA_GET_FLAG(&hdma_adc1, DMA_FLAG_TC1))
    {
    __HAL_DMA_CLEAR_FLAG(&hdma_adc1, DMA_FLAG_TC1);  //清除標(biāo)志位
    }//實測,刪去也能正常使用,因為測量間隔時間長,DMA肯定關(guān)閉了
    
    DMA1_Channel1->CNDTR = cndtr;

    __HAL_DMA_ENABLE(&hdma_adc1);
    
    __HAL_ADC_ENABLE(&hadc1);
    HAL_ADC_Start(&hadc1); //開啟ADC轉(zhuǎn)換,必須定時開啟,因為ADC不是連續(xù)掃描模式 
}

以下均在main.c

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
         HAL_Delay(2000);
       adc_dma_enable(2);//必須添加
      unsigned char arrary[4];
      unsigned char arrary2[4];
        arrary[0] = ((g_adc_dma_buf[0]/1000))+0x30;      
		arrary[1] = (((g_adc_dma_buf[0]%100)/10))+0x30;
		arrary[2] = ((g_adc_dma_buf[0]%10)/10)+0x30;
        arrary[3] = ((g_adc_dma_buf[0]%1)/10)+0x30;
      printf("ADC1:");
      HAL_UART_Transmit(&huart1, arrary,4,1000);
      printf("\r\n");
        arrary2[0] = ((g_adc_dma_buf[1]/1000))+0x30;      
		arrary2[1] = (((g_adc_dma_buf[1]%100)/10))+0x30;
		arrary2[2] = ((g_adc_dma_buf[1]%10)/10)+0x30;
        arrary2[3] = ((g_adc_dma_buf[1]%1)/10)+0x30;
      printf("ADC2:");
      HAL_UART_Transmit(&huart1, arrary2,4,1000);
      printf("\r\n");
  }
  /* USER CODE END 3 */
}

實驗現(xiàn)象:沒有打火機(jī),煙霧傳感器值一直為0,ADC通道1連接光敏,有明顯變化(連接到通道2上也有明顯變化)。實測成功。

hal stm32g0系列adc使用,STM32的hal庫使用,stm32,筆記,嵌入式硬件

?歡迎大家交流和指正?。。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-773197.html

到了這里,關(guān)于STM32 hal庫使用筆記(五)ADC—單通道/雙通道DMA傳輸?shù)奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM-32:ADC模數(shù)轉(zhuǎn)換器—ADC單通道轉(zhuǎn)換/ADC多通道轉(zhuǎn)換

    STM-32:ADC模數(shù)轉(zhuǎn)換器—ADC單通道轉(zhuǎn)換/ADC多通道轉(zhuǎn)換

    ADC(Analog-Digital Converter),意即模擬-數(shù)字轉(zhuǎn)換器,簡稱模數(shù)轉(zhuǎn)換器。ADC可以將引腳上連續(xù)變化的模擬電壓轉(zhuǎn)換為內(nèi)存中存儲的數(shù)字變量,建立模擬電路到數(shù)字電路的橋梁。與ADC相對應(yīng),從數(shù)字電路到模擬電路的橋梁即DAC(Digital-Analog Convertor),數(shù)模轉(zhuǎn)換器。 DAC不是唯一可以

    2024年02月09日
    瀏覽(23)
  • STM32CubeMX教程13 ADC - 單通道轉(zhuǎn)換

    開發(fā)板(正點原子stm32f407探索者開發(fā)板V2.4) STM32CubeMX軟件(Version 6.10.0) keil μVision5 IDE(MDK-Arm) ST-LINK/V2驅(qū)動 野火DAP仿真器 XCOM V2.6串口助手 1個滑動變阻器 使用STM32CubeMX軟件配置STM32F407開發(fā)板的 ADC實現(xiàn)單通道ADC采集 ,具體為使用ADC1_IN5通道通過軟件/定時器觸發(fā)采集滑動變阻

    2024年02月02日
    瀏覽(30)
  • 【正點原子STM32連載】第三十三章 單通道ADC采集實驗 摘自【正點原子】APM32E103最小系統(tǒng)板使用指南

    1)實驗平臺:正點原子APM32E103最小系統(tǒng)板 2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介紹使用APM32E103模數(shù)轉(zhuǎn)換器(ADC)進(jìn)行帶通道的電壓采集。通過本章的學(xué)習(xí),讀者將學(xué)習(xí)到單通

    2024年02月19日
    瀏覽(21)
  • HAL庫配置ADC_1_單通道配置

    HAL庫配置ADC_1_單通道配置

    ??在使用ADC外設(shè)前,先查看下芯片手冊,看下ADC的特點。 ??ADC的使用,一定是有參考電壓的,在使用時要注意,芯片手冊上關(guān)于ADC參考電壓的范圍。 通常正參考電壓VREF+連接到VCC,負(fù)參考電壓VREF-連接到GND ??通過框圖可以了解ADC的工作流程。 ??下面是ADC比較常用的參數(shù)說

    2024年02月04日
    瀏覽(28)
  • STM32自學(xué)?AD單通道

    STM32自學(xué)?AD單通道

    ? 程序的最終運(yùn)行成果: 當(dāng)轉(zhuǎn)動電位器時,數(shù)值和電壓值發(fā)生變化 #include \\\"stm32f10x.h\\\" #include \\\"stm32f10x_adc.h\\\" #include \\\"ad.h\\\" #include \\\"stdint.h\\\" void ad_Init(void) { ?/* ?初始化步驟: ?1.開啟GPIO時鐘和ADC時鐘,配置ADCCLK ?2.配置GPIO,模擬輸入模式 ?3.配置多路開關(guān) ?4.配置ADC轉(zhuǎn)換器 ?5.開啟

    2024年03月21日
    瀏覽(28)
  • STM32CubeMx實現(xiàn)ADC多通道+DMA讀?。℉AL庫)

    STM32CubeMx實現(xiàn)ADC多通道+DMA讀?。℉AL庫)

    目錄 一、實驗結(jié)果 ?二、STM32CubeMx配置 三、main.c測試代碼 1、RCC配置 (外部晶振選擇8MHz。設(shè)置相應(yīng)的分頻器M=8,倍頻器倍頻系數(shù)N=336,分頻器分頻系數(shù)P=2,那么主PLL生成的第一個輸出高速時鐘PLLP為:168MHz)? 2、SYS配置 ?3、ADC(規(guī)則)通道配置(獨(dú)立模式,預(yù)分頻4分頻,1

    2024年02月15日
    瀏覽(31)
  • STM32CubeMx配置ADC(多通道采集+DMA讀取數(shù)據(jù))(HAL庫開發(fā))

    STM32CubeMx配置ADC(多通道采集+DMA讀取數(shù)據(jù))(HAL庫開發(fā))

    目錄 1、函數(shù)配置過程(這是標(biāo)準(zhǔn)庫配置過程): 2、STM32CubeMx配置過程 ?3、main函數(shù)源文件 采集5路ADC數(shù)據(jù),并用串口printf()函數(shù)打印出來。 實驗現(xiàn)象:? ADC轉(zhuǎn)換的初始條件: 1、使能 2、觸發(fā)源條件完成(這個需要自己配置)利用:HAL_ADC_Start_DMA()函數(shù); ADC中HAL開發(fā)優(yōu)勢就是,

    2023年04月08日
    瀏覽(27)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL庫開發(fā))

    STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL庫開發(fā))

    ?時鐘配置HSI主頻配置64M ?勾選打開8個通道的ADC ?使能連續(xù)轉(zhuǎn)換模式 ?添加DMA ?DMA模式選擇循環(huán)模式 ?使能DMA連續(xù)請求 采樣時間配置160.5 轉(zhuǎn)換次數(shù)為8 ?配置好8次轉(zhuǎn)換的順序 ?配置好串口,選擇異步模式 配置好需要的開發(fā)環(huán)境并獲取代碼 ?修改main.c 串口重定向 ?串口重定向

    2024年02月08日
    瀏覽(41)
  • 實驗(六):ADC應(yīng)用:獨(dú)立模式單通道采集實驗

    實驗(六):ADC應(yīng)用:獨(dú)立模式單通道采集實驗

    實驗?zāi)康模?1. 學(xué)習(xí)對ADC基礎(chǔ)功能的使用; 2. 掌握KEIL5的仿真與調(diào)試。 任務(wù): 1.?? 根據(jù)要求編寫程序,并寫出原理性注釋; 2. 將檢查程序運(yùn)行的結(jié)果,分析一下是否正確; 3. 完成所建工程的驗證調(diào)試。 貼片滑動變阻器的動觸點通過連接至STM32 芯片的ADC 通道引腳。當(dāng)我們使

    2024年02月15日
    瀏覽(23)
  • STM32基于hal庫的adc以DMA的多通道采樣以及所遇問題解決

    STM32基于hal庫的adc以DMA的多通道采樣以及所遇問題解決

    目錄 準(zhǔn)備 配置 步驟 ?總結(jié) ? 正點原子的STM32F103ZET6開發(fā)板(精英版) CUBEMX配置軟件 KEIL5 ?右對齊就是正常的數(shù)據(jù)格式。左對齊除以16后得正常數(shù)據(jù)。(當(dāng)輸出非常大時考慮是否改了對齊方式,默認(rèn)都是右對齊) ?掃描模式,連續(xù)轉(zhuǎn)換模式使能。(多通道下掃描模式自動使能

    2024年02月04日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包