|
一共配置3个AD通道,【0】外部电压0,【1】外部电压1,【2】温度传感器,使用电源的3.3V作为参考电压
初始化部分:
void MX_ADC_Init(void)
{
/* USER CODE BEGIN ADC_Init 0 */
/* USER CODE END ADC_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC_Init 1 */
/* USER CODE END ADC_Init 1 */
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = ENABLE;
hadc.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_9;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC_Init 2 */
/* USER CODE END ADC_Init 2 */
}
ADC使用DMA采样,得到的值存在pData
pData【0】581 =》468mv 和测量值匹配
pData【1】576 =》464mv 和测量值匹配
pData【2】1665 =》温度通道的值
温度转换部分
/*
* TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP
* T('c) = ------------------------------------------- X (TEMPSENSOR_data - TEMPSENSOR_CAL1) + 30
* TEMPSENSOR_CAL2 - TEMPSENSOR_CAL1
*
* TEMPSENSOR_CAL_VREFANALOG = 3300
* TEMPSENSOR_CAL2_TEMP = 110
* TEMPSENSOR_CAL1_TEMP = 30
* TEMPSENSOR_CAL2 = (*TEMPSENSOR_CAL2_ADDR) value when vref=3300
* TEMPSENSOR_CAL1 = (*TEMPSENSOR_CAL1_ADDR) value when vref=3300
*/
int8_t GetTcpu()
{
int c1 = *TEMPSENSOR_CAL1_ADDR;
int c2 = *TEMPSENSOR_CAL2_ADDR;
int t = ((TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP) * (pData[ADC_T_CPU] - c1)) / (c2 - c1) + 30;
if (t < 0)
{
t = 0;
}
else if (t > 128)
{
t = 128;
}
return t;
}
这里
int c1 = *TEMPSENSOR_CAL1_ADDR; =》1768
int c2 = *TEMPSENSOR_CAL2_ADDR; =》1311
算出来 t=》46度
实际室温24度。这也差太远了。
另外一块板上用的STM32H723,算出来的温度是31度,算是正常。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|