본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링

[STM32] 가변주기 PWM 생성

by 베니스상인 2018. 11. 10.


가변주기 펄스는 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)까지 가능함을 확인하였다. 


생각보다 고속 제어가 안되는 것 같다. 스텝모터가 원래 이렇게 빠르지 않은 건가?





728x90

댓글