코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
ISR(TIMER4_CAPT_vect)을 사용해서 PWM으로 출력되는 센서값을 확인하고 싶습니다. 도와주세요.
아두이노개발개발 | 2018-08-16
|
|
---|---|
1. 프로젝트 사용한 보드 종류 아두이노 메가 2560 보드
2. 사용한 개발 프로그램명 아두이노 IDE
3. 사용한 센서 모델명 CO2센서 (MH-Z19B)
4. 연결한 회로 설명 PWM핀을 ICP4(D49) 연결함
5. 소스코드 ISR(TIMER4_CAPT_vect) ICP4 핀에서 low->high, high->low 감지시 인터럽트 발생
{
if (mu08RisingEdge == TRUE) // ICP4 핀으로 rising edge 감지시
{
TCNT4L = 0;
TCNT4H = 0;
TCCR4B &= ~(1 << ICES4); // falling edge 감지를 위해 ICES4 "0" set
mu08RisingEdge = FALSE;
digitalWrite(4, HIGH); // PWM 입력이 제대로 되는지 확인하고 싶어서 출력
}
else
{
TCCR4B |= (1 << ICES4); // rising edge 감지를 위해 ICES4 "1" set
mu08RisingEdge = TRUE;
mu16Low = ICR4L;
mu16High = ICR4H;
mu16CO2HighLevelCount = ICR4; //mu16High - mu16Low;
digitalWrite(4, LOW);
}
}
void setup() { noInterrupts();
pinMode(4, OUTPUT);
pinMode(49, INPUT);
// clk I/O / 1024 (prescaling, 64us) /////////////////////////
SET_BIT(TCCR4B, CS40);
CLEAR_BIT(TCCR4B, CS41);
SET_BIT(TCCR4B, CS42);
//////////////////////////////////////////////////////////////
TCNT4 = 0;
ICR4 = 0;
mu16CO2HighLevelCount = 0;
SET_BIT(TCCR4B, ICES4); // enable input capture
SET_BIT(TIMSK4, ICIE4); // enable input capture interrupt for timer 4
interrupts();
Serial.begin(9600);
}
void loop()
{
Serial.print(mu16CO2HighLevelCount);
}
6. 문제점 및 에러 내용 CO2센서가 PWM으로 현재 센서의 값을 데이터로 보내주고 있습니다. 그래서 Input Capture Register를 사용하려고 했습니다. Timer4를 이용하였구요. 1024 분주해서 1count당 64us로 2ms ~ 1004ms를 커버하려고 했습니다.
ICP4핀으로 PWM이 제대로 입력되는지 확인하기 위해서 D4핀을 Output으로 두고, 로직 분석기로 확인하였습니다. 로직 분석기로 확인했을 때, 보통 200ms정도 high 출력을 확인하였습니다. 그러면 mu16CO2HighLevelCount는 약 3,125(200,000us / 64us)는 찍혀야 된다고 생각했습니다. 그런데 시리얼 모니터로 찍히는 값이 100도 되지 않았습니다.
ICR을 사용하는데.....잘못한 부분이 있는지 확인 부탁드립니다. 구글링을 계속해봐도 찾지를 못하겠네요ㅠ.
|
|
이전글 | 질문드립니다.. | 2018-08-15 |
다음글 | 아두이노 mpu6050 | 2018-08-17 |