废话少说先看看他的参数1STM32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量;2测量范围ndash;40~125℃,精度plusmn;
废话少说 先看看他的参数 1.STM32内部温度传感器与ADC的通道16相连,与ADC合作运用完成温度丈量; 2.丈量规模–40~125℃,精度±1.5℃。 3.温度传感器发生一个随温度线性改变的电压,转化规模在2V < VDDA < 3.6V之间。
转化公式如下图所示:
|
呵呵 其实 写代码的时分 公式直接简化就得啦假如丈量要求不怎么高的话 呵呵(其实高也高不了 呵呵) 咱们都喜爱简略 简略明了嘿嘿 简化的公式: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啦 呵呵
第二步是做什么的呢?看这个图就晓得啦
|
贴一下初始化的函数
/******************************************************************************* * Function Name: ADC_Configuration * Description : ADC_Configuration * Input : None * Output : None * Return : None *******************************************************************************/ void ADC_Configuration(void) { /* DMA1 channel1 configuration ———————————————-*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_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 DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, 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; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 1, ADC_SampleTime_55Cycles5); /* Enable the temperature sensor and vref internal channel */ ADC_TempSensorVrefintCmd(ENABLE); /* 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); }
|
这个是抄袭马七的均值数字滤波函数 呵呵
/******************************************************************************* * Function Name: ADC_Filter * Description : ADC_Filter * Input : None * Output : None * Return : ADC Converted Value *******************************************************************************/ u16 ADC_Filter(void) { 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; 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;
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”)); |
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/276761.html