實現目標
1、學會STM32CubeMX軟件關于ADC的配置
2、掌握ADC三種模式(查詢、中斷、DMA)編程
3、具體目標:1、將開發(fā)板單片機采集到的電壓值上傳至上位機串口調試助手顯示。
一、ADC? 概述
1、什么是ADC?
ADC(Analog to Digital Converter)即模數轉換器,用來將模擬信號轉換為數字信號。
A/D轉換過程
分辨率:?A/D轉換器對輸入模擬量微小變化的分辨能力,通常用二進制數的有效位表示。
在最大輸入電壓一定時,位數越多,量化單位越小,誤差越小,分辨率越高。
2、STM32F103 的ADC
(1)簡介
????????STM32F103 系列最多有3個ADC控制器(ADC1,ADC2,ADC3),多達18個通道,可測量16個外部和2個內部信號源。各通道的A/D轉換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結果可以左對齊或右對齊方式存儲在16位數據寄存器中。ADC為12位,是一種逐次逼近型模擬數字轉換器。
(2)ADC通道與引腳對應關系
(3)STM32分為兩種組轉換模式
規(guī)則通道:
????????規(guī)則通道相當于你正常運行的程序,看它的名字就可以知道,很規(guī)矩,就是正常執(zhí)行程序
注入通道:
????????注入通道可以打斷規(guī)則通道,聽它的名字就知道不安分,如果在規(guī)則通道轉換過程中,有注入通道進行轉換,那么就要先轉換完注入通道,等注入通道轉換完成后,再回到規(guī)則通道的轉換流程。
(4)ADC配置說明
配置選項說明:
模式設置
1、ADCs_Common_Settings??DC模式設置
?ADC_Mode_Independent? ? ??獨立模式
????????獨立模式模式下,雙ADC不能同步,每個ADC接口獨立工作。所以如果不需要ADC同步或者只是用了一個ADC的時候,應該設成獨立模式,多個ADC同時使用時會有其他模式,如雙重ADC同步模式,兩個ADC同時采集一個或多個通道,可以提高采樣率
ADC常規(guī)設置
1、Data Alignment?(數據對齊方式): 右對齊/左對齊
2、Scan Conversion Mode( 掃描模式 )?:
如果只是用了一個通道的話,DISABLE,果使用了多個通道的話,會自動設置為ENABLE。
3、Continuous Conversion Mode(連續(xù)轉換模式)?:
????????設置為ENABLE,即連續(xù)轉換。如果設置為DISABLE,則是單次轉換。兩者的區(qū)別在于連續(xù)轉換直到所有的數據轉換完成后才停止轉換,而單次轉換則只轉換一次數據就停止,要再次觸發(fā)轉換才可以進行轉換。
4、Discontinuous Conversion Mode(間斷模式)?
這里只用到了1個ADC,所以這個直接不使能即可。
規(guī)則通道設置
1、Enable Regular Conversions (啟用常規(guī)轉換模式)??? ENABLE
使能 否則無發(fā)進行下方配置
2、Number OF Conversion(轉換通道數)??? 1
用到幾個通道就設置為幾,多個通道會自動使能掃描模式
3、Extenal Trigger Conversion Source (外部觸發(fā)轉換源)
默認采用:Regular Conversion launched by software?規(guī)則的軟件觸發(fā)?調用函數觸發(fā)即可
Rank?轉換順序
1、多個通道時會有多個Rank,可以設定每個通道的轉換順序。
2、ADC總轉換時間如下計算:
TCONV = 采樣時間+ 12.5個周期? ?其中1周期為1/ADCCLK
????????為了保證ADC轉換結果的準確性,ADC的時鐘最好不超過14M。當ADCCLK=14MHz(最大),采樣時間為1.5周期(最快)時,TCONV =1.5+12.5=14周期=1μs。STM32的ADC最大的轉換速率為1MHz,也就是說最快轉換時間為1us,
注入通道設置
1、注入通道的設置,和規(guī)則通道設置差不多。
WahchDog
1、當ADC轉換的模擬電壓值低于低閾值或高于高閾值時,便會產生中斷。閾值的高低值由ADC_LTR和ADC_HTR配置模擬看門狗。
(5)ADC的三種工作模式
1)阻塞模式(也叫查詢模式);2)中斷模式;3) DMA 模式
二、原理圖設計
三、STM32CubeMX 配置串口重定向(printf)
此項目利用printf 打印ADC采樣值,先對USART1重定向,詳細教程參考前面的教程:
https://blog.csdn.net/luojuan198780/article/details/138044075
代碼設計:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN 4 */
/*********************************************************
*
*重定義 fputc 函數
*
*********************************************************/
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END 4 */
四、STM32CubeMX 配置及程序設計(單通道)
1.阻塞模式(查詢模式)
1.1CubeMX 配置 (單通道輪詢)
配置:打開通道8,其他默認
1.2 程序設計
Step1 : 啟用ADC
Step2 :? ?等待EOC標志位
Step3: 讀取寄存器的數據 、<-- 查詢環(huán)節(jié)
缺點:占用cpu的使用率
主要函數:
HAL_StatusTypeDef? HAL_ADC_Start (ADC_HandleTypeDefhadc); //打開ADC的轉換通道
HAL_StatusTypeDef? HAL_ADC_Stop (ADC_HandleTypeDefhadc) //關閉ADC
HAL_StatusTypeDef? HAL_ADC_PollForConversion (ADC_HandleTypeDef*hadc,uint32_t Timeout); // 查詢函數
(1)在main.c中定義一個全局變量
uint16_t ADC_Value;
(2)在main 初始化中開啟ADC校準
HAL_ADCEx_Calibration_Start(&hadc1); //AD校準
(3)在while 中編寫ADC控制程序
HAL_ADC_Start(&hadc1); //啟動ADC轉換
HAL_ADC_PollForConversion(&hadc1, 50); //等待轉換完成,50為最大等待時間,單位為ms
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Value = HAL_ADC_GetValue(&hadc1); //獲取AD值
printf("ADC值: %d \r\n",ADC_Value);
printf("采樣電壓 : %.2f V\r\n",ADC_Value*3.3f/4096);
}
HAL_Delay(1000);
2.中斷模式(單通道)
2.1CubeMX 配置
配置:其打開ADC中斷。他與查詢模式一樣,
2.2 程序設計
Step1 : 啟用ADC,使能中斷
Step2 :? ?等待EOC自動觸發(fā)中斷
Step3: 在中斷中讀取寄存器的數據
主要函數
HAL_StatusTypeDef?HAL_ADC_Start_IT (ADC_HandleTypeDefhadc) //使能ADC,打開中斷標志位
HAL_StatusTypeDef HAL_ADC_Stop——IT (ADC_HandleTypeDefhadc)
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//回調函數
?(1)在main.c中定義一個全局變量
uint16_t ADC_Value;
(2)在main函數中開啟ADC中斷
HAL_ADC_Start_IT(&hadc1);
(3)編寫中斷回調函數
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//回調函數
{
ADC_Value = HAL_ADC_GetValue(&hadc1) * 3.3 /4096;
printf("采樣電壓 : %.2f V\r\n",ADC_Value );
}
3.DMA 模式(單通道)
DMA 有兩種模式,分別為循環(huán)模式circular和正常模式normal
circular模式:DMA 的circular模式只需要調用一次DMA 開啟函數,DMA 就會持續(xù)的搬運數據,提高了數據的刷新速度,但是在circular模式下,不管ADC新的一輪數據采集是否完成,有可能直接將舊數據搬運走.
normal模式:該模式下,DMA 啟動函數調用一次,DMA 通道只會搬運一次數據,這樣每調一次DMA 啟動函數,DMA 只會搬運一次數據,等待數據傳輸完成后再次開啟DMA 啟動函數,這樣更能保證ADC數據采集的可靠性.
3.1CubeMX 配置(circular模式)
配置1:開啟連續(xù)轉換
配置2:添加DMA,模式選擇為循環(huán)模式circular
3.1?程序設計
(1)在main.c中定義一個全局變量
uint16_t ADC_Value=0;
(2)在main函數中開啟ADC的?DMA
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&AD_value,sizeof(AD_value));
(3)在while 中編寫ADC控制程序
printf("ADC值: %d \r\n",ADC_Value);
printf("采樣電壓 : %.2f V\r\n",ADC_Value*3.3f/4096);
HAL_Delay(100);
五、STM32CubeMX 配置及程序設計(多通道)
1.阻塞模式(多通道)
1.1CubeMX 配置?
多個通道時必須開啟間斷模式,并且每個間斷組中只有一個通道,否則每次只能讀取到每組最后一個通道的值。
1.2 程序設計
(1)在main.c中定義一個全局變量
uint16_t AD_value[2]={0};
(2)在while 中編寫ADC控制程序
for(i=0;i<2;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
AD_value[i]=HAL_ADC_GetValue(&hadc1);
printf("i= %d;AD_value%d\r\n",i,AD_value[i]);
printf("i= %d;電壓值 = %.3f v\r\n",i,AD_value[i]*3.3/4096);
}
HAL_Delay(500);
2.中斷模式(多通道)
????????多通道情況下使用中斷來讀取數據理論上是可行的,但是讀取的數據會混淆,即無法確定讀取的數據是屬于哪一個通道的,因此一般不使用。
3.DMA(多通道)
3.1CubeMX 配置?
開啟DMA并采用circular模式
3.2 程序設計
(1)在main.c中定義變量
/* USER CODE BEGIN 1 */
uint16_t ADC_Value1,i;
uint16_t AD_Buf[2]={0};//兩個通道采集數據存在這個數組里面
/* USER CODE END 1 */
(2)在main函數中開啟ADC的?DMA文章來源:http://www.zghlxwxcb.cn/news/detail-858603.html
//開啟ADC的校準
HAL_ADCEx_Calibration_Start(&hadc1);
//開啟ADC的DMA,采集的數據放入 AD_Buf數組
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&AD_Buf,2);
(3)在while 中編寫ADC控制程序文章來源地址http://www.zghlxwxcb.cn/news/detail-858603.html
printf("AD1=%d\n\r",AD_Buf[0]);
printf("AD2=%d\n\r",AD_Buf[1]);
HAL_Delay(100);
總結
到了這里,關于【STM32+HAL+Proteus】系列學習教程---ADC(查詢、中斷、DMA模式下的電壓采集)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!