질문게시판 > 답변 : SG90C

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

답변 : SG90C

페이지 정보

작성자 master 작성일18-12-13 14:38 조회6,880회 댓글1건

본문

 

// DateTime : 2018-12-13 오후 2:41:16
// by Ok-Hyun Park
//
int angle=0;
//
void svangle1(){
  if(angle!=1){ angle=1;
    OCR1A600delay(500); // 0도
    OCR1A=1500delay(500); // 90도(정지)
  }
}
//
void svangle2(){
  if(angle!=1){ angle=1;
    OCR1A=2400delay(500); // 180도
    OCR1A=1500delay(500); // 90도(정지)
  }

 

전체 소스가 아니라서 몇도로 제어하는 함수인지 알 수가 없지만

    OCR1A600delay(500); // 0도
이 코드가 정회전이라면
    OCR1A=2400delay(500); // 180도
이 코드는 역회전이 되고
    OCR1A=1500delay(500); // 90도(정지)
중간 값이 정지 가 됩니다.

 

큰 글씨로 적은 딜레이 값을 조정해서 원하는 각도로 맞춰보세요

시간으로 각도를 맞춘다는 것이 불가능에 가까우므로 대략적인 흉내만 납니다.

 

 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 1

조회수 : 6,880

Jdhe님의 댓글

Jdhe 작성일

이 코딩인데 바꿔주실수 있으신가요..??ㅠㅠㅠ 부탁드립니다.


#define F_CPU 16000000
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <math.h>
#include <avr/interrupt.h>

#define LINE1 0x80  //첫번째 라인의 DDRAM address : 0x00 -> 0x80+0x00
#define LINE2 0xC0  //두번째 라인의 DDRAM address : 0x40 -> 0x80+0x40
#define MAX 4

//PG2=LCD_EN, PG1=RW, PG0=RS 에 연결
#define CMD_WRITE  0x09  //명령어쓰기 E=1, RW=0, RS=0 1
#define CMD_READ    0x0B  //명령어읽기 E=1, RW=1, RS=0 1
#define DATA_WRITE  0x0D  //데이터쓰기 E=1, RW=0, RS=1 1
#define DATA_READ  0x0F  //데이터읽기 E=1, RW=1, RS=1 1
#define LCD_EN      0x01    //PG0에 연결되어 있기 때문에 bit2를 1로 했다.

void LCD_cmd_write(char cmd)
{
PORTG = CMD_WRITE;    //PORTG에 RS, RW, E 가 연결되어 있다.
PORTA = cmd;                //PORT에 데이터버스가 연결되어 있다.
PORTG = PORTG^LCD_EN;  //E 신호를 H->L로 하기 위해
_delay_ms(2);                //LCD 내부 동작시간
}

void pwm_init()
{
TCCR1A = 0xA2;
TCCR1B = 0x1b;
ICR1 = 4999;
OCR1A = 0;
OCR1B = 0;
TCNT1 = 0x00;

}

void svangle1(float angle)
{
unsigned int pulse;


pulse = angle*225/90 + 375 + 0.5;
OCR1A = pulse;
}

void svangle2(float angle)
{
unsigned int pulse;


pulse = angle*225/90 + 375 + 0.5;
OCR1B = pulse;
}

unsigned int Echo1(){
unsigned int range;
PORTC = PORTC|0x01;
_delay_us(10);
PORTC = PORTC&0xfe;

while(!((PINC&0x04) == 0x04));
TCNT3 = 0;
TCCR3B = 2;
while((PINC&0x04) == 0x04);

TCCR3B = 8; range = TCNT3/116;
return range;
}

unsigned int Echo2(){
unsigned int range;
PORTC = PORTC|0x02;
_delay_us(10);
PORTC = PORTC&0xfd;

while(!((PINC&0x08) == 0x08));
TCNT3 = 0;
TCCR3B = 2;
while((PINC&0x08) == 0x08);

TCCR3B = 8; range = TCNT3/116;
return range;
}

void init_Echo()
{
TCCR3A = 0;
TCCR3B = 8;
_delay_ms(100);
}

//LCD에 데이터를 쓰기 위한 함수
void LCD_data_write(char data)
{
PORTG = DATA_WRITE;    //PORTG에 RS, RW, E 가 연결되어 있다.
PORTA = data;                //PORTA에 데이터버스가 연결되어 있다.
PORTG = PORTG^LCD_EN;  //E 신호를 H->L로 하기 위해
_delay_ms(2);                      //LCD 내부 동작시간
}

void init_Rx_Tx(void)

{

DDRD = 0x02;

UCSR1A = 0x00;

UCSR1B |= (1<<RXEN1)|(1<<TXEN1);

UCSR1C = 0x06;

UBRR1H = 0x00;

UBRR1L = 0x67;

}

char rx_char(void)

{

while((UCSR1A&0x80)==0);

return UDR1;

}



void tx_char(char tx_data)

{

while((UCSR1A&0x20) == 0);

UDR1 = tx_data;

}

// ATmega128의 포트 초기화



void USART_SendString(char *str)

{

int i=0;

while (str[i]!=0)

{

tx_char(str[i]);

i++;

}

}
// LCD 초기화, 초기화 강좌의 순서도 참조
void init_LCD(void)
{
_delay_ms(15);        //15msec 이상 시간지연
LCD_cmd_write(0x38); //기능셋(데이터버스 8비트, 라인수:2줄)

_delay_ms(5);        //4.1msec 이상 시간지연, 생략가능
LCD_cmd_write(0x38); //기능셋, 생략 가능
_delay_us(100);      //100usec 이상 시간지연, 생략가능
LCD_cmd_write(0x38); //기능셋, 생략 가능

LCD_cmd_write(0x08);  //표시 Off , 생략 가능
LCD_cmd_write(0x01);  //화면 지우기
LCD_cmd_write(0x06);  //엔트리모드셋
LCD_cmd_write(0x0C);  //표시 on
}



// LCD에 문자열을 표시하기 위한 함수
void LCD_wr_string(char d_line, char *lcd_str)
{
LCD_cmd_write(d_line);      //문자열을 표시하기 위한 라인 설정
while(*lcd_str != '\0')
{
LCD_data_write(*lcd_str);  //한개의 문자씩 LCD에 표시한다.
lcd_str++;
}
}

void init_system(void)
{
DDRA = 0xFF;  //LCD 데이터 버스
PORTA = 0xFF;
DDRG = 0x7F;  //LCD 컨트롤 신호(PG2=LCD_EN, PG1=RW, PG0=RS)
PORTG = 0x3F;

DDRC = 0x03;
PORTC = 0x00;

DDRB = 0xff;
}

int main(void)
{
init_Rx_Tx();
int count = 0;
char str[16];
int range[2];
init_system();
init_LCD();
pwm_init();
init_Echo();

while(1){

range[0]=Echo1(); //들어가는거 //차단

if(range[0]<30){

if(MAX-count>=1){

PORTB|=1;    _delay_ms(1000); PORTB&=~1;

svangle1( 0); _delay_ms(500);

svangle1(90); _delay_ms(500);

count++;

}

}

//

range[1]=Echo2(); //나가는거

if(range[1]<30){

if(count>=1){

PORTB|=4;    _delay_ms(1000); PORTB&=~4;

svangle2( 0); _delay_ms(500);

svangle2(90); _delay_ms(500);

count--;

}

}

sprintf(str,"%d ",MAX-count);
LCD_wr_string(LINE1,str);

USART_SendString(str);
USART_SendString("\n");
}
}

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[28] master  17-10-29
질문 stm32f767 스텝모터 속도 질문있습니다 123132 새글 23-05-27
답변 답변 : stm32f767 스텝모터 속도 질문있습니다 master 새글 13:34
질문 아트메가 128 코딩 오류 질문입니다. 댓글[1] 태태킴 새글 23-05-27
질문 스텝모터 제어하는 소스파일인데 질문있습니다. Bs드리프터 새글 23-05-27
답변 답변 : 스텝모터 제어하는 소스파일인데 질문있습니다. master 새글 23-05-27
질문 모터 컨트롤러와 웜기어 모터 연결 문의 드립니다 댓글[2] 오후에 새글 23-05-27
답변 답변 : 모터 컨트롤러와 웜기어 모터 연결 문의 드립니… 댓글[1] 첨부파일오후에 새글 23-05-27
질문 아두이노 스텝모터 초음파 결합 댓글[2] 결합기원 새글 23-05-26
답변 답변 : 아두이노 스텝모터 초음파 결합 master 새글 23-05-27
질문 piezo부저 연결 방법 댓글[2] 첨부파일djwb 새글 23-05-26
질문 Atmega128과 도트매트릭스을 이용해 16x16미로… JJEE 새글 23-05-26
답변 답변 : Atmega128과 도트매트릭스을 이용해 16… master 새글 23-05-26
질문 아두이노 mq3 센서 여러개 댓글[5] keyest  23-05-26
질문 아두이노 이어폰모듈 elb080306 댓글[1] 크라퀴  23-05-25
질문 어제 아두이노 핀 문제 댓글[2] 미ㅏㄴㅇ  23-05-25
질문 스텝 모터, 모터 드라이버 관련 질문입니다 댓글[2] 스튜와트  23-05-24
답변 답변 : 스텝 모터, 모터 드라이버 관련 질문입니다 master  23-05-24
질문 아두이노 디지털 핀 문제 미ㅏㄴㅇ  23-05-24
답변 답변 : 아두이노 디지털 핀 문제 댓글[1] master  23-05-24
질문 아두이노 코드 합치기 댓글[1] 아두초보이노  23-05-24
질문 마그네틱 도어센서 관련 질문드립니다. 엉아  23-05-23
답변 답변 : 마그네틱 도어센서 관련 질문드립니다. 댓글[1] master  23-05-24
답변 답변 : 답변 : 마그네틱 도어센서 관련 질문드립니다. master  23-05-24
질문 토양습도센서 이용시LCD 오류 댓글[5] 윤던  23-05-23
질문 ATMEGA 광센서 부저 댓글[2] 코딩  23-05-23
질문 ATMEGA J-KIT 128 스위치 부저 댓글[1] 첨부파일코딩  23-05-22
질문 장애물 회피 게임 댓글[1] 첨부파일헬창  23-05-20
질문 회로도 관련 질문 댓글[1] 첨부파일dnjs  23-05-20
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전