ATMEGA128 Motor 제어 실험

2023. 6. 1. 01:12Embedded/마이크로프로세서

728x90
  • Motor 1
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL

unsigned char SEG[16] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

void Initial_set(){
	DDRF = 0xFF;
	PORTF = 0xC0;

	DDRB |= 1<<DDB0;
	PORTB &= ~(1<<PB0);

	DDRC = DDRC & ~(1<<DDC7) | 1<<DDC4 | 1<<DDC5 ; 
	PORTC = PORTC | 1<<PC7 | 1<<PC4 | 1<<PC5;
}
void Forward_motor()
{PORTC = PORTC & ~(1<<PC5) | 1<<PC4;}

void Reverse_motor()
{PORTC = PORTC | 1<<PC5 & ~(1<<PC4);}

void Stop_motor()
{PORTC = PORTC & ~(1<<PC5) & ~(1<<PC4);}

int main(){
	int i = 0;		
	unsigned char temp;
	Initial_set();
	while(1){
		if(((PINC & 1<<PC7) >> PC7) ==0){
			_delay_ms(1);
			while(((PINC & 1<<PC7) >> PC7) != 1){
				_delay_ms(1);
			}
			temp = PORTF = SEG[i++];
			if (i>=16) i= 0;
		}
		switch(temp){
		case 0x88 : 
				Reverse_motor();
				break;
		case 0x8E : 
				Forward_motor();
				break;
		default:
				Stop_motor();
				break;
		}
	}
}
  • 코드설명
DDRF = 0xFF;
PORTF = 0xC0;

DDRB |= 1<<DDB0;
PORTB &= ~(1<<PB0);

DDRC = DDRC & ~(1<<DDC7) | 1<<DDC4 | 1<<DDC5 ; 
PORTC = PORTC | 1<<PC7 | 1<<PC4 | 1<<PC5;

입출력포트 및 초기조건(FND 표시:0 Motor: 정지)

Bit 7 6 5 4 3 2 1 0
DDRF DDA7 DDA6 DDA5 DDA4 DDA3 DDA2 DDA1 DDA0
1 1 1 1 1 1 1 1
PORTF  PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
1 1 0 0 0 0 0 0
Bit 7 6 5 4 3 2 1 0
DDRB DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0
0 0 0 0 0 0 0 DDB0
PORTB PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
PB7 PB6 PB5 PB4 PB3 PB2 PB1 0
Bit 7 6 5 4 3 2 1 0
DDRC DDA7 DDA6 DDA5 DDA4 DDA3 DDA2 DDA1 DDA0
0 0 1 1 0 0 0 0
PORTC PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
1 0 1 1 0 0 0 0

 

if(((PINC & 1<<PC7) >> PC7) ==0){
			_delay_ms(1);
			while(((PINC & 1<<PC7) >> PC7) != 1){
				_delay_ms(1);
			}
			temp = PORTF = SEG[i++];
			if (i>=16) i= 0;
		}
Bit 7 6 5 4 3 2 1 0
PINC PINC7 PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0
1<<PC7 1 0 0 0 0 0 0 0
& PC7 0 0 0 0 0 0 0
*>>PC7 0 0 0 0 0 0 0 PINC7

PINC에는 푸쉬버튼을 연결하여 푸쉬버튼을 누를 시 if문의 ()true값이 되어 { }안의 내용을 실행.

 

void Forward_motor()
{PORTC = PORTC & ~(1<<PC5) | 1<<PC4;}

void Reverse_motor()
{PORTC = PORTC | 1<<PC5 & ~(1<<PC4);}

void Stop_motor()
{PORTC = PORTC & ~(1<<PC5) & ~(1<<PC4);}

- 사용자정의 함수:Forward_motor(), Stop_motor(), Reverse_motor()

- 동작조건 :

  PC4 PC5 사용자 함수
정회전 1 0 Forward_motor()
정지 0 0 Stop_motor()
역회전 0 1 Reverse_motor()

Forward_motor()

Bit 7 6 5 4 3 2 1 0
PORTC PORTC7 PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0
~(1<<PC4) 1 1 1 0 1 1 1 1
& PC7 PC6 PC5 0 PC3 PC2 PC1 PC0
1<<PC5 0 0 1 0 0 0 0 0
| PC7 PC6 1 0 PC3 PC2 PC1 PC0

Reverse_motor()

Bit 7 6 5 4 3 2 1 0
PORTC PORTC7 PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0
~(1<<PC5) 1 1 0 1 1 1 1 1
& PC7 PC6 0 PC4 PC3 PC2 PC1 PC0
1<<PC4 0 0 0 1 0 0 0 0
| PC7 PC6 0 1 PC3 PC2 PC1 PC0

Stop_motor()

Bit 7 6 5 4 3 2 1 0
PORTC PORTC7 PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0
~(1<<PC4) 1 1 1 0 1 1 1 1
& PC7 PC6 PC5 0 PC3 PC2 PC1 PC0
~(1<<PC5) 1 1 0 1 1 1 1 1
& PC7 PC6 0 0 PC3 PC2 PC1 PC0

트렌지스터와 모터의 방향을 결정하는 PINC4PINC5는 각각의 사용자 지정함수에 따라 PINC4PINC5HIGH값과 LOW값이 달라져 모터방향 및 정지를 설정할 수 있다

 

 

switch(temp){
		case 0x88 : 
				Reverse_motor();
				break;
		case 0x8E : 
				Forward_motor();
				break;
		default:
				Stop_motor();
				break;
		}

temp = PORTF = SEG[i++]temp = 0x88은 세그먼트의 문자A, temp = 0x8E는 세그먼트의 문자F를 나타내게 구성.

이외의 문자에서는 Stop_motor() 함수를 실행하여 모터를 정지하게 구성.

 

'Embedded > 마이크로프로세서' 카테고리의 다른 글

ATMEGA128 포토인터럽트 제어 실험  (0) 2023.06.01
ATMEGA128 Roullette 모형 제어  (0) 2023.06.01
ATMEGA128 RELAY 제어 실험  (0) 2023.06.01
ATMEGA128 FND제어 실험  (0) 2023.06.01
ATMEGA128 LED 제어  (0) 2023.05.31