前言
本章介紹使用STM32CubeMX對ADC進(jìn)行配置的方法,ADC的原理、概念和特點,配置各個步驟的功能,并通過單通道,多通道,DMA三種方式實現(xiàn)采集。
一、什么是ADC?
ADC 即模擬數(shù)字轉(zhuǎn)換器,英文詳稱 Analog-to-digital converter,可以將外部的模擬信號轉(zhuǎn)換為數(shù)字信號。
以下是datasheet當(dāng)中的內(nèi)容,我就做個搬運(yùn)工,簡單翻一下,大家可以配合datasheet學(xué)習(xí),這樣理解會更加深刻。 STM32 的 ADC 是 12 位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器,它有 18 個通道,可測量 16 個外部和 2 個內(nèi)部信號源,其中 ADC3 根據(jù) CPU 引腳的不同其通道數(shù)也不同,一般有 8 個外部通道。 ADC 中的各個通道的 A/D 轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。 ADC 的結(jié)果可以以左對齊或者右對齊存儲在 16 位數(shù)據(jù)寄存器中。
STM32F103 的 ADC 主要特性如下:
1、 12 位分辨率;
2、轉(zhuǎn)換結(jié)束、注入轉(zhuǎn)換結(jié)束和發(fā)生模擬看門狗事件時產(chǎn)生中斷
3、單次和連續(xù)轉(zhuǎn)換模式
4、自校準(zhǔn)
5、帶內(nèi)嵌數(shù)據(jù)一致性的數(shù)據(jù)對齊
6、采樣間隔可以按通道分別編程
7、規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換均有外部觸發(fā)選項
8、間斷模式
9、雙重模式(帶 2 個或以上 ADC 的器件)
10、 ADC 轉(zhuǎn)換時間:時鐘為 72MHz 為 1.17us
11、 ADC 供電要求: 2.4V 到 3.6V
12、 ADC 輸入范圍: VREF–≤VIN≤VREF+
13、規(guī)則通道轉(zhuǎn)換期間有 DMA 請求產(chǎn)生
我們按照 ADC 的配置流程標(biāo)記了七處位置,分別如下,理解不同的步驟請參考圖和下列的介紹進(jìn)行。
① ADC模塊的輸入電壓
② 輸入通道:電壓輸入后,外部輸入的電壓會通過通道輸入到 ADC 轉(zhuǎn)換器中,下面各個是ADC通道的列表
③ 轉(zhuǎn)換順序:ADC 多個通道以任意順序輸入,則需要進(jìn)行順序轉(zhuǎn)換,轉(zhuǎn)換的方式有兩種,一種是規(guī)則組:即按照順序進(jìn)行,另一種是注入組:即打破原有順序,有點類似中斷的形式進(jìn)行順序轉(zhuǎn)換、
④ 轉(zhuǎn)換觸發(fā)源:從圖中可以看到,順序轉(zhuǎn)換是需要觸發(fā)源的,這里就是對觸發(fā)源的配置
⑤ 轉(zhuǎn)換時間:即輸入電壓通過ADC的時間 計算公式:T = 采樣時間 + 12.5 個周期
⑥數(shù)據(jù)寄存器:ADC 轉(zhuǎn)換完成后的數(shù)據(jù)輸出寄存器
⑦ 中斷:ADC 中斷可分為三種:規(guī)則組轉(zhuǎn)換結(jié)束中斷、注入組轉(zhuǎn)換結(jié)束中斷、設(shè)置了模擬看門狗狀態(tài)位中斷
⑧ 單次轉(zhuǎn)換模式和連續(xù)轉(zhuǎn)換模式
⑨ 掃描模式
二、實驗過程
1.單通道ADC采集
STM32CubeMX配置
選擇芯片stm32f103c6t6,新建工程
設(shè)置時鐘源,最小系統(tǒng)外部晶振8Mhz,作為外部高速HSE時鐘源。由于沒有外接外部低速晶振,這里低速時鐘源選擇旁路時鐘源。
配置時鐘樹,這里使用官方推薦的配置
為了展示內(nèi)部溫度的變化,我們配置USART1,打印獲取溫度的結(jié)果
USART1的參數(shù)配置如下,波特率115200,傳輸數(shù)據(jù)長度為8 Bit,奇偶檢驗無,停止位1.其他參數(shù)默認(rèn)
使用ADC 通道0,參數(shù)中設(shè)置采樣時間
Code Generator中設(shè)置只拷貝使用到的庫,分離.c和.h文件
設(shè)置好項目名稱和路徑,點擊GENERATE CODE即可,生成后使用keil5 IDE打開。
代碼實現(xiàn)
在usart.c文件后面添加如下代碼,代碼中添加了#ifdef宏定義進(jìn)行條件編譯,如果使用GUNC編譯,則PUTCHAR_PROTOTYPE 定義為int __io_putchar(int ch)函數(shù),否則定義為int fputc(int ch, FILE *f)函數(shù)。
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
main函數(shù)如下:
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 */
uint32_t ADC_Value;
/* 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 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Value = HAL_ADC_GetValue(&hadc1);
}
printf(" ADC channel0 value = %1.3fV \r\n", ADC_Value*3.3f/4096);
}
}
/* USER CODE END 3 */
}
2.多通道ADC采樣(非DMA)
STM32CubeMX配置
為了避免冗余,這里省略掉CubeMX新建工程,配置時鐘等步驟,直接展示ADC的配置
代碼實現(xiàn)
為了避免冗余,這里省略掉printf重載,直接展示main函數(shù)如下:文章來源:http://www.zghlxwxcb.cn/news/detail-411975.html
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t ADC_Value[2];
uint8_t i;
/* 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 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(500);
for(i=0;i<2;i++)
{
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Value[i] = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop (&hadc1);//打開ADC
printf(" ADC channel0 value = %1.3fV \r\n", ADC_Value[0]*3.3f/4096);
printf(" ADC channel1 value = %1.3fV \r\n", ADC_Value[1]*3.3f/4096);
}
/* USER CODE END 3 */
}
3.多通道ADC采樣(DMA)
STM32CubeMX配置
為了避免冗余,這里省略掉CubeMX新建工程,配置時鐘等步驟,直接展示DMA和ADC的配置
DMA配置如下,主要配置了通道,模式,字寬等信息
ADC配置如下
代碼實現(xiàn)
為了避免冗余,這里省略掉printf重載,直接展示main函數(shù)如下:
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 */
uint32_t ADC_Value[100];
uint8_t i;
uint32_t ad1,ad2;
/* 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 */
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 50);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(500);
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\r\n");//串口打印
printf(" AD1 value = %1.3fV \r\n", ad1*3.3f/4096);
printf(" AD2 value = %1.3fV \r\n", ad2*3.3f/4096);
}
總結(jié)
本章介紹使用STM32CubeMX對ADC進(jìn)行配置的方法,ADC的原理、概念和特點,配置各個步驟的功能,并通過單通道,多通道,DMA三種方式實現(xiàn)采集,對于配置的細(xì)節(jié),可以參照ADC實現(xiàn)原理圖,一點點梳理,這樣易于理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-411975.html
到了這里,關(guān)于STM32開發(fā)(14)----CubeMX配置ADC的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!