요약: ARR, CCR 값이 설정 가능한 최대값을 넘어가지 않는지 확인합시다.
예를 들어 Core 클럭이 96MHz이고, 타이머의 Prescale 값을 96으로 설정하면(실제로는 설정할 때는 96에서 1이 빠진 95가 되어야 합니다.) Timer 내부에 공급되는 클럭은 1MHz가 됩니다. 이 때, 초당 8펄스 속도로 신호를 공급하고자 했을 때 아래와 같이 값을 설정하게 됩니다.
ARR = (1000000 / 8) - 1 = 124999
CCR = (125000 / 2) - 1 = 62499
언듯보면 문제가 없는 것 같습니다. 하지만 모터는 아예 회전을 하지 않았습니다. 과연 무엇이 잘못되어 그런 것일까요?
답은 ARR 설정 값에 있습니다. 제가 사용한 MCU 는 STM32H743ZI 입니다. 그리고 타이머는 TIM13을 사용하였고요. 레퍼런스 매뉴얼에 의하면 TIM13의 ARR 레지스터는 16 bit 까지의 데이터를 받을 수 있습니다. 레지스터의 크기가 16 bit이면 설정할 수 있는 최대 값은 10진수로 65535 입니다.
<STM32H743ZI 레퍼런스 매뉴얼 중>
초당 8펄스 속도로 회전하려고 했더니 ARR 설정 값이 65535를 넘어 버렸습니다. 이 때문에 온전한 펄스를 모터 드라이버에 공급하지 못해 정상적인 제어가 되지 않았던 것입니다. MCU의 Core 클럭과 Prescale 값을 변경하지 않는다면 설정 가능한 최저 속도는 초당 16펄스 입니다. 만약 더 느리게 모터를 회전하고자 한다면 타이머의 Prescalse 값도 변경되어야 할 것입니다.
96MHz로 공급되는 Core 클럭을 Prescale한 결과가 62500이 되도록 Prescale 값을 1535으로 설정해보았습니다. 예상되로 초당 1펄스의 느린 속도로도 문제없이 회전하는 것을 확인하였습니다.
'연구 노트 > Embedded' 카테고리의 다른 글
[MCS-51] AT89S52 특징 (0) | 2019.12.12 |
---|---|
[MCS-51] MCS-51 기본 구조 (0) | 2019.12.11 |
[STM32] UART 통신 수신 코드 구현 방법 (0) | 2019.10.17 |
시리얼 데이터 통신을 위한 프로토콜 (0) | 2019.10.14 |
아두이노 설치 및 환경 설정 (0) | 2018.10.09 |