STM32CUBEMX_DMA_ADC读取NTC温度
1、新建工程,配置时钟和下载引脚
2、配置ADC采样
3、配置DMA
4、时钟配置
5、NTC热敏电阻的对照表格
#define ADC_LEN 10
//注意:adc_value[0]、adc_value[2]、adc_value[4]、adc_value[6]、adc_value[8]采集是CH8通道
//注意:adc_value[1]、adc_value[3]、adc_value[5]、adc_value[7]、adc_value[9]采集是CH9通道
unsigned int adc_value[ADC_LEN] = {0};
#define ADC_BIT_12 4096 //ADC精度
#define ADC_PULL_UP_R 10000 //ntc电路中上拉电阻值
#define ADC_TABLE_LEN (sizeof(X_Temp)/sizeof(X_Temp[0]) == sizeof(Y_Res)/sizeof(Y_Res[0]) ? sizeof(X_Temp)/sizeof(X_Temp[0]) : 0)
//温度表
unsigned int X_Temp[] = {-40,-35,-30,-25,-20,-15,-10,-5,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125};
//和温度表对应的阻值表
unsigned int Y_Res[] = {195652,148171,113347,87559,68237,53650,42506,33892,27219,22021,17926,14674,12081,10000,8315,6948,5834,4917,4161,3535,3014,2586,2228,1925,1669,1452,1268,1110,974,858,758,672,596,531};
unsigned int ntc_adc_read(void) //采集两通道的值做均值计算
{
unsigned int adc = 0;
for(int i = 0;i < ADC_LEN;i++)
{
adc += adc_value[i];
}
adc = adc/ADC_LEN;
return adc;
}
unsigned int ntc_count_r(void)
{
unsigned int ntc_r;
unsigned int adc;
adc = ntc_adc_read();
ntc_r = (ADC_PULL_UP_R*adc)/(ADC_BIT_12-adc);
return ntc_r;
}
float ntc_build_equation(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,unsigned int Unkown_x,unsigned int Unkown_y)
{
float k = 0;
float b = 0;
k = ((float)y1-(float)y2)/((float)x1-(float)x2);
b = (float)y1-(float)x1*k;
if(0 == Unkown_x)
{
return ((float)Unkown_y-b)/k;
}
else
{
return ((float)Unkown_x*k+b);
}
}
float ntc_get_temp(unsigned int ntc_r)
{
unsigned int start_point = 0;
float temp_valve = 0;
for(unsigned int loop = 0;loop < ADC_TABLE_LEN;loop++)
{
if(ntc_r > Y_Res[loop])
{
start_point = loop;
break;
}
}
temp_valve = (float)ntc_build_equation(X_Temp[start_point],Y_Res[start_point],X_Temp[start_point+1],Y_Res[start_point+1],0,ntc_r);
return temp_valve;
}
void main(void)
{
HAL_ADC_Start_DMA(&hadc1,adc_value,ADC_LEN);
while(1)
{
Debug_printf("ntc_get_temp:%0.2f\r\n",ntc_get_temp(ntc_count_r()));
}
}