BASIC4MCU | 질문게시판 | 서보모터 관련 질문합니다.
페이지 정보
작성자 bono 작성일2018-12-14 00:37 조회8,320회 댓글2건첨부파일
본문
안녕하세요 어제 질문 올렸는데 도움 잘 받았습니다.
다시 한번 감사드립니다.!!
현재 ATMEGA328을 이용하여 무선컨트롤러를 UART통신으로 RC카를 제어하는 코드를 만들고 있습니다.
그런데 서보모터 제어 관련하여 여쭤보고 싶은게 있어서요
RC CAR의 조향장치를 16비트 타이머를 이용해서 서보모터를 제어하고 싶은데요.
컨트롤러부분에서 가변 저항 ADC값을 읽어 0~180으로 변환해준 후 본체쪽으로 보내고
본체부분에서 180 이하 값을 받으면
그 값을 OCR1A에 원하는 각에 대한 값을 얻는 식을 코드에 삽입했는데요.
본체부분으로 가는 RX부분을 터미널로 확인하여 헥사코드를 보았는데도 변화가 없고 0~180 (0~B4)의 값만 보여지고 서보모터가 가변저항 값에 따라 세밀한 각조절이 되지 않는것을 확인하였습니다.
(서보모터의 듀티비에서 20ms 의 주기 동안 0도를 만들어 주기 위해서는 1ms가 HIGH이고 19ms가 LOW인 파형을 동작시간 동안 계속 보내주어야 하고
따라서 OCR1A값이 0도 일때는 2000 , +90도 일때는 3000 , 180도 일때는 4000 이어야 합니다.)
개인적인 생각으로 0~180의 값을 받으니 본체부분에서 OCR1A = (( r / 180)*2000+2000); 으로 줘봤는데 서보모터 값이 더 이상해 진거 같네요.
제가 계산을 잘못한건지...
코드에 무슨 문제가 있는지 봐주실 수 있나요?
댓글 2
조회수 8,320master님의 댓글
master 작성일
uint16_t ReadADC(uint8_t ch){ // ADC값을 읽어오는 함수
ADCSRA|=(1<<ADSC); // ADC 변환 시작
while(!(ADCSRA&(1<<ADIF))){
; // 변환 기다림
}
int ADC_Low;
int ADC_High;
ADC_Low=ADCL;
ADC_High=ADCH;
Handle=(ADC_High<<8)|ADC_Low;
Handle=(int)((float)Handle*180.0/1023.0);
ADCSRA|=(1<<ADIF); // 변환 완료
return(ADC); // ADC값 반환
}
열심히 Handle을 연산까지 다 해놓고
return(ADC); // ADC값 반환
마지막에 ADC를 리턴하고 있습니다.
return(Handle); // Handle값 반환
이렇게 수정하세요
master님의 댓글
master 작성일
OCR1A=r*19+1200;
위 코드의 히스토리를 다 설명하려면 복잡하고요
OCR1A=r*20+1200;
이렇게 수정해서 돌려보세요
각도 조정에 문제가 있어서 양쪽 끝에서 걸리는 모터도 있습니다.
OCR1A=r*19+1310;
OCR1A=r*18+1380;
끝에서 부딪히는 모터 경우에는 위처럼 수정해주세요
1500us 중심으로 양쪽 폭을 줄이는 겁니다.
//
1000~2000us의 각도는 RC에서 조정기로 조정할 때 많이 사용하는 것이고
일반적인 서보모터의 각도 범위는 600~2400us 정도입니다.
이 범위는 제조사마다 조금씩 다를 수 있고, 생산 시 오차가 있어서 정확하지는 않습니다.
1500us가 센터 위치이다 <-- 주로 이 내용만 스펙에 명시하고 있습니다.