鱼缸原来的加热棒使用的是NTC负温度系数的热敏电阻测温,负温度系数是指随着温度的升高,电阻是不断按照指数形式减小的,在22度的情况下实测电阻是10K多,可以断定使用了10K(25度下是10K)的电阻,为了先做好实验准备,先买了10K的B3950的热敏电阻:
将18B20和10K电阻放在一起,获得接近的温度数据,NTC程序:
float fnCalculation_temperature(uint16_t ADC_values)
{
uint16_t adc_temp=0;
float m_wTemperature=0.0; //温度值 初始化为0
float m_wR2=12000.0; //附带分压阻值电阻
float m_wR1=0.0; //热敏电阻 初始化为0
float T2=298.15; // 273.15 + 25
float B=3950.0; //数据手册上找
float K=273.15; //开尔文
float R2V=0.0; //分压值 初始化为0
//一般转换需要时间,普通转换,这里加放转换函数。
adc_temp = ADC_values;
//需要的时间
//HAL_Delay(1);
//printf("adc = %d\r\n",adc_temp );
//自己单片机>>>>是12位ADC
//(1)2^12=4096
//(2)上拉3.3V
R2V=(adc_temp*(3.25/4096));
//电阻公式
//m_wR1=((3.3-R2V)*m_wR2)/R2V;
m_wR1=(R2V * m_wR2)/(3.25 - R2V); //接线不同,改了公式
//R2=(R2V*R1)/(3.3-R2V);
//套公式使用 //注意下面公式中m_wR2在25度是正好是10K,和电路图正好重合
//m_wTemperature=1.0/(1.0/T2+log(m_wR1/m_wR2)/B)-K+0.5;
m_wTemperature=1.0/(1.0/T2+log(m_wR1/m_wR2)/B) - K - 5.6;//和18B20的温度有误差,加了修正
return m_wTemperature;
}
分压电阻一般使用和热敏电阻相同的阻值,结果没有找到10K的,用了12K替代,分压电阻放在VCC端,就是VCC->12K分压电阻->10K B3950热敏电阻->GND的接线方式,单片机的ADC管脚测试两个电阻之间的电压变化。
调整了电阻的计算公式,测试了电压是3.25V。
因为最终测试结果和18B20的结果有偏差,没有找到原因在哪里,干脆加了个5.6的偏移量,结果算是准确,问题后面再找。
读ADC的程序:
uint32_t get_adc_value1(void)
{
HAL_ADC_Start (&hadc1);//第一步,开启ADC
HAL_ADC_PollForConversion (&hadc1,50);// 查询函数,等着ADC 转换,查询转换的标志位.
if (HAL_IS_BIT_SET (HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)) //判断ADC是否转换完成,判断EOC标志位
{
return HAL_ADC_GetValue(&hadc1); // 获取ADC的值
}
else return 0;
}