目錄
一、簡述
二、示例操作
(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
2、使能ADC1通道1的連續轉換模式
3、此時晶片處會自動使能引腳
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配置
初始化adc通道0和通道1
(1) 使能掃描轉換模式 (Scan Conversion Mode), 使能連續轉換模式 (Continuous Conversion Mode) 。 (2) : ADC 規則組選擇轉換通道數為 2(Number Of Conversion) 。 (3) : 配置 Rank 的輸入通道。
添加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輪詢方式一緻