BASIC4MCU | 질문게시판 | hc-05 블루투스와 가스센서 서브모터(sg-90) 코드
페이지 정보
작성자 wwqa 작성일2024-04-29 01:50 조회563회 댓글0건본문
hc-05 블루투스와 가스센서 서브모터(sg-90) 코드를 합치니깐 서브모터가 작동을 안합니다 이유가 뭘까요?
이게 따로 따로 분리해서 (가스센서에 서브모터를 실행할때)는 서브모터가 잘 작동 되는데 이게 블루투스 코드랑 합치면 서브모터가 계속 먹통이네요 ... 부탁드립니다!
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
// ADC 초기화
void ADC_Init(){
ADMUX=(1<<REFS0); // AVCC를 전압 참조로 사용
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ADC 활성화 및 분주비 설정
}
// ADC 채널에서 읽기 (0~7), 포트 F0에 가스센서 연결
unsigned int readADC(unsigned char channel){
ADMUX = (ADMUX & 0xF8)|channel; // 채널 선택, 포트 F0에 연결된 가스센서 사용
ADCSRA |= (1<<ADSC); // 변환 시작
while(ADCSRA & (1<<ADSC)); // 변환 완료 대기
return ADCW; // ADC 값 읽기
}
// PWM 초기화 및 서보모터 제어를 위한 설정
void PWM_Init(){
// 타이머 1을 사용하여 PWM을 설정
TCCR1A = (1<<COM1A1)|(1<<WGM11); // 고급 PWM 모드 설정
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS11); // 분주비 설정: 8
ICR1 = 19999; // 20ms 주기 설정 (16MHz 클럭에서 분주비 8 사용)
}
// USART 초기화
void USART_Init(void){
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0;
UBRR0L=103;
}
// 서보 모터를 특정 각도로 회전
void rotateServo(unsigned int pulse_width){
OCR1A = pulse_width; // OCR1A에 펄스 너비 설정
}
void main(void) {
unsigned int smoke;
char ch;
ADC_Init(); // ADC 초기화
PWM_Init(); // PWM 및 서보 모터 제어 초기화
USART_Init(); // USART 초기화
DDRB = 0xFF; // 포트 B를 출력으로 설정
while(1) {
// 가스 센서 값 읽기
smoke = readADC(0); // ADC0 (포트 F0) 채널에서 연기 감지 값 읽기
if(smoke > 120) { // 예시 임계값
rotateServo(650); // 연기가 감지되면 서보 모터를 90도로 회전
} else {
rotateServo(375); // 연기가 감지되지 않으면 서보 모터를 0도로 회전
}
// 시리얼 통신으로 명령 받기
if(UCSR0A & (1<<RXC0)){
ch = UDR0; // 데이터 수신
if(ch == 'o'){
rotateServo(650); // 90도
} else if(ch == 'x'){
rotateServo(100); // 0도
}
}
delay_ms(1000); // 반복 사이의 지연
}
}
댓글 0
조회수 563등록된 댓글이 없습니다.