질문게시판 > 타이머 인터럽트를 이용한 스텝모터 제어 질문입니다.

TODAY1,421 TOTAL1,177,513
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 타이머 인터럽트를 이용한 스텝모터 제어 질문입니다.

페이지 정보

작성자 꾸람이 작성일2020-07-26 21:00 조회66회 댓글6건

본문

	

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
long ta=1e6;
long Vm=2000;
long dly;
long t=td/9;
long t12;
ISR(TIMER1_COMPA_vect){
  digitalWrite(STEP_PIN,!digitalRead(STEP_PIN));
}
//
void setup(){
  pinMode(EN_PIN,OUTPUT);
  pinMode(STEP_PIN,OUTPUT);
  {
    cli();
    TCCR1A=0;
    TCCR1B=0;
    TCNT1=0//타이머 카운터 0부터
    TCCR1B|=(1<<WGM12); //CTC 모드
    TCCR1B|=(1<<CS11); //프리스케일러 8
    TIMSK1|=(1<<OCIE1A); //비교매치 인터럽트
    sei();
  }
}
//
void loop(){
  if(t<ta){
    dly=(ta)/(2*(Vm/1e6)*t);
  }
  else if(t>=ta&&t<(ta+t12)){
    dly=1/(2*(Vm/1e6));
  }
  OCR1A=dly;
  delayMicroseconds(500);
}

 

코드를 요약하자면 위와 같습니다. 모터가 돌기는 도는데... 가속하는 과정의 두번의 if문에서 모터가 한번씩 끊긴다는 느낌을 받습니다.

 if / else if 구문에서 시간이 걸린다고 해도.. 타이머에서는 계속 펄스를 발생시키고 있기때문에... 끊김이 발생되지 않아야 할 것 같은데요

아니면 설령 인터럽트로 펄스 발생을 처리한다고 해도... 메인 루프의 구문들을 처리할때는 순간적으로 인터럽트가 멈추어, 모터가 끊기는 현상이 발생되는 것인지요?

궁금합니다!~

 

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

댓글 6

조회수 66

꾸람이님의 댓글

꾸람이 작성일

추가로 모터의동작을 IRRemote 라이브러리를 이용하여 제어하려고 하니... 리모컨 버튼이 잘 먹지 않습니다. (리모컨 인식 구문은 메인루프)
인터럽트를 쓰기 전에는 아무런 문제가 없었는데. 인터럽트를 적용하면 리모컨 인식이 잘 안되네요.. 여러번 시도해야 겨우 먹습니다.
추측으로는 인터럽트를 처리하느라 바빠서 메인루프를 처리할 여력이 없는게 아닌가 싶네요

master님의 댓글

master 작성일

long t=td/9;
td는 안보이는데 선언이 어디에 있을까요?
변수 선언 위치에서 다른 변수를 넣어서 연산 하거나, 함수를 호출하거나 하지 못합니다.
td가 define으로 선언된 경우라면 가능합니다.

master님의 댓글

master 작성일

가장 연산 속도가 느린 것이 float 같은 실수 연산이지만
정수 연산에서는 long 연산이 가장 오래 걸리겠죠
dly=(ta)/(2*(Vm/1e6)*t);
dly=1/(2*(Vm/1e6));
고정된 값은 매번 연산을 시키는 것보다 미리 계산기로 계산해서 넣어두는 것이 연산 시간을 줄일 수 있습니다.
값이 변하는 변수는 없는데 dly 변수는 어떻게 변하는 것인지 모르겠습니다.
t=td/9; 변수 선언위치에서 연산하고 있는 이 연산이 매 루프마다 실행된다고 생각하는 것일까요?

master님의 댓글

master 작성일

dly 연산결과가 2바이트 크기를 넘지 않도록 해야하며
OCR1A=dly;
값을 넣기 전 TCNT1가 dly보다 조금 더 작아야합니다. (값을 대입하는데도 약간의 시간이 걸리므로)
만약 TCNT1이 OCR1A보다 크게되면 0xFFFF까지 증가한 후에 다시 OCR1A에 도달할 때까지 거의 한 바퀴 도는 시간동안 아무 것도 하지 않게 됩니다.

꾸람이님의 댓글

꾸람이 댓글의 댓글 작성일

답글 정말 감사드립니다!!!
위의 변수연산 관련하여, 질문에 있어서 그리 중요한 부분은 아니어서, 제외시키고 올렸습니다.
dly 는 2바이트 이내에 들어가는 값이며,
마지막 댓글주신 TCNT1 이 dly 보다 조금더 작아야하는 부분은 어떻게 확인할수 있을까요...? 메인루프문의 구문들을 처리하는 시간을 알아야 대강이라도 계산을 할수 있을것 같은데...
우선은 말씀하신대로 미리 배열을 만들어 가속도 테이블 값을 넣어두도록 하겠습니다.
그리고 궁금한것이 추가로 있는데, 인터럽트 타이머가 돌고 있는 것과 메인루프 처리하는 것은... 컴퓨터로 따지면 멀티태스킹의 개념이 아닌가요?
루프문에서 시간이 소요되더라도... 루프문과는 별개로 타이머는 계속해서 PWM 신호를 생성하고 있을텐데... 저의 경우처럼 모터가 가속 도중 살짝씩 끊기는게 이해가 되지 않습니다 ㅠㅠ

master님의 댓글

master 작성일

가속도 테이블을 사용하면 연산에 시간이 걸리지 않으므로 고속으로 값을 변경할 수 있게 되므로 좋은 방법이며
일반적으로 이 방법을 많이 사용합니다.
ISR(TIMER1_COMPA_vect){
  static char cnt=0;
  digitalWrite(STEP_PIN,!digitalRead(STEP_PIN));
  if(++cnt>=20){ cnt=0; // 20번의 출력 반전(10개의 펄스) 뒤
    OCR1A=table[t]; // 새로운 가속도 값을 설정 함
    if(t<499)t++; // 배열 개수는 500개
  }
}
인터럽트 안에서 출력하면 tcnt1의 크기를 신경 쓸 필요가 없습니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 1961
공지 사이트 이용 안내댓글[12] master 17-10-29 12051
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [2013.02.07]댓글[1] 이미지첨부파일 master 18-01-23 4559
질문 메가로 진행중인데 질문드려요,,댓글[1] dongeun9 20-07-31 28
질문 아두이노 우노 -> 메가댓글[2] dongeun9 20-07-30 43
질문 아두이노 우노+DC모터 제어 질문드립니다.댓글[1] 빈군 20-07-30 35
질문 아두이노어플 통신 질문드립니다댓글[1] dongeun9 20-07-29 31
질문 모터를 작동시키기만 하면, 외부인터럽트에서 이상이 발생합니다.댓글[1] 꾸람이 20-07-29 38
질문 질문 드립니다.댓글[1] 알려주세요제발ㅠㅠ 20-07-29 33
질문 질문드립니다 수파도프 20-07-28 33
답변 답변글 답변 : 질문드립니다 master 20-07-28 37
질문 아두이노 우노 -> 메가 질문드립니다댓글[2] dongeun9 20-07-28 36
질문 ATmega와 안드로이드 블루투스 연결 질문입니다. 구래몬 20-07-28 32
답변 답변글 답변 : ATmega와 안드로이드 블루투스 연결 질문입니다.댓글[1] master 20-07-28 33
질문 아두이노 RC카 양쪽 모터속도제어 질문입니다.댓글[3] 첨부파일 MaTD 20-07-27 47
질문 통신프로토콜 ? 세상통합 20-07-27 33
현재글 타이머 인터럽트를 이용한 스텝모터 제어 질문입니다.댓글[6] 꾸람이 20-07-26 67
질문 매우 초보적인 아두이노 코딩질문입니다.댓글[1] 이미지첨부파일 화이팅dP 20-07-23 71
질문 아두이노 우노 푸쉬 버튼 서보모터 작동 관련 초보 질문입니다.댓글[1] 이미지 구름신 20-07-23 49
질문 적외선 거리센서 탐지범위 설정하는 방법 알려주시면 감사하겠습니다. 큐큐큐큨 20-07-22 44
답변 답변글 답변 : 적외선 거리센서 탐지범위 설정하는 방법 알려주시면 감사하겠습니다. master 20-07-22 55
질문 코딩 질문.. 전자학습자 20-07-22 59
답변 답변글 답변 : 코딩 질문..댓글[4] master 20-07-22 74
질문 소스 코드 질문좀 드리겠습니다..! 코딩공부하자 20-07-21 63
답변 답변글 답변 : 소스 코드 질문좀 드리겠습니다..! master 20-07-21 47
답변 답변글 답변 : 답변 : 소스 코드 질문좀 드리겠습니다..!댓글[4] 코딩공부하자 20-07-22 72
질문 아두이노 스텝모터 도와주세요~ 랩돌이 20-07-20 70
답변 답변글 답변 : 아두이노 스텝모터 도와주세요~댓글[1] master 20-07-20 86
질문 희미한 LED 문제댓글[6] 전자학습자 20-07-20 119
질문 소스 코딩 문제점을 찾고싶어요댓글[1] 첨부파일 bas213 20-07-17 107
게시물 검색

2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기