简易温度采集系统
本程序是使用了12位AD转换和ntc温度传感器,ntc是负洗漱数温度,系统通过AD转换将温度传感器和avr单片机联系起来。 在本实验中使用了atmelstudio的提供例程程序,为此我写了一些心得体会。 下图是AD转换的与温度线性关系。
有图中可以知道有部分两者很好吻合在一起,为了反映这部分的,有如下的等式。
为此有如下相应的程序 if (result > 697) { temperature = (int8_t)((-0.0295 * result) + 40.5); } if (result > 420) { temperature = (int8_t)((-0.0474 * result) + 53.3); } else { temperature = (int8_t)((-0.0777 * result) + 65.1); } 为了显示温度,在ADC中断函数使用了如下函数 snprintf(out_str, OUTPUT_STR_SIZE,"Temperature: %4d C", last_temperature); gfx_mono_draw_string(out_str, 0, 0, &sysfont); 启动下次转换 adc_start_conversion(adc, ch_mask); 在每次AD转换都会产生一次中断,采显示温度。下为中断函数 static void adc_handler(ADC_t *adc, uint8_t ch_mask, adc_result_t result) 为了配置ADC模块,使用了无符号的12数据存储结果,配置了参考电压,最大采样率频率是200kHz,人工的转换触发中断。 adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_VCC); adc_set_clock_rate(&adc_conf,200000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 0, 0); adc_enable_internal_input(&adc_conf, ADC_INT_TEMPSENSE); adc_write_configuration(&ADCA, &adc_conf); adc_set_callback(&ADCA, &adc_handler);申请中断函数 AD转换通道0和温度传感器连接,为此配置AD转换通道0, adcch_set_input(&adcch_conf, ADCCH_POS_PIN1, ADCCH_NEG_NONE, 1); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_enable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); 下面函数是使能AD转换,开始第一次转换。 adc_enable(&ADCA); adc_start_conversion(&ADCA, ADC_CH0); 下图是实验显示结果。
|