STM32F0 PWM 클럭을 생성하는 예제입니다.
STM32F091RC PWM목차
- STM32F0XX CUBEMX로 PWM클럭 설정하기 (현재 포스트)
- STM32F0XX PWM 코드 작성하기
- STM32F0XX PWM 설정 부록 설명
- STM32F0XX PWM Duty 조절하기
근 몇 달동안 포스팅을 부득이하게 쉬었습니다.
오늘은 STM32F091RC칩으로 PWM 클럭을 생성하고자 합니다.
들어가기 앞서
PWM이 궁금한 분들을 위해 간단하게 서술한다.
PWM은 Pulse-width modulation의 약어이다. 펄스의 폭을 제어하는 기법이라 어렵지 않다. 사용자가 원하는대로 주기를 설정하고, 한 주기에 펄스가 차는 정도를 설정할 수 있다.
이를테면, 1조의 주기에서 1초동안 On상태이면 100%, 1초의 주기에서 0.5초만 On 상태이면 50%의 폭을 가진다고 생각할 수 있다. 그리고 그 차지하는 정도를 Duty라고 부른다.
위 사진을 보면 이해될 것이다. 순서대로 0%, 25%, 100%의 듀티를 가진다.
비고:
Period는 사용자가 설정 가능하다.
본론
CUBEMX 초기화면. 2018년 08월 기준
뉴클레오 보드로 개발하므로 Board Selector를 선택한다.
사용할 칩을 입력하고 해당 보드를 더블클릭한다.
초기설정에서 약간만 수정할 계획이므로, Yes를 클릭한다.
초기화면에서 보드의 초록 LED로 PWM제어가 되는지를 보고 싶었다.
LD2(PA5)를 클릭한다.
PWM제어는 타이머로 제어한다. PA5는 타이머2를 사용한다.
따라서 TIM2_CH1을 선택한다.
TIM2-Channel1에서 PWM Generation CH1을 선택한다.
No Output은 핀 출력을 사용하지 않으므로, 본 포스팅에서는 선택하지 않을 것이다.
Clock Configuration에서 타이머클럭을 확인한다.
포스팅에서 사용한 칩은 F091로, 48Mhz를 사용한다.
빨간색 박스 친 부분이 타이머의 클럭이다.
F091의 데이터시트를 참고하면,
타이머 1,2,3,6,7,14,15,16,17을 사용하는 것을 알 수 있다.
이제 타이머를 설정하자.
Configuration에서 TIM2를 선택한다.
파라미터 창
위 창에서 수정한 내용을 아래에 제시하고, 부가 설명한다.
박스 쳐진 곳의 내용의 수정되었음을 알 수 있다.
*아래 설정은 이해를 돕기 위한것으로 정확하지 않습니다. 자세한 설명은 해당 포스트를 참고하세요.
파라미터 설정
- Prescaler : 분주기니 뭐니 이야기를 하는데, 그냥 간단히 클럭을 나누는것이다. 이를테면 48Mhz는 이므로 매우 주파수가 높다. 육안으로 PWM제어하는 것을 보고 싶다면 속도를 느리게 해줄 필요가 있다. 그래서 48000으로 나누어 1000hz로 동작하게 설정하였다.
- Counter Mode : 카운터가 0부터 올라가게 할 것인지, 끝에서 내려가게 할 것인지를 설정한다.
- Counter Period : 카운터의 주기를 정하는 것이다. 1000hz를 1초에 1주기로 돌게 하고 싶다면 1000으로 설정하고, 1초에 10번 주기를 돌게하고 싶다면, 100을 입력한다. 즉, TIM Clock / Prescaler / Counter Period = 한 주기
라고 보면 될 것이다. 나는 1초 간격의 주기를 가지게 하고 싶으므로 1000으로 설정하였다. - auto-reload preload : PWM 신호를 계속 반복해서 생성하고 싶으면 Enable, 아니면 Disable이다. 난 반복해서 보고싶어서 Enable로 하였다.
PWM Generation Channel1 파라미터
- Pulse : 듀티를 설정할 수 있다. Counter Period가 1000이라면, 500으로 해야 50%로 설정이 되는 셈이다.
안녕하세요, “PWM제어는 타이머로 제어한다. PA5는 타이머2를 사용한다.” 이 부분에서, PA5가 timer2를 사용한다는 것은 어디에서 알 수 있나요? Datasheet에 나와있는건가요?
이종우님 안녕하세요. 사용하시는 칩의 reference manual을 참고 부탁드립니다