BASIC4MCU | 질문게시판 | Atmega128 PORTB에서 서보모터와 부저 사용 관련 질문
페이지 정보
작성자 ynbus 작성일2023-12-17 00:51 조회765회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=23599
본문
Atmega128에서 서보모터, 초음파센서, 부저, LED를 사용하고 있습니다.
1. 초음파센서를 통해 일정 거리가 감지되면 모터가 동작하고 LED가 한칸 켜집니다.
2. 일정 시간마다 부저가 1초정도 울립니다.
PB5,PB6에서 서보모터를 각각 연결했고,
초음파센서는 PD0에 에코, PE4에 트리거를 연결했습니다.
그리고 제 보드의 PORTA에는 LED가 연결되어 있고, PB4에 버저가 연결되어있습니다.
현재 1번은 정상적으로 동작하나, 2번을 어떻게 구현해야 할 지 모르겠습니다.
우선 모터 동작시 같이 버저를 울리게라도 해보려고 아래와 같이 코드를 구성하였으나, 버저에서 틱 하는 아주 작은 소리가 날 뿐 정상적으로 울리지 않습니다.
버저 테스트용 코드만 동작시 정상적으로 울리기에 하드웨어적인 문제는 아닙니다.
도저히 어떻게 할 지 모르겠습니다. 정중히 부탁드립니다 (__)
아래는 제 코드입니다.
#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_sel[4] = {0x01, 0x02, 0x04, 0x08};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); // 7세그먼트에 값을 출력PORTG = fnd_sel[i]; // 선택된 자리의 FND를 활성화_delay_ms(2);if(i%2)_delay_ms(1);}}void RC_Motor(int angle){ // angle : -90도 ~ +90도OCR1B=OCR1A=angle*19+2999; // 서보모터의 각도를 조절하기 위해 PWM 값을 설정}ISR(TIMER0_COMP_vect){ // 1msstatic 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(){int dist;DDRB=0x70; // PB5, PB6을 출력으로 설정 (서보모터 제어)DDRB |= (1 << DDB4); // PB4를 출력 모드로 설정DDRC=0xFF; // 7세그먼트에 출력을 위한 포트 설정DDRG=0x0F; // 7세그먼트 자릿수 선택을 위한 포트 설정DDRE=0x10; // 초음파 센서 트리거 핀 설정 (출력)TCCR0=0x0D; // 타이머0 설정 (1ms마다 인터럽트 발생)OCR0=124; // 타이머0의 비교값 설정TIMSK=2; // 타이머0의 비교 인터럽트 활성화TCCR1A=0xA2; // 타이머1A, 1B를 PWM 모드로 설정TCCR1B=0x1A; // 타이머1 분주비 설정ICR1=39999; // PWM 주기 설정//SREG=0x80; // 전역 인터럽트 활성화TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|(1<<CS22); // 타이머2 초기화, 비반전 PWM 모드, 분주비 64OCR2 = 128; // 듀티 사이클 50%DDRB |= (1<<PB4); // PB4를 출력으로 설정합니다.DDRA = 0xff; // 포트 A를 출력 포트로 사용unsigned char count = 0x01;sei();while(1){_delay_ms(6000);_delay_ms(6000);PORTA = count; // LED에 숫자 표시PORTE|=0x10; _delay_us(100); PORTE&=~0x10; // 초음파 센서에 트리거 신호를 보냄_delay_ms(15);TCNT3=0; TCCR3B=(1 << CS31) | (1 <<CS30); // 타이머3를 시작하여 에코 시그널의 길이를 측정while(!(PIND& (1 << PIND0))); // 에코 시그널이 시작될 때까지 대기//TCCR3B=0x02;while(PIND&(1 << PIND0)); TCCR3B=0; // 에코 시그널이 끝날 때까지 대기dist=(unsigned int)(TCNT3 / 34 * 12 ); // 에코 시그널의 길이를 거리로 변환 (cm)display_fnd(dist); // 거리를 7세그먼트에 표시if(dist<100) {PORTB |= (1<<PB4); // PB4 HIGH, 부저 ON_delay_ms(1);RC_Motor(-90);count <<= 1; // count 1 증가_delay_ms(1500);RC_Motor(0);PORTB &= ~(1<<PB4); // PB4 LOW, 부저 OFF}//else RC_Motor(0); // 거리에 따라 서보모터를 제어_delay_ms(1000);volatile unsigned long i;for(i=0; i<100000; i++);}}
댓글 0
조회수 765등록된 댓글이 없습니다.