stm32 内部温度传感器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
第二步是做什么的呢? 看这个图就晓得啦
贴一下初始化的函数
/***********************************************************************
********
* Function Name : ADC_Configuration
* Description : ADC_Configuration
{
u16 result=0;
u8 i;
for(i=16;i>0;i--)
{
Delay_Ms(1);
result += ADCConvertedValue;
}
return result/16;
}
转换结果 往串口发送显示 (写的很烂哈) ADC_Value = ADC_filter(); vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25;
ห้องสมุดไป่ตู้
* Input
: None
* Output
: None
* Return
: None
************************************************************************
*******/
void ADC_Configuration(void)
{
ADC_Value = Temperature;
a = ADC_Value/1000; b = (ADC_Value - a*1000)/100; c = (ADC_Value - a*1000 - b*100)/10; d = ADC_Value - a*1000 - b*100 - c*10;
/*
DMA1
channel1
configuration
----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
1,
ADC_SampleTime_55Cycles5);
/* Enable the temperature sensor and vref internal channel */
ADC_TempSensorVrefintCmd(ENABLE);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
V25
最小=1.34V 典型=1.43V 最大=1.52V
Avg_Slope 最小=4.0 典型=4.3 最大=4.6 单位是 mV/℃
例如读到 Vsense = 1.30V。分别取 V25和 Avg_Slope 的典型值,计算得到:
(1.43 - 1.30)/0.0043 + 25 = 55.23
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE);
/*
ADC1
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1,
ADC_Channel_16,
=
DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
呵呵 其实 写代码的时候 公式直接简化就得啦 如果测量要求不怎么高的话 呵 呵(其实高也高不了 呵呵) 我们都喜欢简单 简单明了 嘿嘿 简化的公式: vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25
呵呵 重新说一下 过程: 1. 初始化 ADC 初始化 DMA (大家可以参考马七的 ADC 教程 ) 2. ADC_TempSensorVrefintCmd(ENABLE); 这个要开启哦 使能温度传感器和内 部参考电压通道 3. 简单的数字滤波一下检测到的 ADC 的值 4. 按照刚才列出的公式计算 就 OK 啦 呵呵
所以温度大约为 55℃ 1. STM32内部温度传感器与 ADC 的通道16相连,与 ADC 配合使用实现温度测量; 2. 测量范围–40~125℃,精度±1.5℃。 3. 温度传感器产生一个随温度线性变化的电压,转换范围在2V < VDDA < 3.6V 之间。
转换公式如下图所示:
手册中对于公式中的参数说明:
ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
Uart1_PutString("STM32 Chip Temperature = ",strlen("STM32 Chip Temperature = ")); Uart1_PutChar(a+'0'); Uart1_PutChar(b+'0'); Uart1_PutChar(c+'0'); Uart1_PutChar(d+'0'); Uart1_PutString(" C\n",strlen(" C\n"));
这个是抄袭马七的均值数字滤波函数 呵呵
/***********************************************************************
********
* Function Name : ADC_Filter
* Description : ADC_Filter
configuration
------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
/* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */
设想一个 XY 坐标,X 轴为 ADC 的电压读数,Y 轴为温度,两轴之间有一条直线代 表了温度与转换电压的关系;在这条直线上如果 X 轴电压为 V25时,Y 轴即为25 ℃;当读出的电压是其它数值时,即读出的电压是 Vsense 时,使用这个公式就可 以得到温度的数值。
在 STM32F103xx 的数据手册中分别给出了 V25和 Avg_Slope 的值:
STM32内部温度传感器的使用与计算
STM32内置一个温度传感器,通过 ADC_IN16这个通道可以读出温度传感器的电 压。在中给出了一个计算公式:
Temperature (in ℃) = {(V25 - V ) SENSE / Avg_Slope} + 25
公式中的 Vsense 就是在 ADC_IN16读到的数值。Avg_Slope 就是温度与 ADC 数值转 换的斜率。
* Input
: None
* Output
: None
* Return
: ADC Converted Value
************************************************************************
*******/
u16 ADC_Filter(void)