帕米 发表于 2015-6-25 13:15:45

arduino 读取内部温度传感器.

本帖最后由 帕米 于 2015-6-26 17:47 编辑

在看datasheet. 发现MCU居然还带温度测量. 精确度为 +/- 10°C.(好吧! 这误差.... 总比没带强...) , 还有随着驱动 IO电流变大时.温度会跟着往上飘.

有内部温度传感器的 AVR 芯片:

[*]ATmega168A : Yes
[*]ATmega168P : Yes
[*]ATmega328 : Yes
[*]ATmega328P : Yes
[*]ATmega1280 (Arduino Mega) : No
[*]ATmega2560 (Arduino Mega 2560) : No
[*]ATmega32U4 (Arduino Leonardo) : Yes


硬件: 1arduino 328P + 1 USB线. 其它无..

tips: 先确定所在的环境温度,再慢慢修正 偏移量,

不得不提一下, 这次的 arduino IDE 1.6.5 版本更新的不错.. Linux 版本.字体比以前好看多了. 还能写中文注释.. 括号匹配时还带个动画一跳一跳的. {:soso_e142:}

Code...


double getTemp(void) {
uint16_t wADC;
double t;

// 设置内部参考电压 1.1 和选择多路复用ADC8 (AVR内部温度传感器)
ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
ADCSRA |= _BV(ADEN);// 使能 ADC 功能

delay(20);            // 等待 AREF 电压变得稳定。

ADCSRA |= _BV(ADSC);// 开启 ADC 转换

// 检测ADC转换结束
while (bit_is_set(ADCSRA,ADSC));

// 读寄存器值
wADC = ADCW;
//Serial.println(wADC);
// 偏移量 324.31 可能是错的, 它是只是例子。 可以先确定所在的环境温度,再得出偏移量
t = (wADC - 320.31) / 1.11;

// 返回摄氏度
return (t);
}

void setup() {
Serial.begin(9600);
Serial.println("Arduino Internal Temperature Sensor.");
}

void loop() {
// 显示温度
Serial.println(getTemp(), 1);
delay(1000);
}


山寨以下..
http://playground.arduino.cc/Main/InternalTemperatureSensor

suoma 发表于 2015-6-26 21:21:41

我也试一下

darkorigin 发表于 2015-6-26 19:12:19

这个误差 基本上也可以忽略了
要知道一般芯片工作温度区间也就是-20°C-90°C 误差居然能达到+/-10°C 你确定这个温度不是猜出来的?
感觉比人手感知还不靠谱

帕米 发表于 2015-6-26 17:40:51

疲倦的黄昏 发表于 2015-6-26 11:09 static/image/common/back.gif
厉害。。。

:loveliness:

帕米 发表于 2015-6-26 17:39:06

jikecyatmcn 发表于 2015-6-25 19:12 static/image/common/back.gif
居然还有这功能

呵呵, AVR还是挻强大的.:lol

疲倦的黄昏 发表于 2015-6-26 11:09:46

厉害。。。:D

jikecyatmcn 发表于 2015-6-25 19:12:14

:funk:居然还有这功能
页: [1]
查看完整版本: arduino 读取内部温度传感器.