#define F_CPU 16000000UL // CPU 주파수 16MHz
#include <avr/io.h>
#include <util/delay.h>
void PWM_init() {
// Fast PWM 모드, 비반전 모드 설정
TCCR0A |= (1 << WGM00) | (1 << WGM01); // Fast PWM 모드
TCCR0A |= (1 << COM0A1); // 비반전 모드 (Clear OC0A on Compare Match)
TCCR0B |= (1 << CS01); // 프리스케일러 8
DDRD |= (1 << PD6); // PD6 (OC0A 핀) 출력으로 설정
}
void setMotorDirection(uint8_t direction) {
if (direction == 1) {
// 모터 시계방향 회전 (IN1 = HIGH, IN2 = LOW)
PORTD |= (1 << PD2);
PORTD &= ~(1 << PD3);
} else if (direction == 0) {
// 모터 반시계방향 회전 (IN1 = LOW, IN2 = HIGH)
PORTD &= ~(1 << PD2);
PORTD |= (1 << PD3);
}
}
void setMotorSpeed(uint8_t speed) {
// 모터 속도를 0~255의 값으로 설정 (PWM 듀티 사이클 조정)
OCR0A = speed;
}
int main(void) {
DDRD |= (1 << PD2) | (1 << PD3); // PD2, PD3을 출력으로 설정 (모터 방향 제어)
PWM_init(); // PWM 초기화
while (1) {
setMotorDirection(1); // 시계 방향
setMotorSpeed(128); // 속도 50% (128/255)
_delay_ms(2000); // 2초 대기
setMotorDirection(0); // 반시계 방향
setMotorSpeed(128); // 속도 50% (128/255)
_delay_ms(2000); // 2초 대기
setMotorSpeed(0); // 모터 정지
_delay_ms(1000); // 1초 대기
}
}