BASIC4MCU | 질문게시판 | atmega128과 진동센서 FAST PWM 서보모터 제어 질문
페이지 정보
작성자 antjdnsxks 작성일2019-11-07 17:05 조회20,351회 댓글3건본문
현재 저희가 SEN0209 센서를 이용해서 High값을 받았을때 서보모터 구동을 하려합니다.
SEN0209 압력센서에서 나오는 출력전압은 528mV/g 이고 현재 (x>500) 나왔을때 high 값을 받아서 서보모터를 3초동안 90도 제어 후 다시 0 중립으로 돌아가는것을 구상중입니다.
현재 진행사항은
1. FAST PWM 64분주비로 구동해서 각도 조절은 끝낸상태입니다.
가장 큰 문제점이 SEN0209 센서를 ADC 변환해서 각도 조절을 하려하는데 막혀있습니다.
ADMUX 기준전압 5V를 주고 PF0 연결해서 서보모터랑 구동하려하는데 While문을 어떻게 수정해야할지 잘 몰라서 글 올립니다.
서보모터 같은경우 PB5 포트를 사용해서 16비트 FASTPWM으로 사용하고 있습니다.
#define F_CPU 16000000L // 16MHz
#include <avr/io.h>
#include <util/delay.h>
void RC_Motor(int angle){ // angle : -90도 ~ +90도
int i;
if(angle<-90)angle=-90;
if(angle> 90)angle= +90;
i=(angle+ 90)*(-1.1) + 500;
OCR1A=i; //PB5
}
int main(void)
{
//Configure TIMER1
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);
OCR1A=500; //OCR1A= 500 일떄 각도가 0도, OCRA1= 300일때 각도가 90도
ICR1=4999; //fPWM=50Hz (Period = 20ms Standard)
DDRB |= (1 << PORTB1); //PB1 OC1A PWM Output
ADMUX =0x00;
ADCSRA=0xE7;
while(1)
{
}
}
댓글 3
조회수 20,351master님의 댓글
master 작성일
서보모터 같은경우 PB5 포트를 사용해서 16비트 FASTPWM으로 사용하고 있다고 적었는데
DDRB|=(1<<PORTB1); //PB1 OC1A PWM Output
PB1은 뭘까요?
master님의 댓글
master 작성일
16000000/64/300=833.3333333333333Hz=1.2ms=60도(-30도)
16000000/64/500=500Hz=2ms=140도(50도)
누가 만든 예제인지 모르겠지만 각도가 엉터리군요
https://cafe.naver.com/circuitsmanual/5902
PWM으로 구동하는 초음파센서 예제는 제가 10여년 전에 만든 것이 원본입니다.
master님의 댓글
master 작성일
i=(angle+90)*(-1.1)+500;
-90도, i=500, 500*4us=2ms
0도, i=401, 401*4us=1.604ms
90, i=302, 302*4us=1.208ms
서보모터는
600us에서 -90도(0도)
1500us에서 0도(90도)
2400us에서 90도(180도)
정도입니다.
RC_Motor() 함수도 엉터리군요
남의 소스를 공부해서 변경했다면 제대로 공부해서 변경해야 할텐데
기껏 남의 소스를 베껴서 만들면서 엉터리로 만들었군요