搜索
bottom↓
回复: 0

《ATK-DFPGL22G之FPGA开发指南_V1.0》 第三十六章

[复制链接]

出0入234汤圆

发表于 2023-7-27 11:11:46 | 显示全部楼层 |阅读模式
1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板
2)购买链接:https://item.taobao.com/item.htm?&id=692368045899
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-340252-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子FPGA交流群:994244016 lQLPJxaFi2zaB4UWWrDAMgIsFEW2pwLb3abnwDMA_90_22.png
lQDPJxaFi2nfFizMjM0CbLCPlxn_FVheIQLb3aGrwFQA_620_140.jpg

lQLPJxaFi2nfFhLMkM0BXrDNvOUyeU_FPgLb3aGvQNIA_350_144.png


第三十六章 内部温度传感器实验


本章介绍使用ADC采集APM32E103内部温度传感器输出的电压值,并根据该电压值计算出APM32E103芯片的大致温度。通过本章的学习,读者将学习到ADC、内部温度传感器的使用。
本章分为如下几个小节:
36.1 硬件设计
36.2 程序设计
36.3 下载验证


36.1 硬件设计
36.1.1 例程功能

1. ADC1采集通道16上的电压,即内部温度传感器输出的电压,将其转换为温度值后,显示在LCD上
2. LED0闪烁,指示程序正在运行
36.1.2 硬件资源
1. LED
        LED0 - PB5
2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
3. ADC1
        通道16
4. 内部温度传感器
36.1.3 原理图
本章实验使用的内部温度传感器为APM32E103的片上资源,因此没有对应的连接原理图。
36.2 程序设计
36.2.1 Geehy标准库的ADC驱动

本章实验与第三十三章“单通道ADC采集实验”十分相似,第三十五章实验中使用ADC1的通道1采集PA1引脚上的电压,而本章实验是使用ADC1的通道16采集APM32E103片内温度传感器的输出电压,因此大部分的内容都是相似的,以及操作ADC的方式都一样,因此请见第33.2.1小节中Geehy标准库的ADC驱动的相关内容。
36.2.2 ADC驱动
本章实验的ADC驱动主要负责向应用层提供ADC的初始化以及获取内部温度传感器温度的函数。本章实验中,ADC的驱动代码包括adc.c和adc.h两个文件。
因为本章实验的ADC驱动与第三十五章“单通道ADC采集实验”的ADC驱动代码十分相似,因此请参考第33.2.2小节ADC驱动的相关内容,本小节仅讲解获取内部温度传感器温度的函数,如下所示:
/**
* @brief       获取内部温度传感器温度值
* @param       无
* @retval      温度值(扩大了100倍,单位:℃)
*/
int16_t adc_get_temperature(void)
{
    uint16_t adcx;
    int16_t result;
    double temperature;
   
/* 读取内部温度传感器通道,10次取平均 */
    adcx = adc_get_result_average(ADC_TEMPSENSOR_CHX, 20);
    temperature = (double)adcx * (3.3 / 4095);       /* 转化为电压值 */
    temperature = (1.43 - temperature) / 0.0043 + 25;/* 计算温度 */
    result = temperature *= 100;                     /* 扩大100倍. */
   
    return result;
}
从上面的代码中可以看到,在获取温度传感器的输出电压后,需要将电压值转换为实际的温度值,转换公式涉及内部温度传感器的物理特性,由芯片的设计厂家给出。
36.2.3 实验应用代码
本章实验的应用代码,如下所示:
int main(void)
{
    int16_t temp;
   
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                        /* 配置系统时钟 */
    delay_init(120);                                 /* 初始化延时功能 */
    usart_init(115200);                              /* 初始化串口 */
    led_init();                                      /* 初始化LED */
    lcd_init();                                      /* 初始化LCD */
    adc_init();                                      /* 初始化ADC */
   
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "Temperature TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", BLUE);
   
    while (1)
    {
        temp = adc_get_temperature();                /* 得到温度值 */
        
        if (temp < 0)
        {
            temp = -temp;
/* 显示负号 */
            lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, "-", BLUE);
        }
        else
        {
/* 无符号 */
            lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, " ", BLUE);
        }
/* 显示整数部分 */
        lcd_show_xnum(30 + 11 * 8, 120, temp / 100, 2, 16, 0, BLUE);
/* 显示小数部分 */   
        lcd_show_xnum(30 + 14 * 8, 120, temp % 100, 2, 16, 0x80, BLUE);
        
        LED0_TOGGLE();                               /* LED0闪烁,提示程序运行 */
        delay_ms(100);
    }
}
本章实验的应用代码很简单,在完成包括ADC之内的初始化后,便重复通过函数adc_get_temperature()获取内部温度传感器采集的温度值,并在LCD上实时显示。
36.3 下载验证
在完成编译和烧录操作后,便可看到LCD上不断地刷新显示APM32E103内部温度传感器采集到的温度值。

阿莫论坛20周年了!感谢大家的支持与爱护!!

盗墓祖师爷留下的规矩:父子两人盗墓结束后,必定是父亲先出墓穴,儿子跟在后面。
如果儿子先上来,说不定想要独吞财物,可能转身一脚就将跟在后面的父亲封闭在墓穴里面。
而父亲永远不会杀死自己的儿子。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-3 00:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表