STM32F407 5장. ADC인터럽트를 Timer와 연동시켜 내가 원하는 타이밍에 ADC값 받기(TRUESTUDIO, HAL_Driver) :: 찬찬히 로봇 메이커
반응형

휴, 여러 할 일이 겹치면서 할 일의 우선순위를 정하다 보니 M4보드가 밀려 이렇게 늦게 올리게 되었다. ㅠㅠ 이번 포스팅에서는 소스를 내가 원하는 타이밍에 ADC값을 받을 수 있도록 만들어보았다.

그냥 M4보드에서 HAL_ADC_START_IT를 하면, 단순히 연속적으로 ADC값을 받을 뿐이다. 시도 때도 없이 받는 느낌이랄까.... 이것을 타이머와 연동을 시키면 내가 원하는 타이밍마다 ADC값을 받을 수 있고 다음 ADC값을 받기 전까지 이 받은 ADC값을 요리할 수 있다.이런식으로 인터럽트를 쓴다면 인터럽트 펜딩(pending)을 막을수도 있다!!! 팬딩이란 인터럽트끼리 겹치게 될 때, 인터럽트의 우선순위가 없다면 인터럽트가 보류가 되면서 시스템이 제대로 굴러가지 않게 된다. 펜딩은 주로 여러 인터럽트를 사용하거나 인터럽트의 실행시간이 인터럽트 사이의 시간보다 길 때 발생한다.

위의 소스는 필요한 레지스터들을 설정해줘서 인터럽트를 작동시킨 것이다. 타이머 인터럽트는 1초마다 작동하게 했고, ADC인터럽트는 따로 켜주지 않았다. 어차피 저 레지스터의 설정이 인터럽트를 켜준다는 뜻이니까.. 각각의 레지스터의 기능이 궁금하다면 reference manual을 살펴보면 알 수 있다. 나는 HAL드라이버와 reference manual을 비교해보며 소스를 작성했다. 아직 미완성에다 에러처리가 하나도 안 되어 있다.

위의 소스를 간단히 설명하면, 타이머 인터럽트가 시작이 되면 1초마다 Timer_ISR이 실행이 된다. 그러면 ADC에 ADC인터럽트를 실행한다는 flag를 넣어준다. 그러면 ADC가 실행이 되고 ADC_ISR이 실행이 된다. 그러면 ADC_ISR에서 인터럽트가 끝났다는 flag를 넣어주면 ADC는 끝이 나는 것이다.

이러한 방식은 마이크로마우스를 배우면서 알게 되었다. 센서값을 중복해서 받고, 그 값을 평균을 내서 처리를 하는데(그렇게 해도 오차가 크다), 이 때, 센서값을 처리하는 시간과 센서값을 다시 받는 시간을 고려하지 않으면 앞서 말했던 펜딩이 일어나며 소스가 멈출 때가 있었다. 또한 인터럽트를 3개를 중복해서 쓰기 때문에 다른 인터럽트에 영향을 주지 않게 하기 위해서 이러한 방식으로 쓰게 된다.

다음 포스팅에서는 PWM을 사용하는 법을 정리해서 올릴 예정이다.

반응형

+ Recent posts