arduino PWM 주파수 변경

2018. 7. 20. 23:21HARDWARE/Arduino

Arduino Uno에서 PWM 을 사용할 수 있는 핀은 3,5,6,9,10,11 번 핀입니다. PWM의 default 주파수는 5,6번 핀의 경우 약 1kHz, 나머지 핀은 대략 500Hz 입니다. 하지만 모터의 속도를 제어하기 위해 1kHz 혹은 500Hz의 주파수를 사용한다면 소음이 굉장히 심합니다. 따라서 더 높은 주파수를 설정해야하는 경우가 많은데 그 방법에 대해 알아보겠습니다.

5,6번 핀은 TCCR0 레지스터, 9,10 번핀은 TCCR1 레지스터, 3,11 번핀은 TCCR2 레지스터로 설정하게 되어있습니다.

여기서 TCCRXA로는 FAST PWM 모드, Phase-correct PWM 모드를 선택할 수 있고 TCCRXB로는 prescale factor를 선택할 수 있습니다.

TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); 
Fast_PWM_frequency = (16 000 000)/(Prescale_factor*256); 

TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00); 
Phase_correct_PWM_frequency = (16 000 000)/(Prescale_factor*510);

             Setting                                  Prescale_factor
TCCR0B = _BV(CS00);                                 1
TCCR0B = _BV(CS01);                                 8
TCCR0B = _BV(CS00) | _BV(CS01);           64
TCCR0B = _BV(CS02);                               256

TCCR0B = _BV(CS00) | _BV(CS02);          1024


예를 들어 다음과 같이 선언을 하면 5번 6번핀의 PWM 주파수는 980Hz가 됩니다. 
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS00) | _BV(CS01);


또 다른 예로 다음과 같이 선언한다면 5,6번핀의 PWM 주파수는 31kHz가 됩니다.
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00); 
TCCR0B = _BV(CS00); 


[출처] PWM 주파수 변경|작성자 엠에스리