BASIC4MCU | 질문게시판 | 아두이노 우노 홀센서 인터럽트
페이지 정보
작성자 공대생입니다 작성일2020-10-19 14:31 조회6,583회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=13586
본문
#define DHALL 2unsigned long time_=0, time_previous=0;double w=0;double w_previous=0;double a=0;double t=0;double p=0;int i = 162;int Dvalue = 0;void setup() {Serial.begin(9600);pinMode(DHALL,INPUT);attachInterrupt(digitalPinToInterrupt(2), interrupt, FALLING); // put your setup code here, to run once:}void loop() {// put your main code here, to run repeatedly:delay(1000);}void interrupt (){time_previous = time_;time_= millis();w = 6.28/(time_ - time_previous);a = ((w- w_previous)/(time_ - time_previous));t = i*a;p = w*t;w_previous = w;}위 코딩은 자기장을 감지하는 홀센서를 이용해 자석이 붙은 원판을 회전 시키면 고정된 홀센서를 지나갈때 디지털 신호로 0 을 감지합니다. attachInterrupt 함수의 falling(1 > 0으로 떨어질 때) 을 이용해 첫번째 0 이 감지된 시간과 두번째 0 세번째 0 ..... n 번째 0을 감지한 시간을 구합니다. 시리얼 모니터에 time_ , time_previous의 값이 나오지는 확인하기 위해 시리얼 모니터를 돌려보았습니다. 그런데 아래 첨부한 파일 처럼 time_ 과 time_previous 의 값이 동일 하게 찍힙니다. 이 문제를 해결할 방법을 알고싶습니다. ㅠㅠ
댓글 2
조회수 6,583master님의 댓글
master 작성일
그림의 소스와 텍스트 소스가 다르군요?
시리얼 출력에 상당한 시간이 걸립니다.
예를들면 9600보레이트에서 1바이트 출력에 소요되는 시간은 약 1ms인데 (1042us)
메시지 중 하나를 세어봤더니 105문자 즉 105ms가 넘는다는 것이죠
어느 한 인터럽트에서 시간을 보내고 있으면 다른 인터럽트 실행이 안됩니다.
즉, millis() 함수가 제대로 시간을 증가 시키려면 타이머 인터럽트가 바로바로 걸려야 하는데
외부 인터럽트에서 105ms 이상을 붙들고 있으면 타이머 인터럽트가 걸리지 못해서 시간이 증가할 수 없죠
시리얼출력, 딜레이 등은 인터럽트에서 사용하면 안되며
실수 연산에도 많은 시간이 걸리므로 연산도 인터럽트 안에서는 가급적 사용하지 않아야 합니다.
공대생입니다님의 댓글
공대생입니다 작성일답변 감사드립니다.