要进行温度控制就离不开温度传感器,就温度传感器的类型讲,主要分为两大类,一是数字式的如DHT22、DS1802等,另一种则是使用热敏电阻的模拟式传感器,它在检测温度时需要ADC的配合。
对于DHT22这类的传感器主要是进行环境的温度检测,其测量的温度范围比较窄,也不适于进行液体类介质的检测,其测量的温度范围比较宽。而对于热敏电阻类的传感器,在加装外部铠甲的情况下,则可进行液体介质类的检测。
1.传感器及电路选型
为了便于后续的扩展使用,此次设计的微控器是采用NTC热敏电阻,其阻值为10K,相应的测温电路见图1所示。
图1 测温电路
为了避开3个电位器所占用的数据采集通道,温度检测使用的是ADC采集通道7,使用的引脚为PA7。
图2 整体构成
2. 温度检测与控制
为了便于温度的控制,这里用板载的4个按键配置了参数的设置功能。
此外,还利用板载的LED来指示控制状态,其中LD1指示处于加热状态,LD4指示处于停止加热状态。
具体的温度控制与状态指示主程序为:
int main(void){ uint32_t i,f; float u,V; BOARD_Init(); Init_oled(); OLED_Init(); OLED_Clear(); OLED_ShowString(10,0,"EVB-L0136",16); OLED_ShowString(10,2,"max:",16); // 温控限制 OLED_ShowString(10,4,"T= C",16); // 当前温度 OLED_ShowString(10,6,"U= mV",16); // 读取电压 f=1; Init_key(); Init_led(); i=0; while (f) { if(GPIO_ReadInDataBit(GPIOB, GPIO_PIN_2)==1) i=i-1; // K1键 -1 if(GPIO_ReadInDataBit(GPIOD, GPIO_PIN_5)==0) i=(i+1)%3300; // K2键 +1 if(GPIO_ReadInDataBit(GPIOA, GPIO_PIN_8)==0) i=(i*10)%3300; // K3键 移位 if(GPIO_ReadInDataBit(GPIOB, GPIO_PIN_5)==0) f=0; // K4键 确认 OLED_ShowNum(42,2,i,5,16); app_delay(20); } app_adc_init(); while (1) { u=(unsigned)(app_adc_run_conv() & 0xFFF); u=3300*u/4095; OLED_ShowNum(26,6,u,5,16); if((u<=1644)&&(u>1268)) V=10+(1644-u)/37; if((u<=1268)&&(u>947)) V=20+(1268-u)/32; if((u<=947)&&(u>692)) V=30+(947-u)/25; OLED_ShowNum(26,4,V,5,16); if(V<i) { GPIO_WriteBit(GPIOB, GPIO_PIN_9, 0u); // 红色的LD1指示处于加热状态 GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u); } else { GPIO_WriteBit(GPIOB, GPIO_PIN_9, 1u); GPIO_WriteBit(GPIOC, GPIO_PIN_0, 0u); // 黄色的LD4指示处于散热状态 } app_delay(200); } }
复制代码经程序的编译和下载,其检测与控制效果如图3和图4所示。
若将LD1指示灯的引脚连接到继电器以控制加热器件,则可以实现温度的恒定控制。
图3 加热状态
图4 停止加热状态