Baseflight PWM - FabLabSeoul/WingProject GitHub Wiki
์ด ๊ธ์ ์คํ ์์ค Baseflight ํ๋ก์ ํธ ์์ค๋ฅผ ๋ถ์ํ ๊ธ์ด๋ค.
์์ ์์ค๋ STM32\stm32vldiscovery_package\Project\Examples\PWM_Baseflight ๊ฒฝ๋ก์ ์๋ค.
PA10,9 (Rx,Tx) ์ USART ํฌํธ๋ก ์ฌ์ฉ๋๋ฉฐ, ๋๋ฒ๊น ์ฉ printf() ํจ์๋ฅผ ์ํด ์ฐ์ธ๋ค. PA8 ์์ ์๋ณด์ฉ 50Hz PWM ์ ํธ๊ฐ ๋์จ๋ค. ์์ ์์๋ Servo ๋ชจํฐ๋ฅผ -90 ~ +90 ๋ ์ฌ์ด๋ฅผ ์ค๊ฐ๊ฒ ํ๋ค.
Baseflight์ PWM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ drv_pwm.h, drv_pwm.c ๋ก ๊ตฌ์ฑ๋์ง๋ง, drv_timer.c, drv_timer.h ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ด์ผ ๋์ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก PWM์ ํ์ด๋จธ์ ๊ฐ์ด ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
typedef struct {
volatile uint16_t *ccr;
volatile uint16_t *cr1;
volatile uint16_t *cnt;
uint16_t period;
// for input only
uint8_t channel;
uint8_t state;
uint16_t rise;
uint16_t fall;
uint16_t capture;
} pwmPortData_t;
- pwmPortData_t ๊ตฌ์กฐ์ฒด
- ์ฌ์ฉ ์ค์ธ PWM ํฌํธ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ์ ํํ ๋งํ์๋ฉด, ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ , ์ค์ ํ ์ ์๋ค.
- baseflight๋ ๋ฏธ๋ฆฌ ์ ํด์ง PWM1 ~ PWM14 ํฌํธ ์คํ๋๋ฅผ ์ ํํด ์ ๋ ฅ์ฉ๊ณผ ์ถ๋ ฅ์ฉ์ผ๋ก ํฌํธ๋ฅผ ์ค์ ํ๋ค.
- ๊ฐ๊ฐ์ PWM1~14 ํฌํธ๋ง๋ค GPIO ์ Pin, Channel์ด ๊ฒฐ์ ๋ ์ํ๋ค. ๊ทธ๋์ ์ด๋ค PWM์ ์ธ๊ฑด์ง๋ง ๊ฒฐ์ ๋๋ฉด, ๋๋จธ์ง๋ ์๋ํ๋๊ฒ ์ค๊ณ๋์๋ค.
- const timerHardware_t timerHardware[];
pwmInit() ํจ์์์ ๋ฏธ๋ฆฌ ์ ํด์ ธ์๋ multiPPM, multiPWM ๋ฐฐ์ด๋ก PWM ํฌํธ๋ฅผ ์์ฑํ๋ค. ์ด ๋ gps ๋ adc ์ฉ์ผ๋ก ํฌํธ๊ฐ ์ฐ์ธ๋ค๋ฉด, ํด๋น PWM ํฌํธ ๋์ด๊ฐ๊ณ ๋ค์ PWM ํฌํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ต๋ PWM14๊น์ง ์ธ์ ์๋๋ก ํ๋ก๊ทธ๋๋ฐ ๋์๋ค. ๋๋จธ์ง๋ ์ผ๋ฐ PWM ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋๊ฐ๋ค.
์๋ณด๋ชจํฐ PWM ์ ํธ
pwmWriteServo() ํจ์๋ฅผ ํตํด PWM์ ํธ๋ฅผ ๋ณด๋ธ๋ค. ์ผ๋ฐ ์๋ณด๋ชจํฐ 50Hz ๋ก PWM์ ํธ๋ฅผ ๋ณด๋ธ๋ค.
void pwmWriteServo(uint8_t index, uint16_t value)
{
if (index < numServos)
*servos[index]->ccr = value;
}
๋ชจํฐ PWM ์ ํธ
pwmWriteMotor() ํจ์๋ฅผ ํตํด ๋ชจํฐ PWM์ ํธ๋ฅผ ๋ณด๋ธ๋ค.
void pwmWriteMotor(uint8_t index, uint16_t value)
{
if (index < numMotors)
pwmWritePtr(index, value);
}