0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第十三讲 ADC-内部温度传感器和参考电压采样实验

聚沃科技 2024-06-12 09:47 次阅读
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

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口后,配置好串口调试助手,即可看到内部温度传感器测到的温度值以及内部参考电压值了。

wKgaomZlEF2AEmzEABJQDjpDbLg902.pngwKgaomZo_eaAJ393AAAuFgZkpYc652.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44553

    浏览量

    634735
  • adc
    adc
    +关注

    关注

    98

    文章

    6496

    浏览量

    544484
  • 开发板
    +关注

    关注

    25

    文章

    5035

    浏览量

    97384
  • GD32
    +关注

    关注

    7

    文章

    403

    浏览量

    24328
收藏 人收藏

    评论

    相关推荐

    GD32F303】星空介绍

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 09-11 17:55

    【星空GD32F303开发板试用体验】开箱+环境搭建

    开发板得准备操作系统(win10),开发软件(mdk5),与此 星空GD32F303开发板 下传的 jlink连接
    发表于 10-18 14:15

    【星空GD32F303开发板试用体验】开箱+环境搭建

    GD32F303开发板得准备操作系统(win10),开发软件(mdk5),与此 星空GD32F303
    发表于 11-02 15:36

    【星空GD32F303开发板试用体验】+板卡概览

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 编辑 星空GD开发板是由旗点科技推出的一款GD32开发板
    发表于 11-06 21:05

    星空GD32F303开发板的相关资料下载

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 12-10 08:27

    第十三讲 施密特触发

    第十三讲 施密特触发 内容提要5.1 概述5.2 施密特触发一、工作原理1.特点:2.电压传输特性3.回差4.逻
    发表于 03-30 16:19 5458次阅读
    <b class='flag-5'>第十三讲</b> 施密特触发<b class='flag-5'>器</b>

    STM32CUBEMX开发GD32F303(10)----双ADC轮询模式扫描多个通道

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。需
    的头像 发表于 11-29 17:38 1827次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(10)----双<b class='flag-5'>ADC</b>轮询模式扫描多个通道

    STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。
    的头像 发表于 07-26 13:52 2028次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(14)----IIC之配置OLED

    GD32F303固件库开发

    的可以加群申请:615061293 。 GD32F303固件库开发(1)----前期准备与烧录 使用GDLINK、jlink、串口下载程序到GD芯片。 [https://blog.csdn.net
    的头像 发表于 07-27 09:27 1163次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>

    GD32F303红枫开发板使用手册】第二讲 GPIO-流水灯实验

    GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0
    的头像 发表于 05-29 10:02 1637次阅读
    【<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>

    GD32F303红枫开发板使用手册】第三讲 GPIO-按键查询检测实验

    GD32F303系列MCU GPIO输入配置结构如下图所示,输入可配置上下拉电阻,通过施密特触发后可通过备用功能输入或者通过输入状态寄存进行读取。
    的头像 发表于 05-30 10:02 858次阅读
    【<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>

    GD32F303红枫开发板使用手册】第五讲 FMC-片内Flash擦写读实验

    MC即Flash控制,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也
    的头像 发表于 06-02 10:05 772次阅读
    【<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>

    GD32F303红枫开发板使用手册第十二讲 ADC-双轴按键摇杆多通道循环采样实验

    实验是通过ADC规则组多通道循环采样方式实现双轴按键摇杆传感器x和y轴电压值的读取,通过本实验
    的头像 发表于 06-11 09:40 630次阅读
    【<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>二讲   <b class='flag-5'>ADC-</b>双轴按键摇杆多通道循环<b class='flag-5'>采样</b><b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册第十六讲 USART-DMA串口收发实验

    在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串口的TX和RX分别对应DMA的不同通道,比如USART0的TX对应DMA0的通道3,而RX对应DMA0的通道4。
    的头像 发表于 06-15 09:54 1066次阅读
    【<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>

    GD32F303红枫开发板使用手册】第二十讲 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 886次阅读
    【<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>