 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 내부 온도 센서 설치 했어요 이 데이터를 더 사용 가능한 메소드 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 중 하나에 대해서만 작동합니다, 그것이 다른 사람을 위해 일한다고 보장은 없습니다. 전체적으로 내부 센서를 사용할 수 있지만부터 많은 기대하지 않습니다. 외부 센서는 여전히 훨씬 더 있습니다. 이 게시물에 게시된 하드웨어 , 로보틱스 . |