STM32CubMX自學筆記(九)—ADC+DMA數模轉換實驗
ADC初始化結構體講解,
庫函式介紹
1、配置解析度,轉換模擬量的時間大小,配置的是控制暫存器1位,
2、掃描模式針對多通道,單通道的時候disable,多通道的時候enable,
3、連續轉換還是單次轉換,采集完成一個點就不采集了,采集完一個點繼續采集,那么就配置成連續轉換,
4、外部觸發,高低電平,上升沿、下降沿、或者二者皆可,一般用軟體自動觸發,
5、規則資料暫存器,資料是怎么放的?左對齊還是右對齊,
6、ADC轉換的通道,規則通道配置的規則序列暫存器,16個配置,注入序列暫存器,最多有四個通道,
ADC_CommonInitTypeDef初始化結構體
1、只需要配置一次,模式選擇,雙重模式或者三重模式,
2、分頻,看APB2的總線的時鐘然后配置,最大為84M ,最大是32M,不能是2分頻,最好是4分頻,針對F407,
3、DMA 雙重或者多重的時候才需要配置,
常用的庫函式
緊接著配置規則通道的轉換順序,
1、使用哪一個ADC,
2、使用哪一個通道,
3、通道的轉換順序,
4、配置采樣時間,
緊接著是 使能ADC、軟體觸發轉換,
單重ADC 的DMA傳輸, ADC DMA的請求,ADC_DMACmd,
獨立模式單通道采集
模數轉換之后,將資料放在ADC_DR暫存器,產生一個中斷,在中斷中將采集到的資料放到sram中,在中斷中將SRAM中的資料讀取走,
例程講解:
1、開啟時鐘,使能GPIO
2、初始化ADC的結構體,
(1)ADC_Common結構體初始化
1、獨立模式
2、分頻因子選擇二分頻,最高還是36M,所以還是36M,即使是APB2是84M
3、兩個ADC采樣的延時時間,是雙重或者三重的時候才配置,
(2)ADC_Init結構體初始化
1、配置為12位ADC
2、失能掃描模式
3、軟體觸發
4、資料右對齊
5、轉換通道1個
(3)配置通道的轉換順序(具體ADC,具體通道,通道數目,采樣周期56),ADC中斷配置,失能ADC轉換,
(4)配置中斷,1是中斷號,2是中斷服務函式,判斷是否是結束轉換中斷,回傳值賦值給一個外部變數,然后清除中斷標志位,全域變數是從ADC_DR暫存器中采集的,再定義一個區域變數,把數字量轉換成模擬量,
獨立模式-多通道采集-使用DMA:
1、ADC_DR暫存器的低十六位,
2、使用DMA請求不需要產生中斷,產生DMA資料,直接傳輸到變數里面,
編程要點:
1、初始化ADC的多個GPIO
2、配置ADC初始化結構體、DMA初始化結構體
3、配置通道的轉換順序、使能DMA請求、使能DMA、打開ADC、觸發ADC開始轉換,
4、撰寫main函式,
庫函式DMA控制器配置
ADC使用的是DMA2的控制器的流0 通道0,
注意:配置ADCGPIO的時候配置成AIN,模擬輸入,
ADC的兩個結構體的初始化
章節—雙重-多通道-規則同步
1、初始化ADC的GPIO多通道
2、配置ADC初始化結構體
3、配置通道的轉換順序,配置DMA(是否三個ADC的DMA都要配置?)、觸發ADC的轉換(主ADC觸發即可)
雙重ADC是資料傳輸的時候是把資料放到中轉的ADDR暫存器里面,再把里面的數值放到變數里面,
CubMx工程配置
基本配置
1、時鐘配置
2、這里選擇的時鐘源是HSI高速內部時鐘,配置為168MHz,經過分頻之后得到APB2時鐘為42MHz,
ADC的具體引數,

1、首先配置配置設定成獨立模式,
2、ADC的配置成4分頻,因為ADC的最高頻率為36MHz,ADC最穩定的作業頻率是30MHz,而APB2總線上的時鐘頻率最高為84Mhz,因此配置為4分頻最后的結果是21MHz符合要求,
3、 轉換周期 = 采樣周期+存盤時間 = 3 + 12 = 15周期 = 1/21M*15 = 0.47us>0.41us
采樣時間:最少為3個周期
4、對齊模式選擇為右對齊,
5、掃描轉換模式不使能(多通道采集ADC時,才需要使能)
6、開啟連續轉換
7、非連續轉換不使能
8、DMA請求不使能
9、結束中斷標志設定為每完成一次中斷就發出一個標志位
10、規則通道數目1個
11、規則通道由軟體觸發
12、轉換完成標志 不使能
13、等級為1
14、注入轉換模式的個數為 0 個
15、不使能看門狗,
至此,可以完成最簡單的ADC采樣配置,
ADC的具體引數,
代碼
開啟ADC接收完成中斷:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
/*獲取結果*/
ADC_ConvertValue = HAL_ADC_GetValue(&hadc1);
}
在adc.c的c檔案中開啟ADC的中斷
HAL_ADC_Start_IT(&hadc1);
在主函式中撰寫如下代碼:
float ADC_Vol;
在main函式中撰寫如下代碼:
uint8_t buff[128] = {0};
ADC_Vol =(float) ADC_ConvertValue/4096*(float)3.3; // 讀取轉換的AD值
printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertValue);
printf("\r\n The current AD value = %f V \r\n",ADC_Vol);
HAL_Delay(500);
實驗現象:

接上串口除錯助手之后,PB0接上3.3V電壓可以看到列印如下資訊,
注意:一開始列印亂碼是因為外部時鐘沒有配置好,后來修改成HSI即可正常完成列印,
獨立模式–多通道DMA模式:
采集多路ADC的輸入
配置DMA模式,
配置ADC1的通道4、5、6、7,

下面來看具體引數配置:

多通道DMA采樣的配置的不同點:
1、使能掃描轉換模式
2、開啟DMA請求
3、開啟規則轉換通道數為4
4、配置規則轉換的順序,
緊接著配置DMA:

開啟ADC1,配置為回圈模式,一個位元組32位,字寬配置為半字16位,
代碼:
首先定義一個陣列,存放DMA存盤的資料,
uint16_t ADC_ConvertedValue[4];
其次使能ADC并且開啟ADC的DMA功能:
__HAL_ADC_ENABLE(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_ConvertedValue,4);
最后列印出不同通道的ADC數值:
printf("PA4 = %fV\r\n",(float)(ADC_ConvertedValue[0]/4096.0*(float)3.3));
printf("PA5 = %fV\r\n",(float)(ADC_ConvertedValue[1]/4096.0*(float)3.3));
printf("PA6 = %fV\r\n",(float)(ADC_ConvertedValue[2]/4096.0*(float)3.3));
printf("PA7 = %fV\r\n",(float)(ADC_ConvertedValue[3]/4096.0*(float)3.3));
printf("\r\n");
HAL_Delay(1000);
實驗效果如圖:

PA4接著的是0V 其他引腳接著的是3.3V
多重ADC交替采集
三重模式-單通道-交替采集
目的: 提高采樣率
1、初始化ADC的GPIO
2、配置ADC初始化結構體(三個ADC)
3、配置通道轉換順序、配置DMA(是否三個ADC都需要配置)、觸發ADC開始轉換
DMA配置主通道的流控制器
一個ADC的采樣速率最快是2.4MHz,而三個ADC同時采樣可以達到7.2MHz,使用3個ADC采集同一個通道,配置PC2,
實驗工程配置:
ADC1配置:
ADC2配置:

ADC3配置:
DMA配置細節,

實驗代碼
在main.c添加如下代碼
uint16_t ADC_ConverBuff[3000];
緊接著開啟ADC三個通道,分別是3、2、1,順序不可顛倒
HAL_ADC_Start(&hadc3);
HAL_ADC_Start(&hadc2);
HAL_ADC_Start(&hadc1);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)ADC_ConverBuff,3000);
主回圈中添加如下代碼:
//ADC1
printf("ADC1_L : %f V\r\n",(float)(uint16_t)ADC_ConverBuff[0]*(3.3/4096));
//ADC2
printf("ADC2_H : %f V\r\n",(float)(ADC_ConverBuff[0]>>16)*(3.3/4096));
//ADC3
printf("ADC3_L : %f V\r\n",(float)(uint16_t)ADC_ConverBuff[1]*(3.3/4096));
//ADC1
printf("ADC1_L : %f V\r\n",(float)(ADC_ConverBuff[1]>>16)*(3.3/4096));
//ADC2
printf("ADC2_H : %f V\r\n",(float)(uint16_t)ADC_ConverBuff[2]*(3.3/4096));
//ADC3
printf("ADC3_L : %f V\r\n",(float)(ADC_ConverBuff[2]>>16)*(3.3/4096));
printf("\r\n");
HAL_Delay(1000);
結語
ADC實驗總共分為兩大部分,首先介紹了庫函式實作ADC采樣,緊接著,又通過HAL庫的CUBmx配置實作ADC采樣,分為單通道獨立模式、單通道DMA模式、多通道DMA模式、多重采樣,根據不同的應用場景,采取不同的采樣策略,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354760.html
標籤:其他
