当前位置: 首页 > news >正文

STM32的HAL库开发---ADC采集内部温度传感器

一、STM32内部温度传感器简介

二、温度计算方法

F1系列:

 从数据手册中可以找到V25和Avg_Slope

 F4、F7、H7系列只是标准值不同,自行查阅手册

三、实验简要

1、功能描述

通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后,串口发送

2、确定最小刻度

VREF+ = 3.3V ---> 0V ≤ VIN ≤  3.3V --->最小刻度 = 3.3 / 4096

3、确定转换时间

采样时间设置为最小值239.5个ADC时钟周期,可以得到转换时间为21us,满足温度传感器要求的17us.

4、模式组合

连续转换模式、不扫描模式

四、编程实战

1、寄存器版本

adc.c源程序

#include "./BSP/ADC/adc.h"void ADC_Init(void)
{//开启ADC1时钟RCC->APB2ENR |= (1 << 9);//TSVREFE 开启内部温度传感器ADC1->CR2 |= (1 << 23);//设置ADC时钟分频系数为6 ADC采集时钟为12M//这个注意温度传感器采样时间不能少于17usRCC->CFGR |= (1 << 15);//SCAN位  一个通道 关闭扫描模式ADC1->CR1 &= ~(1 << 8);	//EXTTRIG 开启规则通道的外部触发ADC1->CR2 |= (1 << 20);//EXTSEL 设置为SWSTART软件触发 ADC1->CR2 |= (0X07 << 17);//ALIGN 设置数据对齐为右对齐模式ADC1->CR2 &= ~(1 << 11);//ADCON 开启ADCADC1->CR2 |= (1 << 0);//CONT 开启连续转化模式ADC1->CR2 |= (1 << 1);//SMP1 ADC1_CH1 设置采样时间为239.5个时钟周期//时钟为12M 239.5 + 12.5 = 252个周期ADC1->SMPR2 |= (0X07 << 3);//L 设置规则通道转换数为1ADC1->SQR1 &= (0X0F << 20);//SQ1 设置第一个转化为ADC通道16ADC1->SQR3 |= (16 << 0);	//RSTCAL 初始化校准寄存器ADC1->CR2 |= (1 << 3);/*********************注意***************///第一个不写会出问题//这必须要等待两次  一个是等待校准寄存器初始化完成之后  ,再开启校准//第二个是等待校准完成再开始转换//等待校准完成while(ADC1->CR2 & (1 << 3));//CAL 开始校准ADC1->CR2 |= (1 << 2);//等待校准完成while(ADC1->CR2 & (1 << 2));//SWSTART 开启规则通道软件触发ADC1->CR2 |= (1 << 22);
}

 main.c主函数

主函数里边只要使用公式计算内部温度传感器温度

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/ADC/adc.h"uint16_t ADC_Voyage = 0;
double V_SENSE = 0;
int main(void)
{HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */led_Init();                         /* LED初始化 */usart_init(115200);ADC_Init();while(1){ LED0(1);LED1(0);delay_ms(500);LED0(0);LED1(1);delay_ms(500);//while//读取DR数据寄存器的值ADC_Voyage = (ADC1 ->DR) & (0x0FFF);//将数据值转换为电压值V_SENSE = ((double)ADC_Voyage * 3.3) / 4096;printf("STM32内部温度为:%f℃\r\n",((double)(1.43 - V_SENSE))/0.0043  + 25);//触发ADC转换一次//ADC1->CR2 |= (1 << 22);}
}

2、库函数版本

adc.c源程序

#include "./BSP/ADC/adc.h"GPIO_InitTypeDef GPIO_Init;
ADC_HandleTypeDef hadc;
void ADC_Init(void)
{	hadc.Instance = ADC1;//开启连续转换hadc.Init.ContinuousConvMode = ENABLE;//数据右对齐 12位存16位寄存器hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;//关闭间断模式hadc.Init.DiscontinuousConvMode = DISABLE;//软件触发hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;//转换数量一个hadc.Init.NbrOfConversion = 1;//间断模式转换数量0//关闭扫描模式  就一个通道hadc.Init.NbrOfDiscConversion = 0;hadc.Init.ScanConvMode = ADC_SCAN_ENABLE;HAL_ADC_Init(&hadc);ADC_ChannelConfTypeDef sConfig;//配置通道1sConfig.Channel = ADC_CHANNEL_1;//第一个转换sConfig.Rank = ADC_REGULAR_RANK_1;//采样时间239.5 + 12.5sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;HAL_ADC_ConfigChannel(&hadc,&sConfig );//ADC校准功能HAL_ADCEx_Calibration_Start(&hadc);//开启ADC采集HAL_ADC_Start(&hadc);
}void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{//开启ADC1时钟__HAL_RCC_ADC1_CLK_ENABLE();//开启GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_Init.Mode = GPIO_MODE_ANALOG;GPIO_Init.Pin = GPIO_PIN_1;GPIO_Init.Pull = GPIO_NOPULL;//设置PA1为模拟输入模式HAL_GPIO_Init(GPIOA,&GPIO_Init);RCC_PeriphCLKInitTypeDef  PeriphClkInit;PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}

这里注意要配置RCC时钟,将ADC的分频系数配置位6分频

http://www.lryc.cn/news/542095.html

相关文章:

  • Linux 命令大全完整版(12)
  • Python - 代码片段分享 - Excel 数据实时写入方法
  • (七)趣学设计模式 之 适配器模式!
  • DeepSeek 细节之 MoE
  • 【Linux-网络】从逻辑寻址到物理传输:解构IP协议与ARP协议的跨层协作
  • 毕业离校管理系统的开发与需求分析
  • 【NLP 24、实践 ⑤ 计算Bert模型中的参数数量】
  • 一、Spring框架系统化学习路径
  • Midscene.js - AI驱动,轻松实现UI自动化
  • (九)Mapbox GL JS 中 Marker 图层的使用详解
  • 2k1000LA 使能 nand.
  • Junit+Mock
  • maven编译出错,javac: ��Ч��Ŀ�귢�а�: 17
  • Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积
  • <el-table>右侧有空白列解决办法
  • Linux网络 网络层
  • 系统讨论Qt的并发编程——逻辑上下文的分类
  • 《Linux Shell 脚本深度探索:原理与高效编程》
  • 深入剖析:基于红黑树实现自定义 map 和 set 容器
  • 在大数据项目中如何设计和优化数据模型
  • JavaScript querySelector()、querySelectorAll() CSS选择器解析(DOM元素选择)
  • Linux系统中处理子进程的终止问题
  • Docker 不再难懂:快速掌握容器命令与架构原理
  • 取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票
  • 力扣-贪心-763 划分字母区间
  • 【Redis 原理】网络模型
  • cpp中的继承
  • DeepSeek全栈接入指南:从零到生产环境的深度实践
  • CSS 真的会阻塞文档解析吗?
  • 大模型的UI自动化:Cline 使用Playwright MCP Server完成测试