![wKgaomZVdiiAfR9BAB3mDFhHnZc972.png](http://m.obk20.com/file1/web2/M00/EA/B7/wKgaomZVdiiAfR9BAB3mDFhHnZc972.png)
13.1实验内容
本实验是通过ADC注入组采样内部温度传感器和参考电压,通过本实验主要学习以下内容:
- 内部温度传感器和参考电压简介
- ADC注入组采样配合ADC中断应用
13.2实验原理
13.2.1内部温度传感器和参考电压简介
GD32F303有两个内部通道,分别为内部温度传感器(ADC0_CH16)和内部参考电压Vrefint(ADC0_CH17)。
温度传感器可以用来测量器件周围的温度。温度传感器的输出电压随温度线性变化,由于生产过程的多样化,温度变化曲线的偏移在不同的芯片上会有不同(最多相差45°C)。内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量精确的温度,应该使用一个外置的温度传感器来校准这个偏移错误。
从 ADC 数据寄存器中读取并计算温度传感器数据Vtemperature, 并由下面公式计算出实际温度:
![wKgaomZo_d-AK7egAAAKNRbWHkc192.png](http://m.obk20.com/file1/web2/M00/ED/C4/wKgaomZo_d-AK7egAAAKNRbWHkc192.png)
V25:温度传感器在25°C下的电压,从datasheet中可以查到典型值为1.45V。
Avg_Slope:温度与温度传感器电压曲线的均值斜率,从datasheet中可以查到典型值为4.1mV/℃。
内部电压参考(VREFINT)提供了一个稳定的(带隙基准)电压输出给ADC和比较器,典型值为1.2V。
13.3硬件设计
本实验使用两个内部ADC通道,无需要硬件设计。
13.4代码解析
13.4.1中断使能函数
在driver_adc.c中定义了开启中断的函数ADC_int_enable。
C /*ADC中断使能函数*/ void ADC_int_enable(typdef_adc_ch_general *ADC) { /*规则组中断使能*/ 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中断函数
在driver_adc.c中定义了ADC的中断函数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内部ADC通道结构体定义
ADC的初始化在前两章已经讲述过,这里就介绍下ADC和两个通道的结构体定义:
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,//关闭循环模式,因为使用的是注入组,故该参数实际无效 .ch_count = 2,//转换长度为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 } }; |
需要说明的是,由于使用的是内部通道,无需配置外部IO口,所以rcu_port参数等无需设置,这里是为了方便读者阅读将这几个参数设置为了NULL。
13.4.4内部通道ADC配置
在bsp_adc.c中定义了内部通道ADC配置的函数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中断入口函数
在gd32f30x_interrupt.c中定义了中断入口函数:
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函数实现
C int main(void) { delay_init();//delay函数初始化 bsp_uart_init(&BOARD_UART);//BOARD_UART串口初始化 bsp_Vref_Vtemp_ADC_config();//内部通道ADC配置和中断使能 while (1) { driver_adc_software_trigger_enable(&VRef_VTem_ADC); //软件触发ADC delay_ms(1000); temperature = (1.45 - Vref_Vtemp_data[0]*3.3/4095) * 1000 / 4.1 + 25; /*内部温度ADC转换值转换为实际温度值*/ vref_value = (Vref_Vtemp_data[1] * 3.3 / 4095); /*内部参考电压ADC转换值转换为实际电压值*/ printf(" the temperature data is %2.0f degrees Celsius\r\n", temperature); /*打印实际温度值*/ printf(" the reference voltage data is %5.3fV \r\n", vref_value); /*打印内部参考实际电压值*/ } } |
本例程main函数首先进行了延时函数初始化,为了演示实验结果,这里初始化了BOARD_UART串口,关于串口的使用,请读者参考串口章节,然后是内部通道ADC的配置和中断使能。在主循环中,先出发一次内部通道ADC,然后延时1s,在延时过程中ADC转换结束会进入ADC中断函数,中断函数将两个注入组通道数据赋给Vref_Vtemp_data数组,延时结束后,对温度和内部电压进行计算并将计算结果打印出来。
13.5实验结果
使用USB-TypeC线,连接电脑和板上USB to UART口后,配置好串口调试助手,即可看到内部温度传感器测到的温度值以及内部参考电压值了。
![]() | ![]() |
-
单片机
+关注
关注
6036文章
44557浏览量
635095 -
adc
+关注
关注
98文章
6498浏览量
544573 -
开发板
+关注
关注
25文章
5046浏览量
97432 -
GD32
+关注
关注
7文章
403浏览量
24346
发布评论请先 登录
相关推荐
【星空派GD32F303开发板试用体验】开发记录汇总
【星空派GD32F303开发板试用体验】开箱+环境搭建
【星空派GD32F303开发板试用体验】+板卡概览
GD32F303固件库开发
![<b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>](http://m.obk20.com/file/web2/M00/7E/B7/poYBAGOG-mGAZl3hABOR8D6E0tU278.png)
【GD32F303红枫派开发板使用手册】第二讲 GPIO-流水灯实验
![【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二讲 GPIO-流水灯<b class='flag-5'>实验</b>](http://m.obk20.com/file1/web2/M00/EA/0A/wKgZomZWjIGAa8HvAAAfwpvxoD4203.png)
【GD32F303红枫派开发板使用手册】第三讲 GPIO-按键查询检测实验
![【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第<b class='flag-5'>三讲</b> GPIO-按键查询检测<b class='flag-5'>实验</b>](http://m.obk20.com/file1/web2/M00/EA/54/wKgZomZX3jiAGq0tAAAqa9bz-8E477.png)
【GD32F303红枫派开发板使用手册】第五讲 FMC-片内Flash擦写读实验
![【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五讲 FMC-片内Flash擦写读<b class='flag-5'>实验</b>](http://m.obk20.com/file1/web2/M00/EB/E3/wKgaomZb036AbrwmAAAy6saV5XI905.png)
【GD32F303红枫派开发板使用手册】第十六讲 USART-DMA串口收发实验
![【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第十</b>六讲 USART-DMA串口收发<b class='flag-5'>实验</b>](http://m.obk20.com/file1/web2/M00/EF/11/wKgaomZs9FuAR6kDAAAeVi2N6To941.png)
【GD32F303红枫派开发板使用手册】第二十讲 SPI-SPI NAND FLASH读写实验
![【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二十讲 SPI-SPI NAND FLASH读写<b class='flag-5'>实验</b>](http://m.obk20.com/file1/web2/M00/F1/AD/wKgaomZzisiAamI-AABGtAQwDgo073.png)
评论