https://github.com/Rhkacl/fan_project.git

세미콘 4팀 프로젝트 ppt.pdf

코드 QR

코드 QR

영상 QR

영상 QR

IMG_5792.png

void apMain() // add servo toggle mode
{
	    uint8_t buttonData, prevButtonData;

    DDRA = 0xff; // FND
    DDRB |= (1 << PB4) | (1 << PB5);
    DDRD = 0xff; // LED
	
		// button 입력 설정 ( GPORT ) 
    DDRG &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4));

    // Fan: Timer0 (8bit fast pwm, 256분주)
    TCCR0 |= (1 << WGM00) | (1 << COM01) | (1 << WGM01) | (1 << CS02);

    // Servo: Timer1 (16bit fast pwm, TOP -> ICR1, 64분주, 주기 = 20ms = 50Hz)
    TCCR1A |= (1 << COM1A1) | (1 << WGM11);
    TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
    ICR1 = 4999; // TOP 값 (16MHz/64 = 250kHz, 250kHz/5000 = 50Hz -> 20ms주기)
    // OCR1A = 2500;

    uint8_t sevo_state = 0;    // 서보 모터 동작 상태 ( 0 = OFF, 1 = ON )           
    int sevo_count = 0;        // 서보 위치 값 (PWM duty 조절용)

    while (1)
    {
        buttonData = PING;   // 현재 버튼 입력 읽기

				// 서보 동작 루프
        if (sevo_state == 1) // 서브모터 활성화 1, 비활성화 0
        {
            static int direction = 1; // 1이면 증가, -1이면 감소
  
            if (sevo_count >= 600) // 최대 도달 시 방향 전환
                direction = -1;

            else if (sevo_count <= 100) // 최소 도달 시 방향 전환
                direction = 1;

            OCR1A = sevo_count;          // 서보 모터 위치 설정
            sevo_count += direction ; // 방향에 따라 증가 또는 감소 (속도 조절)
            _delay_ms(10);               // 10ms 대기 (서보 동작 딜레이)
        }

        // 버튼 1
        if ((buttonData & (1 << 0)) == 0)
        {
            PORTA = 0x06; // 1
            PORTD = 0x03; 
            OCR0 = 100;   // 약풍
        }

        // 버튼 2
        if ((buttonData & (1 << 1)) == 0)
        {
            PORTA = 0x5B; // 2
            PORTD = 0x1f;
            OCR0 = 178;   // 중풍
        }

        // 버튼 3
        if ((buttonData & (1 << 2)) == 0)
        {
            PORTA = 0x4F; // 3
            PORTD = 0xff;
            OCR0 = 255;   // 최대속도
        }

        // 버튼 4 ( 선풍기 회전 : servo Toggle )
        if (((prevButtonData & (1 << 3)) != 0) && ((buttonData & (1 << 3)) == 0))
        {
            sevo_state = !sevo_state; // 토글
        }

				// 버튼 5 ( 전체 정지 )
        if ((buttonData & (1 << 4)) == 0)
        {
            PORTA = 0x00;
            PORTD = 0x00;
            OCR0 = 0;
            sevo_state = 0;
        }

        prevButtonData = buttonData; // 이전 상태 저장
        _delay_ms(1);
    }
}