天天看點

STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

目錄

一、簡述

二、示例操作

(one)DAC輪詢方式

1、選取ADC1的IN0​

 2、使能ADC1通道1的連續轉換模式

3、此時晶片處會自動使能引腳

4、實際代碼編寫

具體adc函數編寫

(TWO)DAC之DAM方式

1、cubx配置

初始化adc通道0和通道1

三.示例代碼

一、簡述

先介紹最簡單的片上 ADC ,通常是 12 位,精度則為 3.3/4096 v 。 讀取 ADC 的方式有很多: 1 、輪詢 2 、中斷 3 、 DMA 因為在實際開發中僅有輪詢和 DMA 存在使用場景,是以在這裡我僅介紹輪詢和 DMA 的方式

二、示例操作

(one)DAC輪詢方式

1、選取ADC1的IN0
STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

 2、使能ADC1通道1的連續轉換模式

STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

3、此時晶片處會自動使能引腳

STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

4、實際代碼編寫

使能printf函數。

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
           
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f){
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);//huart1??????????
return ch;
}
/* USER CODE END 0 */
           

具體adc函數編寫

/* USER CODE BEGIN 1 */
    uint16_t AD_Value;
  /* USER CODE END 1 */
           
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_ADC_Start(&hadc1);//啟動adc轉換
		HAL_ADC_PollForConversion(&hadc1, 50);//等待轉換完成,第二個參數表示逾時時間,機關ms
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//
			{
	    AD_Value = HAL_ADC_GetValue(&hadc1);//讀取ADC轉換資料,資料為12位
		printf("ADC_Value:%.1f mv",AD_Value*3300.0/4096);//輸出adc的值
			}
			 HAL_Delay(1000);//延遲一秒(不建議在實際應用中使用)
  }
  /* USER CODE END 3 */
           

要知道,adc轉換後的資料是一個12位的二進制數,我們需要把這個二進制數代表的模拟量(電壓)用數字表示出來。比如這次我們測量的電壓範圍是0~3.3V,轉換後的二進制數是x,因為12位ADC在轉換時将電壓的範圍大小(也就是3.3)分為4096(2^12)份,是以轉換後的二進制數x代表的真實電壓的計算方法就是:

y=3.3* x / 4096

(TWO)DAC之DAM方式

1、cubx配置

STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

初始化adc通道0和通道1

STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

(1) 使能掃描轉換模式 (Scan Conversion Mode), 使能連續轉換模式 (Continuous Conversion Mode) 。  (2) : ADC 規則組選擇轉換通道數為 2(Number Of Conversion) 。  (3) : 配置 Rank 的輸入通道。

STM32F407HAL庫學習之路(六):輕松玩轉adc一、簡述二、示例操作三.示例代碼

   添加DMA 設定,設定為連續傳輸模式,資料長度為字。

三.示例代碼

uint32_t ADC_Value[100];
	uint8_t i;
	uint32_t ad1,ad2;
           
/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
		for(i = 0,ad1 =0,ad2=0; i < 100;)
		{
		ad1 += ADC_Value[i++];
		ad2 += ADC_Value[i++];
		}
		ad1 /= 50;
		ad2 /= 50;
		printf("\r\n********ADC-DMA-Example********\r\n");
		printf("info:AD1_value=%1.3fV\r\n", ad1*3.3f/4096);
		printf("info:AD2_value=%1.3fV\r\n", ad2*3.3f/4096);
  }
  /* USER CODE END 3 */
           

 其餘代碼配置與DAC輪詢方式一緻