[AT32M412] 【AT-START-M412测评】+ 06 使用内部ADC读取CPU温度

[复制链接]
4381|8
 楼主| 聪聪哥哥 发表于 2025-6-22 22:31 | 显示全部楼层 |阅读模式
今天使用芯片内部ADC的功能读取一下CPU的温度;
一:AT32 ADC的知识分享:
ADC是一个将模拟输入信号转换为 12位、10位、8位或6位的数字信号的外设。采样率最高可达2.5MSPS。
多达 26 个通道源(包括内部及外部通道)可进行采样及转换。

二:特征如下:
模拟方面有以下特征:
支持分辨率 12位、10位、8位或6位的转换自校准时间:205个ADC 时钟周期
ADC 转换时间ADC时钟在最大频率35MHz时转换时间为0.4usADC供电要求:参考DatasheetADC 输入范围:VssA≤ VIN ≤ VDDA
数字控制方面有以下特征:
通道管理区分优先权不同的普通通道与抢占通道普通通道与抢占通道具备各自独立的触发侦测电路
各通道均可独立配置采样时间转换顺序管理支持多种不同的多通道转换过采样器
可选择的数据对齐方式
可配置的电压监测边界,支持ADC VM 输出
支持 DMA 传输的普通通道数据联动多 ADC 的主从模式
可设定以下事件发生时响应中断
普通通道转换数据溢出
抢占通道组转换结束
普通通道转换结束
电压监测超出范围
触发转换失败
可配置多 ADC之间时序位移长度的主从位移模式-高效能需求可使用主从模式搭配DMA

三:AT32 work bench 软件配置:
0622-1.png
四:软件代码如下:
  1.     at32_led_toggle(LED2);
  2.     delay_sec(1);
  3.     /* adc1 software trigger start conversion */
  4.     adc_ordinary_software_trigger_enable(ADC1, TRUE);
  5.     while(dma_flag_get(DMA1_FDT1_FLAG) == RESET);
  6.     dma_flag_clear(DMA1_FDT1_FLAG);
  7.     printf("internal_temperature = %f deg C\r\n",(ADC_TEMP_BASE-(double)adc1_ordinary_value*ADC_VREF/4095)/ADC_TEMP_SLOPE+25);
五:实物测试如下:
0622-2.png
梦境漫游者 发表于 2025-8-21 09:35 | 显示全部楼层
读取芯片内部温度 adc好像自带这个功能
抒情黎明 发表于 2025-9-27 10:15 | 显示全部楼层
我也做了这个实验。只是我使用的是软件触发,等待完成的方式。
我觉得使用DMA的方式有点奢侈了
 楼主| 聪聪哥哥 发表于 2025-9-29 10:54 | 显示全部楼层
抒情黎明 发表于 2025-9-27 10:15
我也做了这个实验。只是我使用的是软件触发,等待完成的方式。
我觉得使用DMA的方式有点奢侈了 ...

软件触发也是可以的,就是不如DMA方便啊,直接转换
星云狂想曲 发表于 2025-9-30 23:00 | 显示全部楼层
话说,DMA是搬运,您代码里面也是使用的Timer来触发的
快乐制造机 发表于 2025-10-13 07:32 | 显示全部楼层
代码部分很实用,已经尝试在自己的项目中应用,效果不错。
小小蚂蚁举千斤 发表于 2025-10-16 16:57 | 显示全部楼层
使用内部ADC读取温度有助于系统稳定
蚊子的噩梦 发表于 2025-10-19 12:50 | 显示全部楼层
代码部分很有参考价值,尤其是ADC温度读取部分
蚊子的噩梦 发表于 2025-10-19 16:34 | 显示全部楼层
AT32 ADC的功能确实很强大,支持多种分辨率和采样率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

311

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部