본문 바로가기
임베디드시스템/AVR

[AVR] 모터 속도제어 (선풍기)

by KHJ_940803 2021. 11. 9.

목표 :버튼을 이용하고 PWM을 조절하여 DC모터의 속도를 제어한다.

 

개발 툴 : atmel studio

 

개발 보드 : ATMEGA128A

 

PC Uart 통신 툴 : Comport master

 

개발 기간 : 2021년 9월 14일

 

소스코드

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
#include <avr/interrupt.h>   // interrupt 관련 lib가 들어 있다.
#include "uart0.h"
#include "button.h"

extern void UART0_transmit(char data);


#define DELAY 2000
// printf를 동작 시키위한 mapping작업
FILE OUTPUT = FDEV_SETUP_STREAM(UART0_transmit, NULL, _FDEV_SETUP_WRITE);

// 3번 timer / counter 를 설정
void pwm_init(void)
{
	// 핀을 출력으로 설정
	DDRE |= (1 <<0)|(1 <<2)|(1 <<5);	// 0b00100101;
	//모드 14 고속 pwm timer/counter 3번
	TCCR3A |=(1 << WGM30);
	TCCR3B |=(1 << WGM32);
	// 비반전 모드 TOP : 0xff 비교 일치 값 : OCR3C : PE5
	TCCR3A |=(1<<COM3C1);
	
	//분주비 64 : 16000000HZ / 64 ==> 250000HZ
	// 256 / 250000 == > 1.02ms , 약 1ms
	// 127/ 250000 ==> 0.5 ms
	TCCR3B |= (1<<CS31)|(1<<CS30); // 분주비 64
	OCR3C =0;
	
}

int main(void)
{
	pwm_init();
	button_Init();
	stdout = &OUTPUT;
	int count =0;
	int start_flag =1;
	int dir =0;
	int temp =0;

	while (1)
	{
		#if 0
		// 모터정지

		OCR3C =0;
		PORTE |= (1 <<0)|(1 <<2); //정지
		_delay_ms(DELAY*2);
		
		if((count%2)==0)   {
			PORTE &= (1 <<0)|(0 <<2); // 정방향
			OCR3C =127;	  // half speed
			_delay_ms(DELAY);
			OCR3C =255; // full speed
			_delay_ms(DELAY);
		}
		else
		{
			PORTE &= (0 <<0)|(1 <<2); // 역방향
			OCR3C =127;	  // half speed
			_delay_ms(DELAY);
			OCR3C =255; // full speed
			_delay_ms(DELAY);
		}
		count++;
		
		#else
		if(getButton1State())
		{
			if((start_flag%2) ==0){
				OCR3C = 0;
				PORTE |= 0b00000101;  //PE0:1 PE2:1 정지
				
			}
			else
			{
				PORTE &= 0b1111011;
				PORTE |= 0b0000001;
				OCR3C = 130;
			}
			start_flag++;
		}
		
		else if(getButton2State())
		{	 temp =OCR3C;
			if ((temp+20)<251) {
			OCR3C+=20;
			}
			else  OCR3C =250;
		}
		else if(getButton3State())
		{		temp =OCR3C;
			if ((temp-20)>49) {
				OCR3C -=20;// 0.5ms
			}
			else   OCR3C =50;
			
		}
		else if(getButton4State())
		{
			if(dir == 0)
			{
				PORTE &= 0b11111110;
				PORTE |= 0b00000100;
				dir = 1;
			}
			else if(dir == 1)
			{
				PORTE &= 0b11111110;
				PORTE |= 0b00000001;
				dir = 0;
			}

		}
		
		#endif
	}
}

uart0.h , button.h 는 

각각 https://khj-940803.tistory.com/2 , https://khj-940803.tistory.com/4  참고

 

동작 동영상

https://youtu.be/XpSPdrvTJw4

 

댓글