已知ntc热敏电阻为3950k,上拉10k电阻,adc采样为10bit。写一段程序采集ntc温度值,请用普通单片机C语言编写,不能用Arduino
时间: 2023-06-12 22:05:56 浏览: 192
NTC热敏电阻做温度采集
假设采集的NTC热敏电阻与上拉电阻组成电压分压电路,ADC采样引脚连接到电压分压电路输出端,以下给出一个简单的程序示例:
```c
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#define NTC_PORT PORTB
#define NTC_PIN PINB
#define NTC_DDR DDRB
#define NTC_BIT PB0
#define ADC_PORT PORTC
#define ADC_PIN PINC
#define ADC_DDR DDRC
#define ADC_BIT PC0
void adc_init(void) {
// 设置 ADC 基准电压为 AVCC,采样分辨率为 10 bit
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
uint16_t adc_read(uint8_t channel) {
// 设置 ADC 通道
ADMUX = (ADMUX & 0xF0) | (channel & 0x0F);
// 开始单次采样
ADCSRA |= (1 << ADSC);
// 等待采样完成
while (ADCSRA & (1 << ADSC));
// 返回采样结果
return ADC;
}
int main(void) {
// 初始化 NTC 端口为输入,ADC 端口为输出
NTC_DDR &= ~(1 << NTC_BIT);
ADC_DDR |= (1 << ADC_BIT);
adc_init();
while (1) {
// 读取 ADC 采样值
uint16_t adc_value = adc_read(ADC_BIT);
// 计算电压值
float voltage = adc_value * 5.0 / 1024.0;
// 计算 NTC 电阻值
float ntc_resistance = 10000.0 * voltage / (5.0 - voltage);
// 计算 NTC 温度值
float ntc_temperature = 1.0 / (1.0 / 298.15 + 1.0 / 3950.0 * log(ntc_resistance / 10000.0)) - 273.15;
// 打印温度值
printf("NTC temperature: %.1f C\r\n", ntc_temperature);
// 延时一段时间
_delay_ms(1000);
}
return 0;
}
```
程序中使用了 AVR 单片机的 ADC 功能,需要注意 ADC 通道和分辨率的设置。计算 NTC 温度值时,采用的是 Steinhart-Hart 公式,需要根据实际电路条件进行调整。此外,还需要根据具体的单片机型号和编译器进行相应的修改。
阅读全文