반응형
#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나 다른 부하를 연결하여 테스트할 수 있습니다.
반응형
'임베디드 용어설명' 카테고리의 다른 글
MicroSD카드 회로도, DET핀 연결 방법 (0) | 2023.07.21 |
---|---|
DDR5, DDR4, DDR3, DDR2, DDR의 사용 전압과 속도, 핀 비교 호환성은? (0) | 2023.07.20 |
다이오드의 종류와 특성(다이오드,쇼트키다이오드,제너다이오드) (2) | 2022.12.26 |
JLCPCB VIA 홀 옵션에대한 설명(tented,untented,plugged,…) (0) | 2022.12.23 |
라즈베리파이 pi 로그인이 안됨 해결방법.(Bullseye 버전 이후 default ID 삭제) (0) | 2022.09.20 |