BASIC4MCU | 질문게시판 | 답변 : 서보모터 각도 멈춤 ㅠㅠ
페이지 정보
작성자 master 작성일2022-12-03 11:36 조회222회 댓글0건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define sbi(PORTX,bitX) PORTX|=(1<<bitX)
#define cbi(PORTX,bitX) PORTX&=~(1<<bitX)
#define tbi(PORTX,bitX) PORTX^=(1<<bitX)
#include "LCD.h"
//
char str[21];
char DHT11_data=0,hum_int,hum_dec,tem_int,tem_dec,parity;
char opened=0; // 초기값 문닫힘 상태
//
void request(){
sbi(DDRD,7); cbi(PORTD,7); _delay_ms(20); sbi(PORTD,7);
}
//
int response(){
cbi(DDRD,7);
_delay_us(39); if( (PIND&(1<<7)))return 1;
_delay_us(80); if(!(PIND&(1<<7)))return 1;
_delay_us(80);
}
//
char receive_data(){
for(int q=0;q<8;q++){
while((PIND&0x80)==0);
_delay_us(30);
if(PIND&0x80)DHT11_data=(DHT11_data<<1)|1;
else DHT11_data=(DHT11_data<<1);
while(PIND&0x80);
}
return DHT11_data;
}
//
void get_dht11(){
request();
if(response()!=1){
hum_int=receive_data(); hum_dec=receive_data();
tem_int=receive_data(); tem_dec=receive_data();
parity=receive_data();
}
else{} //DHT11 response error
}
//
void open(){
if(opened==0){ // 닫힘 상태라면
OCR1A=3999; _delay_ms(300); OCR1A=2999; // 300ms동안 정회전 후 정지
opened=1; // 열림 상태로 변경
}
}
//
void close(){
if(opened){ // 열림 상태라면
OCR1A=1999; _delay_ms(300); OCR1A=2999; // 300ms동안 역회전 후 정지
opened=0; // 닫힘 상태로 변경
}
}
//
int main(void){
MCU_Init();
LCDInit();
DDRB=0x20;
DDRF=0xFF;
TCCR1A=0x82; TCCR1B=0x1A; TCNT1H=0x00; TCNT1L=0x00; OCR1A=2999; ICR1=39999;
while(1){
get_dht11();
if((hum_int+hum_dec+tem_int+tem_dec)==parity){
sprintf(str,"HUM:%d.%d",hum_int,hum_dec); LCDMove(0,0); LCDPuts(str);
sprintf(str,"TEM:%d.%d",tem_int,tem_dec); LCDMove(1,0); LCDPuts(str);
//
if(hum_int>=50)open(); // 문열림
else close(); // 문닫힘
//
if(tem_int< 20)PORTF=0xff; else PORTF=0x00;
}
else LCDPuts("error!!");
_delay_ms(400);
}
}
360도 회전하는 모터는 1500us(OCR1A=2999)에서 정지
1500us 보다 작거나 크면 정회전 또는 역회전 하는데
1500us에서 멀 수록 속도가 더 빠릅니다.
댓글 0
조회수 222등록된 댓글이 없습니다.