마음 속 하늘은 항상 맑음~!

아두이노로 ATTiny85의 타이어1 PWM 사용하기. 본문

하드웨어

아두이노로 ATTiny85의 타이어1 PWM 사용하기.

파르셀수스 2018. 10. 25. 10:18

 아두이노가 세상에 나온건 참 고마운 일이다. AVR 칩들의 프로그래밍을 더 쉽게 만들었다.

 돌아다니던 중에  8핀의 ATTiny85가 PWM 기능을 가진 것을 확인하고 그 기능이 정말 궁금했다.

 많은 인터넷 문서들을 읽은 후에야 그 기능을 제대로 사용할 수 있었다.


 일단 아두이노에서 ATTiny85를 사용하기 위해서는  ATTinycore라는 애드온을 넣어야 한다.

 그리고 소스 파일에 헤더를 넣고 평상시의 프로그래밍 그대로 코딩을 하면 된다.


 주의할 점은 핀 번호가 기존의 아두이노의 정의를 사용할 수 없다. 그리고 ADC 같은 경우에는 특별한 명칭의 A로 시작하는 번호를 analogRead에 사용해야 정상적으로 읽어올 수 있다.

 그리고 내부 헤더 소스파일의 정의를 보면 ATTiny85가 millis()나 delay()에 사용하는 타이머는 0번이다.


 동작 클럭은 1MHz로 하는게 좋은데, 만약 8MHz로 하려면 lfuse를 62 -> e2로 변경해야 한다. 개인적으로 쓰는 openprog가 fuse 셋팅을 지원하기는 하는데 이 div8을 fuse로 사용하면 인식이 안된다. 먹통이 되어버리는데 연속적으로 fuse를 62로 쓰기를 계속하면 다시 사용가능한 상태로 돌려진다.

 오래된 openprog 0.9.0 펌웨어와 0.9.1 컨트롤 프로그램으로는 HV 시리얼 프로그래밍이 지원되기는 하나 칩리스트 목록의 ATTiny85 설정으로 인식하지 못하는 바람에 ATTiny88로 설정해야 프로그램이 가능하다.


 ATTiny85는 타이머1은 특이하게 PLL 클럭을 소스로 PWM을 활성할 수 있다. 이 기능은 정말 놀라운게 128KHz(256KHz도 가능)의 PWM 클럭을 만들 수 있다. 컴퍼레이터의 약간의 설정 버그도 있는데 그 설정을 다 포함한 간단한 사용 코드는 아래와 같다.


  #define PWM PIN_B1


  pinMode(PWM, OUTPUT);

  // Timer1 PWM, 128KHz
  PLLCSR |= (1<<PLLE);
  while ((PLLCSR & (1<<PLOCK)) == 0x00)
    {
        // Do nothing until plock bit is set
    }
  PLLCSR |= (1<<PCKE);
  TCCR1 = (1<<CTC1)    |  // Enable PWM
          (1<<PWM1A)   |  // Set source to pck
          (1<<(CS11))  |  // PCK/2
          (1<<COM1A1);    // Clear the OC1A output line.
  GTCCR |= (1<<COM1B1);  // fix bug
  //TIMSK = (1<<OCIE1A) | (1<<TOIE1);
  OCR1A = 0;
  OCR1C = 255;


  OCR1A = 126;


 이는 6번 핀을 이용해서 PWM 클럭을 내보내는 코드로 다른 핀도 가능하다. 총 4개의 PWM이 가능하지만 3개만이 제대로 사용할 수 있다. 4개의 PWM을 모두 사용하면 6번핀은 타이머 오버플로우나 컴퍼레이터 인터럽트에서 핀의 신호를 처리해주어야 하는 번거로움이 있다. 하지만 예제와 같은 1개만이나 타이어0과 겹치지 않게 PWM을 사용하면 문제가 없다.


 여튼 대충 이렇게 PWM을 만들 수 있다.


 (추가) ATTinycore의 도움말에 설명되어 있기는 하지만, 이 타이머1의 PLL 클럭소스 방법은 2.7v 이하의 동작전압에서는 불안정하다. 그런 이유로 BOD를 2.7v로 설정하는게 좋을 수 있다.





'하드웨어' 카테고리의 다른 글

PinnaclePi 1.0.0.6  (0) 2018.11.23
하드디스크 스핀다운업 현상.  (0) 2018.11.20
M사 AM4 새로운 바이오스.  (2) 2018.02.04
메모리 그리고 온도 효과.  (0) 2017.11.30
window 10 FCU 버그.  (0) 2017.10.31