임베디드 용어설명

Atmega128 PWM 예제코드

젊은우산 2023. 2. 24. 10:28
반응형

#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 16000000UL // 클럭 주파수
#define PWM_FREQ 50 // PWM 주파수
#define PWM_DUTY_CYCLE 50 // PWM 듀티 사이클 (0-100)

void PWM_init() {
  TCCR1A |= (1 << COM1A1) | (1 << WGM11); // 비반전 모드, Fast PWM 모드
  TCCR1B |= (1 << WGM12) | (1 << WGM13) | (1 << CS11); // Fast PWM 모드, 분주비 8
  ICR1 = F_CPU / (PWM_FREQ * 8) - 1; // TOP 값 설정
}

int main() {
  DDRB |= (1 << PB5); // OC1A 핀을 출력으로 설정
  PWM_init(); // PWM 초기화

  while(1) {
    OCR1A = (ICR1 + 1) * PWM_DUTY_CYCLE / 100; // 듀티 사이클 설정
    _delay_ms(20); // 일정 시간 지연
  }

  return 0;
}

    ATMega128 마이크로컨트롤러에서 PWM을 구현하는 예제 코드입니다. 이 코드는 Timer/Counter1을 사용하여 PWM을 구현하며, OC1A 핀을 사용하여 출력합니다.

    이 코드에서 PWM_init() 함수는 Timer/Counter1 레지스터를 초기화하고, ICR1 레지스터를 사용하여 PWM 주파수를 설정합니다. main() 함수에서는 OC1A 핀을 출력으로 설정하고, OCR1A 레지스터를 사용하여 PWM 듀티 사이클을 설정합니다. 듀티 사이클은 PWM_DUTY_CYCLE 변수에 저장된 값으로 설정됩니다. 이 코드에서는 50% 듀티 사이클로 설정되어 있습니다.

    코드 실행시 20ms 마다 OCR1A 값이 변경되며, 이 값에 따라 출력이 변화하여 PWM이 생성됩니다. 이 예제 코드는 PB5 핀을 PWM 출력으로 사용하며, 이 핀에 LED나 다른 부하를 연결하여 테스트할 수 있습니다.

반응형