Fogeaters, Light The World.

14

2016-Jan

AVR 타이머 응용 여러 PWM 방식과 예제

작성자: title: MoonBlonix IP ADRESS: *.148.87.98 조회 수: 1651

출처 : http://mulgu.kr/entry/atmega-PWM-%EC%98%88%EC%A0%9C
출처 : http://mulgu.kr/entry/PWM
출처 : http://binworld.kr/45
출처 : http://binworld.kr/50


Blonix 첨언 : 정밀할 필요가 있으면 하드웨어 pwm 쓰는게 좋은데, 사실 그냥 왠만하면 오버플로우나 비교매치같은 소프트웨어 pwm 으로도 충분하다. 하드위에 pwm(CTC토글, fast PWM, phase correct PWM) 은 사용 가능한 포트도 굉장히 적기 때문. PB3,4,5 이 세개였던 것 같은데 자세한 사항은 데이터 시트를 참고하기 바란다.

그리고 모터를 돌린다면 대충 20kHz 쯤 쓰면 된다. 다만 모터의 전원에 넣는게 아니라 모터드라이브의 Enable 핀에 물려주는 pwm이라면 해당 모터드라이브의 데이터시트를 참고해서 넣어주자. L293D 의 경우 최대 5kHz까지 인식한다고 한다. -> (대충 1kHz쯤 넣으면 되지 않을까. 다만 드라이버가 아니라 모터 전원에 직접 넣는경우 20kHz 밑으로 내려가면 가청주파수라서 소음이 발생할 수 있다 '카더라')
(아두이노의 analogWrite 가 대부분 490Hz, 그 중 두 개의 핀에서는 980Hz(맞나?)를 사용한다고 한다)

서보모터 시그널의 경우 30~50Hz 정도에서 입력을 받는다. 대충 한 40이나 45Hz쯤 쓰면 될거다.

모터에 사용할 pwm에는 정밀한 하드웨어 pwm이 필요 없다.
어차피 모터의 속도는 pwm을 아무리 정밀하게 줘도 외부 환경에 따라 달라진다. 모터에 있어 정밀함이 필요하다면 엔코더를 달아라.
계산기는 http://fogeaters.cafe24.com/xe/board11/12374 여기 댓글에 첨부해둠


1. GPIO방법

DDRA.0=1; // out
while(1){

  PORTA.0=1; delay_us(50); PORTA.0=0; delay_us(50);

}

장점 : 임의의 포트에 출력 할 수 있습니다.

단점 : 다른 코드가 존재하는 경우 주파수를 맞추기 어렵습니다.

Blonix 첨언 : 이딴거 쓰면 안된다. 쓰지 마라.. 그리고 delay_us 쓰기 위해서는 delay 헤더를 포함시켜야 한다.




2. (비교매치)타이머 인터럽트를 사용하는 방법

오버플로우 인터럽트를 사용 할 수도 있으나 비교매치 인터럽트가 정확합니다.


Blonix 첨언 : 아래 코드는 pwm 이 아니라 비교매치 인터럽트로 0.5초마다 LED 깜박이는 코드다.

하지만 뭐 응용하면 그게 그거니까 알아서 잘 응용해 쓰도록.

K-20160114-357321.png

K-20160114-357546.png 1

K-20160114-357659.png


장점 : 임의의 포트에 출력 할 수 있습니다.

단점 : 다른 인터럽트가 존재하는 경우 주파수 오차가 발생합니다.




Blonix 첨가 부분--------------

3. 오버플로우 인터럽트 사용 - 보통 pwm보다는 일반적인 타이머/카운터로 많이 쓰인다. 근데 쓰기는 쉽다.


K-20160114-362169.png

K-20160114-362325.png

K-20160114-362538.png


장점 : 쓰기 편함. 아무 핀이나 다 됨? 될껄?

단점 : 비교매치보다는 부정확하다 '카더라'




4. CTC 토글모드를 사용하는 방법

    DDRB.5=1; // out
    TCCR1A=0x40; TCCR1B=9; TCCR1C=0x80; OCR1A=799//16000000/ 1/(1+799)=20KHz=50us
장점 : 정확한 주파수를 출력

단점 : 특정핀에서만 출력이 가능, 50% 듀티만 가능




5. FAST PWM 출력을 사용하는 방법

    DDRB=0x20;   // PB5 out
    TCCR1A=0x82; TCCR1B=0x1A
// FAST PWM, 16Mhz/8분주=0.5usec
    OCR1A=99; ICR1=199
// 0.5usec*(1+199)=100usec=10KHz

장점 : 정확한 주파수를 출력, 임의의 듀티도 가능

단점 : 특정핀에서만 출력이 가능




위에서 1+799 라든가 1+199라고 적은 것은

0~799, 800 

0~199, 200

0~99, 100

카운터가 0부터 시작하기 때문에 1 적은 수를 넣어줘야지 정확한 카운트가 됩니다.

 

다른 종류의 PWM이 한가지 더 있지만 생략합니다.


Blonix 첨언 : 생략한 방식은 Phase Correct PWM 인 것 같다. 여기에 대한 정보를 퍼오자면..

필요할 경우 알아서 검색해 찾아보고 사용해본 다음 댓글에 추가하도록.


 Fast PWM Mode (고속 PWM)

 다른 PWM 모드에 비하여 약 2배의 주파수를 갖는다.

 단순한 PWM 제어에 사용


 Phase Correct PWM Mode (PC PWM)

 Fast PWM 모드에 비하여 ½로 낮은 주파수

 2배로 높은 분해능의 PWM 출력 신호를 발생

 고정된 주파수에서 아주 가끔 듀티를 가변하는 정도의 PWM 동작에 적합

profile

title: MoonBlonix

2016.01.14 10:16
*.148.87.98

Fast PWM, Phase Correct PWM 예제 및 설명 추가


* 아래와 같은 하드웨어 PWM 은 출력가능한 포트가 정해져 있다. 그러니까 데이터시트를 찾아보던지 검색하던지 알아서 확인해볼 것. B3,4,5 였던 것 같다


출처 : http://binworld.kr/56


K-20160114-368085.png

K-20160114-368241.png

K-20160114-368370.png

첨부
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 [Web] 클라우드 IDE + 2 title: MoonBlonix 2017-06-25 15128
32 [AVR] HC_SR04 초음파센서 사용 file title: MoonBlonix 2016-02-13 1669
31 [AVR] 피에조 부저 활용 file + 1 title: MoonBlonix 2016-02-12 1956
30 칼만필터(Kalman Filter) + 2 title: MoonBlonix 2016-02-11 4377
29 low pass filter, high pass filter (저역통과필터, 고역통과필터) file title: MoonBlonix 2016-02-11 1456
28 [AVR] 루프 실행시간 측정 (아두이노의 Millis(), Micros() 분석) title: MoonBlonix 2016-02-09 1456
27 상보필터(Complementary Filter) file title: MoonBlonix 2016-02-09 1739
26 가속도, 자이로 센서에 대해 title: MoonBlonix 2016-02-09 1572
25 [AVR] UART 통신 file title: MoonBlonix 2016-02-07 1608
24 C++ 과 C 를 같은 프로젝트에서 사용하기 title: MoonBlonix 2016-02-07 1506
23 라즈베리파이 운영체제에 관하여 title: MoonBlonix 2016-02-05 1459
22 [리눅스] 기본 명령어 title: MoonBlonix 2016-02-05 1632
21 [리눅스] C 언어 개발환경 구축 title: MoonBlonix 2016-02-05 1864
20 라즈베리파이 GPIO 핀 배열 file title: MoonBlonix 2016-02-05 2060
19 C++ 멤버 함수 포인터 title: MoonBlonix 2016-01-23 1775
18 AVR 직접만든 DC모터 라이브러리 (C++ Class) file title: MoonBlonix 2016-01-16 1518
17 [AVR] I/O 포트 메뉴얼 (ATMega128) file title: MoonBlonix 2016-01-16 1594
16 AVR delay 함수 (_delay_ms, _delay_us) title: MoonBlonix 2016-01-15 1641
15 AVR 멀티채널 PWM (타이머 하나로 여러 PWM 구동) title: MoonBlonix 2016-01-15 1651
14 AVR 초패스트 PWM title: MoonBlonix 2016-01-14 1565
» AVR 타이머 응용 여러 PWM 방식과 예제 file + 1 title: MoonBlonix 2016-01-14 1651