STM32-独立模式单通道ADC采集
目錄
1. ADC介紹
2. 硬件設(shè)計(jì)
?3. 軟件設(shè)計(jì)
3.1. CubeMX設(shè)置
?3.2. KEIL開發(fā)
4. 實(shí)驗(yàn)現(xiàn)象
1. ADC介紹
12位ADC是一種逐次逼近型模擬數(shù)字轉(zhuǎn)換器。它有多達(dá)18個(gè)通道,可測(cè)量16個(gè)外部和2個(gè)內(nèi)部信號(hào)源。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對(duì)齊或右對(duì)齊方式存儲(chǔ)在16位數(shù)據(jù)寄存器中。 模擬看門狗特性允許應(yīng)用程序檢測(cè)輸入電壓是否超出用戶定義的高/低閥值。?
有16個(gè)多路通道。可以把轉(zhuǎn)換組織成兩組:規(guī)則組和注入組。在任意多個(gè)通道上以任意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 ● 規(guī)則組由多達(dá)16個(gè)轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_SQR1寄存器的L[3:0]位中。 ● 注入組由多達(dá)4個(gè)轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里的轉(zhuǎn)換總數(shù)目應(yīng)寫入ADC_JSQR寄存器的L[1:0]位中。 如果ADC_SQRx或ADC_JSQR寄存器在轉(zhuǎn)換期間被更改,當(dāng)前的轉(zhuǎn)換被清除,一個(gè)新的啟動(dòng)脈沖將發(fā)送到ADC以轉(zhuǎn)換新選擇的組。 溫度傳感器/ VREFINT內(nèi)部通道溫度傳感器和通道ADC1_IN16相連接,內(nèi)部參照電壓VREFINT和ADC1_IN17相連接。可以按注入或規(guī)則通道對(duì)這兩個(gè)內(nèi)部通道進(jìn)行轉(zhuǎn)換。 注意: 溫度傳感器和VREFINT只能出現(xiàn)在主ADC1中。
ADC使用若干個(gè)ADC_CLK周期對(duì)輸入電壓采樣,采樣周期數(shù)目可以通過(guò)ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每個(gè)通道可以分別用不同的時(shí)間采樣。 總轉(zhuǎn)換時(shí)間如下計(jì)算: TCONV = 采樣時(shí)間+ 12.5個(gè)周期
例如: 當(dāng)ADCCLK=14MHz,采樣時(shí)間為1.5周期 TCONV = 1.5 + 12.5 = 14周期 = 1μs
單次轉(zhuǎn)換模式下,ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過(guò)設(shè)置ADC_CR2寄存器的ADON位(只適用于規(guī)則通道)啟動(dòng)也可通過(guò)外部觸發(fā)啟動(dòng)(適用于規(guī)則通道或注入通道),這時(shí)CONT位為0。?
在連續(xù)轉(zhuǎn)換模式中,當(dāng)前面ADC轉(zhuǎn)換一結(jié)束馬上就啟動(dòng)另一次轉(zhuǎn)換。此模式可通過(guò)外部觸發(fā)啟動(dòng)或通過(guò)設(shè)置ADC_CR2寄存器上的ADON位啟動(dòng),此時(shí)CONT位是1。
2. 硬件設(shè)計(jì)
ADC1的通道11連接滑動(dòng)變阻:
?
?3. 軟件設(shè)計(jì)
3.1. CubeMX設(shè)置
選擇ADC通道IN11,獨(dú)立模式,連續(xù)轉(zhuǎn)換,采樣周期41.5,開啟NVIC:
8分頻,即9MHz的時(shí)鐘,TCONV = 41.5 + 12.5 = 54周期*(1/9)?= 6μs,點(diǎn)擊生成代碼:
?3.2. KEIL開發(fā)
?ADC中斷回調(diào)函數(shù)接收轉(zhuǎn)換后的值:
//adc.c /* USER CODE BEGIN 0 */ uint32_t convValve; /* USER CODE END 0 *//* USER CODE BEGIN 1 */ /*** @brief Conversion complete callback in non blocking mode * @param hadc: ADC handle* @retval None*/ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {convValve=HAL_ADC_GetValue(hadc);} /* USER CODE END 1 */main函數(shù)接收并打印電壓采樣值:
//main.c/* USER CODE BEGIN 2 */printf("ADC轉(zhuǎn)換實(shí)驗(yàn):\n");HAL_ADCEx_Calibration_Start(&hadc1);HAL_ADC_Start_IT(&hadc1);/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){static float convValveVoltage;convValveVoltage=(float)(convValve*(3.3/4096));printf("ADC值為:%d\n",convValve);printf("ADC轉(zhuǎn)換為電壓后的值為:%f\n\n",convValveVoltage);HAL_Delay(2000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */4. 實(shí)驗(yàn)現(xiàn)象
調(diào)動(dòng)電壓值,可以看到電壓值在0~3.3V之間變化:
?
總結(jié)
以上是生活随笔為你收集整理的STM32-独立模式单通道ADC采集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iOS中使用storyboard进行布局
- 下一篇: STM32 CUBEIDE MacOS首