검색

저자의 재개 및 생물 내 취미에 관련된 기사의 커플 - 로봇
호주로 이민에 대한 내 노출. 오직 러시아. 해결 일상적인 문제 요리법
리눅스에 관련된 글 윈도우 관련 게시물
소프트웨어에 관련된 게시물 하드웨어에 대한 정보를 많이
당신이 유용하게 찾을 수있는 다른 도구 다양한 웹 기술에 대한 게시물
메뉴의 나머지에 맞지 않아 모든 이 블로그에 대한 RSS 피드

태그 클라우드

기록 보관소

링크

안드레이 Mikhalchuk의 블로그

English flagItalian flagKorean flagChinese (Simplified) flagPortuguese flagGerman flagFrench flagSpanish flagJapanese flagRussian flagDanish flagFinnish flagHebrew flag

삶에 대해 Technoblog

2011년 6월 20일는 ATtiny85/45/25 내부 온도 센서 읽기

ATtiny85 has internal temperature sensor

ATtiny85은 내부 온도 센서를 가지고

나는 RTFMs 비디오 블로그 (체크 아웃에서 내 프로젝트 중 하나 중이고 http://rtfms.com을 매우 작은 패키지에서 감지 온도가 필요합니다.) 당연히 내 선택은 ATtiny85입니다 - 다른 제품 이외 (PWM, 직렬 인터페이스 등이 6ch처럼) 내부 온도 센서를 가지고 AVR에서 멋진 작은 칩. 그래서 하나를 사용하기로 결정했습니다. 그렇게 쉬운 일이 아니었지만, 파고 포럼 및 데이터 시트의 몇 시간 후에 아주 인상적인 신뢰성과 정밀 작업을 수행하는 클래스를 내놓았다.


이 코드를 실행하는 것이 무엇보다도 당신은 Arduino-초소형 (필요 http://code.google.com/p/arduino-tiny/ ) 코어 및 ISP의 일종. 저는 ISP로 Arduino Duemilanove를 사용하고 있습니다. 제 RTFMs 그것이 얼마나 등 AFAIK 정확한 핵심을로드하는 모든 인기있는 코어가이 코드를 사용하여 잘 동작합니다 이런식으로 작동하게하는 방법에 대한 자세한 내용은 블로그 참조하십시오. 난 단지 때문에 ATtiny85 더 많은 능력을 최대한 발휘하는 데 사용할 수있는 풍부한 기능성 Arduino - 타이니 recomment.
솔루션은 여러분의 프로젝트로 복사할 수있는 두 가지 파일이 구성되어 있습니다. 그냥 해당 페이지에서 그들을 copypaste :

InternalTemperatureSensor.h

# ifndef _INTERNAL_TEMPERATURE_SENSOR_H_
# 정의 _INTERNAL_TEMPERATURE_SENSOR_H_

# TEMPERATURE_SAMPLES 30를 정의
# TEMPERATURE_ADJUSTMENT -13를 정의
# EXTREMES_RATIO 5 정의

# MAXINT 32,767를 정의
# MININT -32767 정의

/ *
* 샘플을 바탕으로 :
* - 내부 임시 센서 끔찍한 편차가 있습니다. 그것의 출력 왜 말하지을 (+ / -10도 / 초) 차이가 있으므로 필요
* 일부 "스무딩". 나는 극단적인 값을 제거하고 나머지 압연 평균 중이에요. OK 이는 반품
20 샘플 이상의 * 결과입니다. 당신은 응답 시간을 줄이기 위해 샘플의 수를 줄일 수 있지만 수
*은 정밀도를 감소됩니다.
* - 선형성 확인하고 데이터 시트 약속한대로 약 1.0
* - 별도로 각 칩의 계산하고 c'tor에서 제공되는 오프셋 필요성
*
2 (시리얼, 텍사스) 9600 8N1을 달아하고 사용하는 단말기 최대 오프셋 후크를 calaculate하는 * 주문에
* temperature.print () 메서드 호출. 이것은 온도 설치 했어요를 인쇄합니다. 당신의 대조를 일치
* 온도계는 칩에 부착된 교정. c'tor 필요한 경우에 TOS를 조정합니다.
* 좀 더 자세한 사항은 ATtiny85 데이터 시트의 장을 17.12을 참조하십시오
* /

클래스 InternalTemperatureSensor {
오프셋 INT;
계수는 역부족;
INT 수치 [TEMPERATURE_SAMPLES];
INT POS,

공공 :
InternalTemperatureSensor (플로트 K, INT O) : 오프셋 (O), 계수 (K), POS (0) {}
/ / (설정에서 IE) 그것을 당신이 센서를 읽을 칩을 준비를해야 할 때마다 호출
당신은 온도 외에 다른 ADC를를 사용하는 / /면하면 각 온도 읽기 전에 전화
() INIT 무효화;
/ /는 LSB에서 현재의 평균 온도를 반환
INT in_lsb ();
/ /은 섭씨 도의 온도에서 현재의 평균 온도를 반환
INT in_c ();
/ /이 화씨로 현재의 평균 온도를 반환
INT in_f ();
/ /이 Kelvins 년 현재 평균 온도를 반환
INT in_k ();
/ / 센서에서 읽고 현재의 원시 온도를 반환
INT 원시 ();
/ / 다양한 포맷으로 현재 온도 판독을 인쇄합니다
인쇄 ()을 무효화;
};
# endif / / _INTERNAL_TEMPERATURE_SENSOR_H_

InternalTemperatureSensor.pde

# "InternalTemperatureSensor.h"를 포함

공극 InternalTemperatureSensor :: INIT () {
/ / analogReference (INTERNAL1V1);
/ / ATTiny85 데이터 시트 p140 (17.13.2), p137 (17.12)
/ / ADMUX 구성
ADMUX = B1111; / /를 선택 온도 센서
ADMUX & = ~ _BV (ADLAR); / / 마우스 오른쪽 단추로 조정 결과
ADMUX | = _BV (REFS1); / / 설정 참조 전압
ADMUX & = ~ (_BV (REFS0) | _BV (REFS2)); / /로 1.1V
/ / ADCSRA 구성
ADCSRA & = ~ (_BV은 (ADATE) | _BV (ADIE)); / / autotrigger을 해제, 인터럽트 비활성화
ADCSRA | = _BV (아덴), / /​​ 사용 ADC
ADCSRA | = _BV (ADSC); / / 먼저 변환을 시작합니다
/ / 종자 샘플
INT raw_temp;
동안 (((raw_temp = 원시 ()) <0));
(; 내가 <TEMPERATURE_SAMPLES; 난 + + int는 I = 0) {용
판독 [I] = raw_temp;
}
}

INT InternalTemperatureSensor :: in_lsb () {
INT readings_dup [TEMPERATURE_SAMPLES];
INT raw_temp;
/ /이 샘플을 기억
IF ((raw_temp = 원시 ())> 0) {
판독 [POS] = raw_temp;
POS + +;
POS의 % = TEMPERATURE_SAMPLES;
}
/ / 샘플을 복사합니다
(; 내가 <TEMPERATURE_SAMPLES; 난 + + int는 I = 0) {용
readings_dup [I] = 판독 [I];
}
배열의 엔드에 / / 버블 극단
INT extremes_count = TEMPERATURE_SAMPLES / EXTREMES_RATIO;
INT 스왑;
버블 정렬의 반복 {/ / 퍼센트 Q - 정렬보다 빠르고 소규모의 N 작동 (; 전 <extremes_count + + I INT I = 0)에 대한
{, -, (J + + 1 J <TEMPERATURE_SAMPLES INT J = 0)에 대한
IF (readings_dup [전]> readings_dup [I +1]) {니가 멋진 원하신다면 /이 / 3 XORs없이 스왑 다 수
스왑 = readings_dup [I];
readings_dup [I] = readings_dup [전 1];
readings_dup [내가 1] = 교환;
}
}
}
/ / 평균 배열의 한가운데
INT sum_temp = 0;
(; -; I + + extremes_count 전 <TEMPERATURE_SAMPLES INT I = extremes_count) {용
sum_temp + = readings_dup [I];
}
; - sum_temp /을 (extremes_count * 2 TEMPERATURE_SAMPLES) 반환
}

INT InternalTemperatureSensor :: in_c () {
in_k () 반환 - 273을;
}

INT InternalTemperatureSensor :: in_f () {
in_c를 (반환) * 5분의 9 + 32;
}

INT InternalTemperatureSensor :: in_k () {
in_lsb를 (반환) + 오프셋;! / / simplicty 위해 나는 K에게 = 1을 사용하고 당신이 K를 원한다면, 다음 라인을 사용 = 1.0
/ / 리턴 (INT) (in_lsb () * 계수) + 오프셋;
}

{) (INT InternalTemperatureSensor :: 원료
IF (ADCSRA & _BV (ADSC)) {
-1을 반환;
} 또 {
INT RET = ADCL | (ADCH << 8), / /​​는 이전 변환 결과를 가져오기
ADCSRA | = _BV (ADSC); / / 새로운 변환을 시작합니다
RET 반환;
}
}

공극 InternalTemperatureSensor :: 인쇄 () {
Serial.print ( "> R :");
Serial.print (원시 (), 12);
Serial.print ( "L :");
Serial.print (in_lsb (), 12);
Serial.print ( "K :");
Serial.print (in_k (), 12);
Serial.print ( "C :");
Serial.print (in_c (), 12);
Serial.print ( "F :");
Serial.print (in_f (), 12);
Serial.println ( "#");
}

사용법

InternalTemperatureSensor 온도 (1.0 TEMPERATURE_ADJUSTMENT가); / / 1.0 인수는 기본적으로 무시되고, c'tor 주석을 참조하십시오
공극 설치 () {
temperature.init (); 당신 ADCSRA 또는 ADMUX를 수정 후 / /이 설정 또는 매 시간에) (INIT 전화
}

공극 루프 () {
/ / temperature.print (); / / 주석이 직렬 연결을 통해 센서 출력을 디버깅하기
INT war_sensor_data = temperature.raw (); / / 이것은 거의 사용 가능한 센서 출력을 반환
온도 / / 이것은 반품 더 가능한 온도가 섭씨; = temperature.in_c () temperature_in_celsius INT
}

설명

ATtinyX5는 내부 센서로부터 데이터를 읽기 위해 ADC4을 사용합니다. () 초기화 메서드에서 레지스터로 필요한 모든 마법은이 데이터를 읽기 위해 시스템을 준비하기위한 것입니다. 이 방법은 당신이 온도 센서 데이터를 가져오기위한 ADMUX 및 ADCSRA를 구성할 때마다 호출해야합니다. 당신의 프로그램에서 사용할 수있는 유일한 ADC 채널 온도 센서의 ADC4 경우 다음에만, 즉 한 번) (그것 설정에서 호출해야합니다. 이것은 적어도 계수 둘씩 온도 판독 절차 시간을 줄일 수 있습니다.

() InternalTemperatureSensor :: 원시 메소드는 센서의 원시 데이터를 반환합니다. 불행히도이 데이터 겨우 쓸만합니다. 문제를 설명하기 위해서는 InternalTemperatureSensor의 출력에서​​ 찾아 :: print ()를 디버그 방법을 가져가라. 첫 번째 열에는 어떤 센서를 반환합니다. 출력 속도는 2 초 이내에 센서가 18도 차이로 값을 반환하므로 초당 약 5 행이다.

ATtiny85 Internal Temperature Sensor Readouts

ATtiny85 내부 온도 센서 설치 했어요


이 데이터를 더 사용 가능한 메소드 InternalTemperatureSensor :: in_lsb은 평균 압연 않습니다를 만들고 입력에서 극단을 제거하기 위해. L로 표시 in_lsb 출력 : 당신이 위의 그림에서 볼 수있는 결과는 방법이 더 쓸만합니다. 그건 너무 더 정확한이야. 당신은 압연 평균 매개 변수를 조정할 수 있지만, 전반적인 나는 TEMPERATURE_SAMPLES 20 미만 50 이상이 제작하지 않는 것이 좋습니다. 그것이 20 미만이라면 그때 편차가 크게 자랍니다. 50 TEMPERATURE_SAMPLES가 큰 만드는 것은 정밀하지만, 폐기물 메모리를 개선하고 계산 속도가 느려집하지 않습니다. 또한 EXTREMES_RATIO이 처단한다 얼마나 극단적인 가치의 정의 2 (모든 값을 제거하는 것이다)보다 덜하지 않습니다. 샘플에서 극단을 제거 방지 효과가 더 TEMPERATURE_SAMPLES 이상을 것이다 만들기.
이들 세 핵심 방법 이외에 몇 가지 유틸리티 메서드 in_c (), in_k ()를, in_f ()가 제공됩니다. 그들은 화씨와 Kelvins, 섭씨 도의 온도에서 온도를 반환합니다.

내부 센서와 한 번 더 문제는 그것이 교정되지 않은 것으로이므로 각 칩에 대해 당신은 독서를 출력하여 보정된 온도계로 그 가치를 일치하도록 생성자의 두 번째 매개 변수를 조정하는 인쇄 () 메서드를 사용해야합니다. 소스 코드에서 값 -13 내 ATtinies 중 하나에 대해서만 작동합니다, 그것이 다른 사람을 위해 일한다고 보장은 없습니다.
전체적으로 내부 센서를 사용할 수 있지만부터 많은 기대하지 않습니다. 외부 센서는 여전히 훨씬 더 있습니다.

이 게시물에 게시된 하드웨어 , 로보틱스 .

코멘트가 없습니다

지금까지 코멘트가 없습니다

회신을 남겨주

사이트맵 (다) 안드레이 Mikhalchuk, 2005년부터 2008년까지