国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

【GD32F303紅楓派開發(fā)板使用手冊】第十三講 ADC-內(nèi)部溫度傳感器和參考電壓采樣實驗

發(fā)布者:EtherealLove最新更新時間:2024-12-12 來源: elecfans關鍵字:GD32F303  ADC  內(nèi)部溫度傳感器  參考電壓  采樣實驗 手機看文章 掃描二維碼
隨時隨地手機看文章

13.1實驗內(nèi)容

本實驗是通過ADC注入組采樣內(nèi)部溫度傳感器和參考電壓,通過本實驗主要學習以下內(nèi)容:

  • 內(nèi)部溫度傳感器和參考電壓簡介

  • ADC注入組采樣配合ADC中斷應用

13.2實驗原理

13.2.1內(nèi)部溫度傳感器和參考電壓簡介

GD32F303有兩個內(nèi)部通道,分別為內(nèi)部溫度傳感器(ADC0_CH16)和內(nèi)部參考電壓Vrefint(ADC0_CH17)。

溫度傳感器可以用來測量器件周圍的溫度。溫度傳感器的輸出電壓隨溫度線性變化,由于生產(chǎn)過程的多樣化,溫度變化曲線的偏移在不同的芯片上會有不同(最多相差45°C)。內(nèi)部溫度傳感器更適合于檢測溫度的變化,而不是測量絕對溫度。如果需要測量精確的溫度,應該使用一個外置的溫度傳感器來校準這個偏移錯誤。

從 ADC 數(shù)據(jù)寄存器中讀取并計算溫度傳感器數(shù)據(jù)Vtemperature, 并由下面公式計算出實際溫度:

wKgaomZo_d-AK7egAAAKNRbWHkc192.png

V25:溫度傳感器在25°C下的電壓,從datasheet中可以查到典型值為1.45V。
Avg_Slope:溫度與溫度傳感器電壓曲線的均值斜率,從datasheet中可以查到典型值為4.1mV/℃。

內(nèi)部電壓參考(VREFINT)提供了一個穩(wěn)定的(帶隙基準)電壓輸出給ADC和比較器,典型值為1.2V。

13.3硬件設計

本實驗使用兩個內(nèi)部ADC通道,無需要硬件設計。

13.4代碼解析

13.4.1中斷使能函數(shù)

在driver_adc.c中定義了開啟中斷的函數(shù)ADC_int_enable。

C
/*ADC中斷使能函數(shù)*/
void ADC_int_enable(typdef_adc_ch_general *ADC)
{
/*規(guī)則組中斷使能*/
if(ADC->adc_channel_group == ADC_REGULAR_CHANNEL)
{
adc_interrupt_enable(ADC->adc_port,ADC_INT_EOC);
adc_interrupt_flag_clear(ADC->adc_port,ADC_INT_EOC);
}
/*注入組中斷使能*/
else if(ADC->adc_channel_group == ADC_INSERTED_CHANNEL)
{
adc_interrupt_enable(ADC->adc_port,ADC_INT_EOIC);
adc_interrupt_flag_clear(ADC->adc_port,ADC_INT_EOIC);
}
}

13.4.2ADC中斷函數(shù)

在driver_adc.c中定義了ADC的中斷函數(shù)driver_adc_int_handler

C
void driver_adc_int_handler(typdef_adc_ch_general *ADC,void *buffer)
{
uint8_t i;
if(ADC->adc_channel_group == ADC_REGULAR_CHANNEL)
{
if(SET == adc_interrupt_flag_get(ADC->adc_port,ADC_INT_FLAG_EOC))
{
adc_interrupt_flag_clear(ADC->adc_port,ADC_INT_FLAG_EOC);
if(ADC->adc_mode == ADC_DAUL_REGULAL_PARALLEL)
{
REG32(buffer) = (uint32_t)(ADC_RDATA(ADC->adc_port));
}
else
{
REG16(buffer) = (uint16_t)(ADC_RDATA(ADC->adc_port));
}

}
}
else if(ADC->adc_channel_group == ADC_INSERTED_CHANNEL)
{
if(SET == adc_interrupt_flag_get(ADC->adc_port,ADC_INT_FLAG_EOIC))
{
adc_interrupt_flag_clear(ADC->adc_port,ADC_INT_FLAG_EOIC);
if(ADC->adc_mode == ADC_DAUL_INSERTED_PARALLEL)
{
for(i = 0; ich_count ; i++)
{
REG32(buffer) = REG32((ADC->adc_port) + 0x3C+(i*4));
buffer += 4;
}
}
else
{
for(i = 0; ich_count ; i++)
{
REG16(buffer) = REG16((ADC->adc_port) + 0x3C+(i*4));
buffer += 2;
}
}
}
}

}

13.4.3內(nèi)部ADC通道結(jié)構體定義

ADC的初始化在前兩章已經(jīng)講述過,這里就介紹下ADC和兩個通道的結(jié)構體定義:

C
typdef_adc_ch_general VRef_VTem_ADC = {
.rcu_adc = RCU_ADC0,//ADC0的時鐘
.adc_psc = RCU_CKADC_CKAPB2_DIV6,//ADC0設置為APB2 6分頻
.adc_port = ADC0,//ADC口為ADC0
.adc_mode = ADC_MODE_FREE,//ADC模式為獨立模式
.adc_channel_group = ADC_INSERTED_CHANNEL,//使用注入組
.adc_scan_function = ENABLE,//開啟掃描模式
.adc_continuous_function = DISABLE,//關閉循環(huán)模式,因為使用的是注入組,故該參數(shù)實際無效
.ch_count = 2,//轉(zhuǎn)換長度為2
.trigger_source = ADC0_1_2_EXTTRIG_INSERTED_NONE,
.DMA_mode = DISABLE//不使用DMA
};

typdef_adc_ch_parameter VRef_VTem_ch_parameter[2] =
{
{
.rcu_port = NULL,
.port = NULL,
.pin = NULL,
.gpio_speed = NULL,
.adc_channel = ADC_CHANNEL_16,//通道16
.sample_time = ADC_SAMPLETIME_55POINT5//設置采樣周期為55.5
}
,
{
.rcu_port = NULL,
.port = NULL,
.pin = NULL,
.gpio_speed = NULL,
.adc_channel = ADC_CHANNEL_17,//通道17
.sample_time = ADC_SAMPLETIME_55POINT5,//設置采樣周期為55.5
}

};

需要說明的是,由于使用的是內(nèi)部通道,無需配置外部IO口,所以rcu_port參數(shù)等無需設置,這里是為了方便讀者閱讀將這幾個參數(shù)設置為了NULL。

13.4.4內(nèi)部通道ADC配置

在bsp_adc.c中定義了內(nèi)部通道ADC配置的函數(shù)bsp_Vref_Vtemp_ADC_config

C
void bsp_Vref_Vtemp_ADC_config()
{
/*ADC配置*/
driver_adc_config(&VRef_VTem_ADC,VRef_VTem_ch_parameter);
/*ADC中斷打開*/
ADC_int_enable(&VRef_VTem_ADC);
/*NVIC設置*/
nvic_irq_enable(ADC0_1_IRQn,0,0);
}

13.4.5中斷入口函數(shù)

在gd32f30x_interrupt.c中定義了中斷入口函數(shù):

C
uint16_t Vref_Vtemp_data[2] ;
void ADC0_1_IRQHandler()
{
driver_adc_int_handler(&VRef_VTem_ADC,(uint16_t *)Vref_Vtemp_data);
}

13.4.6main函數(shù)實現(xiàn)

C
int main(void)
{
delay_init();//delay函數(shù)初始化
bsp_uart_init(&BOARD_UART);//BOARD_UART串口初始化
bsp_Vref_Vtemp_ADC_config();//內(nèi)部通道ADC配置和中斷使能
while (1)
{
driver_adc_software_trigger_enable(&VRef_VTem_ADC); //軟件觸發(fā)ADC
delay_ms(1000);
temperature = (1.45 - Vref_Vtemp_data[0]*3.3/4095) * 1000 / 4.1 + 25; /*內(nèi)部溫度ADC轉(zhuǎn)換值轉(zhuǎn)換為實際溫度值*/
vref_value = (Vref_Vtemp_data[1] * 3.3 / 4095); /*內(nèi)部參考電壓ADC轉(zhuǎn)換值轉(zhuǎn)換為實際電壓值*/
printf(' the temperature data is %2.0f degrees Celsiusrn', temperature); /*打印實際溫度值*/
printf(' the reference voltage data is %5.3fV rn', vref_value); /*打印內(nèi)部參考實際電壓值*/
}
}

本例程main函數(shù)首先進行了延時函數(shù)初始化,為了演示實驗結(jié)果,這里初始化了BOARD_UART串口,關于串口的使用,請讀者參考串口章節(jié),然后是內(nèi)部通道ADC的配置和中斷使能。在主循環(huán)中,先出發(fā)一次內(nèi)部通道ADC,然后延時1s,在延時過程中ADC轉(zhuǎn)換結(jié)束會進入ADC中斷函數(shù),中斷函數(shù)將兩個注入組通道數(shù)據(jù)賦給Vref_Vtemp_data數(shù)組,延時結(jié)束后,對溫度和內(nèi)部電壓進行計算并將計算結(jié)果打印出來。


13.5實驗結(jié)果

使用USB-TypeC線,連接電腦和板上USB to UART口后,配置好串口調(diào)試助手,即可看到內(nèi)部溫度傳感器測到的溫度值以及內(nèi)部參考電壓值了。

wKgaomZlEF2AEmzEABJQDjpDbLg902.png

wKgaomZo_eaAJ393AAAuFgZkpYc652.png


關鍵字:GD32F303  ADC  內(nèi)部溫度傳感器  參考電壓  采樣實驗 引用地址:【GD32F303紅楓派開發(fā)板使用手冊】第十三講 ADC-內(nèi)部溫度傳感器和參考電壓采樣實驗

上一篇:【GD32F303紅楓派開發(fā)板使用手冊】第三十講 CAN -CAN通信實驗
下一篇:【GD32F470紫藤派開發(fā)板使用手冊】第十講 USART-中斷串口收發(fā)實驗

小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved