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 ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋๊ฐ๋ค.
pwmWriteServo() ํจ์๋ฅผ ํตํด PWM์ ํธ๋ฅผ ๋ณด๋ธ๋ค. ์ผ๋ฐ ์๋ณด๋ชจํฐ 50Hz ๋ก PWM์ ํธ๋ฅผ ๋ณด๋ธ๋ค.
void pwmWriteServo(uint8_t index, uint16_t value)
{
if (index < numServos)
*servos[index]->ccr = value;
}
pwmWriteMotor() ํจ์๋ฅผ ํตํด ๋ชจํฐ PWM์ ํธ๋ฅผ ๋ณด๋ธ๋ค.
void pwmWriteMotor(uint8_t index, uint16_t value)
{
if (index < numMotors)
pwmWritePtr(index, value);
}