STM32增强型产品,内嵌3个12位的模拟/数字转换器(ADC),每个ADC共用多达21个外部通道,可以实现单次或多次扫描转换。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
STM32内部的温度传感器和ADCx_IN16输入通道相连接,此通道把传感器输出的电压值转换成数字值。STM内部的温度传感器支持的温度范围:-40到125摄氏度。精度较差,误差为+(-)1.5度左右。
利用STM32的内部温度传感器,可以得到芯片当前的温度。
先上图:
如图所示,有时芯片温度可以达到30℃以上,那是因为我把手压在芯片上改变温度了,哈哈。正常情况下就27℃左右。
附上内部温度传感器的配置函数代码:
/*
* 函数名:ADC1_GPIO_Config
* 描述 :使能ADC1和DMA1的时钟
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void ADC1_GPIO_Config(void)
{
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}
/* 函数名:ADC1_Mode_Config
* 描述 :配置ADC1的工作模式为MDA模式
* 输入 : 无
* 输出 :无
* 调用 :内部调用
*/
static void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/* DMA channel1 configuration */
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; // AD转换值所存放的内存基地址 (就是给个地址)
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 外设作为数据传输的来源
DMA_InitStructure.DMA_BufferSize = 1; // 定义指定DMA通道 DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // HalfWord
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环模式下
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //没有设置为内存到内存的传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE); //ENABLE她
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //多通道
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //由软件触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //Right
ADC_InitStructure.ADC_NbrOfChannel = 1; //仅一个通道转换
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel16 configuration */
//设置采样通道IN16, 设置采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);
//使能温度传感器和内部参考电压
ADC_TempSensorVrefintCmd(ENABLE);
//ADC1->CR2|=1<<0; //设置ADON启动
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, 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 */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}