ATMEGA128 Motor 제어 실험
2023. 6. 1. 01:12ㆍEmbedded/마이크로프로세서
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 |
트렌지스터와 모터의 방향을 결정하는 PINC4와 PINC5는 각각의 사용자 지정함수에 따라 PINC4와 PINC5의 HIGH값과 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 |