티스토리 뷰

오늘은 조종기 신호를 수신하는 SBUS 리시버의 output data를 이용하여 드론의 PWM을 생성해보는 방법에 대해서 알아보겠습니다.


STM32 MCU를 이용하여 설명하겠습니다.


오늘 이 포스팅을 통해 어떤 하드웨어가 출력하는 PWM의 주기와 Duty Cycle을 MCU Timer 세팅을 통해 그대로 구현해 볼 수 있을 것입니다.


최근 진행했던 드론 프로젝트의 구성을 예로 설명하겠습니다.




SBUS 리시버가 출력하는 PWM 파형 분석

프로젝트에 사용했던 SBUS 리시버에서 출력하는 PWM을 오실로스코프를 통해 확인해보니 다음과 같은 결과가 있었습니다.


PWM 주기 : 15ms
HIGH duration(한 펄스에서 HIGH가 차지하고 있는 시간) : 1.1ms ~ 1.94ms

HIGH duration 범위를 보고 Duty Cycle의 범위를 계산해보면
최솟값 : 1.1ms / 15ms * 100 = 7.333...%
최댓값 : 1.94ms / 15ms * 100 = 12.9333...%이므로
약 7.333% ~ 12.9333%의 범위를 가지게 됩니다.



PWM 주기 설정을 위해 STM32 MCU Timer 세팅

SBUS 리시버에서 출력하는 PWM의 주기가 15ms이므로 똑같은 주기의 PWM을 출력할 수 있도록 STM32CubeMX에서 Timer 세팅을 해줍니다.

저는 현재 Timer 1번을 사용하고 있는데 사용 중인 MCU 데이터시트를 살펴보니 APB1과 APB2 중 APB2의 클럭을 공급받는다고 나와있습니다.


 

현재 APB2 timer clocks에는 168MHz가 공급되므로 이 클럭을 이용하여 15ms 주기 PWM을 만들기 위해 필요한 값들을 다음과 같이 세팅했습니다.


Prescaler : 39

Counter Period : 62999


15ms 주기를 주파수로 변환하면 f = 1 / 15ms = 66.6666...Hz입니다.

168MHz / (39 + 1)(Prescaler) / (62999 + 1)(Counter Period) = 66.6666...Hz이므로 맞는 것 같네요.




Duty Cycle의 범위를 통한 Pulse(CCR) 범위 계산


그럼 한번 이전에 구한 Duty Cycle의 범위와 현재 구한 Counter Period 값을 가지고 실제로 Duty Cycle을 조정하기 위한 값인 Pulse의 범위를 구해보겠습니다.


Duty Cycle의 범위 : 7.333...% ~ 12.9333...%

Counter Period : 62999


이 상황에서 Pulse의 최솟값, 최댓값은 

최솟값 : ((62999 + 1) * 7.333) / 100 - 1 = 4619

최댓값 : ((62999 + 1) * 12.9333) / 100 - 1 = 8147


Counter Period에 Duty Cycle의 최소, 최대를 곱하면 구할 수 있습니다.


이 말은 즉슨, 7.333%의 Duty Cycle을 출력하기 위해선 현재 63000개의 클럭을 세는 동안 한 PWM 파형이 출력되므로 63000의 7.333%인 4619개의 클럭을 세는 동안은 HIGH를 출력하라는 의미가 됩니다.

이 값이 바로 최솟값이 되구요.

최댓값 같은 경우에는 그냥 Duty Cycle의 최댓값을 곱하면 되겠죠?




실시간으로 어떤 출력값을 사용하여 원하는 Duty Cycle의 범위로 PWM 생성 방법


소제목이 어려워 잘 이해가 안 가실 것 같아 쉽게 예를 들어 설명하자면, 지금 현재 사용하고 있는 SBUS 리시버의 데이터(352~1696의 범위)를 가지고 원하는 Duty Cycle의 범위(7.333% ~ 12.9333%) 안에서 PWM 파형을 변형시키면서 출력하는 방법이라는 의미입니다.


일단 제가 진행한 프로젝트에서 사용한 공식은 다음과 같습니다.


일단 변수에 대해 설명하자면 다음과 같습니다.

sbus data : 현재 들어온 SBUS 리시버의 데이터(나중에는 PID 제어기를 사용하므로 PID 제어기 출력값으로 보시는 게 

               좋습니다.)

max, min sbus data : SBUS 리시버가 출력할 수 있는 최소, 최댓값

max, min pulse : 위에서 구했던 Pulse의 최소, 최댓값


일단 코드 상으로는 위와 같이 사용했었는데 좀 식을 쉽게 풀어보자면


이렇게 됩니다.



일단 각 부분이 어떤 것을 의미하는지 간단하게 설명하자면(지금 이해 못해도 괜찮습니다. 추후에 더 자세히 설명할 예정입니다.)

이렇게 됩니다.(이해하시기 쉽게 설명하고자 약간의 오바(?)스러움이 있는 점은 양해부탁드립니다.)


이 식이 어떻게 나오게 되는지 설명하기에는 양이 너무 많이 걸릴 것 같아 다음 포스팅에 올려놓도록 하겠습니다.


오늘 이 포스팅을 통해 어떤 하드웨어에서 출력하는 PWM의 주기대로 STM32 MCU에서 똑같이 세팅하는 방법에 대해서 살펴보았습니다.

다음 포스팅에는 실시간으로 변하는 데이터를 토대로 Duty Cycle도 그 범위에 맞춰 변경하는 방법에 대해서 올려놓겠습니다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함