가변주기 펄스는 AVR이나 80C196등으로 제어하는 것은 많이 봤지만 STM으로 가변주기 PWM을 만든 것은 자료를 많이 찾아볼 수가 없었다.
그래서 직접 만들어보았다. 사용한 모델은 STM32F103RCT6 모델이다.
접근한 방법은 PWM 을 생성하고 업데이트 인터럽트가 발생하면 다음 Prescaler에 다음 주기의 값을 넣어서 주기를 변경시키는 방법으로 접근했다.
먼저 인터럽트가 발생할 수 있는 최소 시간을 확인해보았다.
타이머로 System Clock인 72MHz 클럭을 사용하고 CCR = 200으로 하고 Prescaler를 0으로 설정하면 PWM의 주기는 2.7us(370KHz)이다.
아래 사진처럼 PWM주기마다 인터럽트가 발생하지 않는 것을 확인할 수 있다. 파란색은 PWM이고 노란색은 업데이트 인터럽트마다 GPIO를 토글한 것이다.
몇번의 반복실험으로 CCR = 20, Prescaler는 72로 하여 20us(50KHz)주기를 가지는PWM에서는 매 펄스마다인터럽트가 정상적으로 발생하는 것을 확인하였다.
즉 최대 발생할 수 있는 펄스폭은 20us(50KHz)가 되는 것이다. 그런데 이것은 인터럽트가 정상적으로 발생하는 최소시간의 펄스이가 스텝모터가 최대속도를 낼 수 있는 시간은 별도로 확인해야 한다.
아래는 업데이트 인터럽트에서 Prescaler를 조정하여 가변주기 펄스를 만든 것이다. 펄스폭은 4단계로 10000씩 줄어들고 다시 10000씩 3단계를 거쳐 원래로 돌아온다. 펄스마다 업데이트 인터럽트가 정상적으로 발생함을 확인할 수 있다.
모터가 낼 수 있는 최소주기 펄스는 반복실험을 통하여 170us(5.8KHz)까지 가능함을 확인하였다.
생각보다 고속 제어가 안되는 것 같다. 스텝모터가 원래 이렇게 빠르지 않은 건가?
'엔지니어링' 카테고리의 다른 글
[STM32] ZedGraph를 이용한 C# 그래프 프로그래밍 (0) | 2018.10.27 |
---|---|
[STM32] CubeMX로 생성한 HAL 드라이버의 디버깅 오류 (0) | 2018.10.02 |
[STM32] HAL 라이브러리 vs STD 라이브러리 (0) | 2018.09.30 |
댓글