BASIC4MCU | 질문게시판 | 답변 : Atmega128 PORTB에서 서보모터와 부저 사용 관련 질문
페이지 정보
작성자 master 작성일2023-12-17 11:42 조회1,315회 댓글1건본문
#define F_CPU 1600000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
unsigned char digit[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67};
unsigned char fnd[4];
//
void display_fnd(unsigned int value){
int i;
fnd[3]=(value/1000)%10; fnd[2]=(value/100)%10;
fnd[1]=(value/10)%10; fnd[0]=(value/1)%10;
for(i=0;i<4;i++){ PORTC=digit[fnd[i]]|(i==1?0x80:0x00); PORTG=1<<i; _delay_us(2500); }
}
//
void RC_Motor(int angle){ // angle : -90도 ~ +90도
OCR1B=OCR1A=angle*19+2999; // 서보모터의 각도를 조절하기 위해 PWM 값을 설정
}
//
ISR(TIMER0_COMP_vect){ // 1ms
static unsigned char c=0;
PORTG=0;
PORTC=digit[fnd[c]]; if(c==1)PORTC|=0x80; // FND에 현재 자리의 숫자를 출력
PORTG=1<<c; // 다음 자리로 이동
if(++c>3) c=0;
}
//
int main(){
unsigned char count=0x01; int i,dist;
//
DDRA=0xff; // 포트 A를 출력 포트로 사용
DDRB=0x70; // PB5, PB6을 출력으로 설정 (서보모터 제어)
DDRB|=0x10; // PB4 부저
DDRC=0xFF; // 7세그먼트에 출력을 위한 포트 설정
DDRE=0x10; // 초음파 센서 트리거 핀 설정 (출력)
DDRG=0x0F; // 7세그먼트 자릿수 선택을 위한 포트 설정
TCCR0=0x0D; OCR0=124; TIMSK=2; // 1ms
TCCR1A=0xA2; TCCR1B=0x1A; ICR1=39999;
TCCR2=(1<<WGM20)|(1<<WGM21)|(1<<COM21)|(1<<CS22); OCR2=128; // 듀티 사이클 50% // 비반전 PWM 모드, 분주비 64
sei(); //SREG=0x80;
while(1){
_delay_ms(13000);
PORTA=count; // LED에 숫자 표시
PORTE|=0x10; _delay_us(100); PORTE&=~0x10; // 초음파 센서에 트리거 신호를 보냄
while(!(PIND&(1<<PIND0))); // 에코 시그널이 시작될 때까지 대기
TCNT3=0; TCCR3B=(1<<CS31)|(1<<CS30); // 타이머3를 시작하여 에코 시그널의 길이를 측정 //TCCR3B=0x02;
while(PIND&(1<<PIND0)); TCCR3B=0; // 에코 시그널이 끝날 때까지 대기
dist=(unsigned int)(TCNT3/34*12); // 에코 시그널의 길이를 거리로 변환 (cm)
display_fnd(dist); // 거리를 7세그먼트에 표시
if(dist<100){
RC_Motor(-90);
for(i=0;i<3000;i++){ PORTB^=0x10; _delay_us(500); } // PB4 부저
RC_Motor(0);
count<<=1; // count 1 증가
}
//else RC_Motor(0); // 거리에 따라 서보모터를 제어
}
}
//
for(i=0;i<3000;i++){ PORTB^=0x10; _delay_us(500); } // PB4 부저 // 1KHz 1500ms
_delay_ms(1500)을 for문으로 변경해서 1KHz로 만들면 위와 같이 됩니다.for(i=0;i<1000;i++){ PORTB^=0x10; _delay_us(500); } // PB4 부저 // 1KHz 500ms
for(i=0;i<2000;i++){ PORTB^=0x10; _delay_us(250); } // PB4 부저 // 2KHz 500ms
for(i=0;i<1000;i++){ PORTB^=0x10; _delay_us(500); } // PB4 부저 // 1KHz 500ms
500ms씩 주파수를 다르게 만들 수도 있습니다.
댓글 1
조회수 1,315ynbus님의 댓글
ynbus 작성일
감사인사를 먼저 드립니다.
사정상 당장 확인이 불가능하여, 내일 내지 모레 중으로 확인 후 다시 답장드리겠습니다 (__)