概要
PWM 相关的硬件配置很简单,基本都是直接操作寄存器来实现。操作寄存器的 API ⼤都定义在 pwm.h 中,B85 共 12 路 PWM,分别为 PWM0 ~ PWM5 和 PWM0_N ~ PWM5_N,软件上只设置 6 路 PWM0 ~ PWM5,另外 6 路 PWM0_N ~ PWM5_N 是对应 PWM 的波形取反
整体架构流程
PWM ID 和管脚
使⽤ void gpio_set_func(GPIO_PinTypeDef pin, GPIO_FuncTypeDef func) 来设置对应管脚的 PWM 功能;
⽐如要使⽤ PA2 作为 PWM0 来⽤:
gpio_set_func(GPIO_PA2, AS_PWM0);
PWM 时钟
使⽤ API void pwm_set_clk(int system_clock_hz, int pwm_clk) 来设置 PWM 的 clock。
如果想要 PWM 时钟为 8M,可按如下设置,不管系统时钟如何变化(CLOCK_SYS_CLOCK_HZ 为 16000000、24000000 或 32000000),PWM clock 都是 8M。
pwm_set_clk(CLOCK_SYS_CLOCK_HZ, 8000000);
PWM 周期(cycle)和占空⽐(duty)
void pwm_set_cycle_and_duty(pwm_id id, unsigned short cycle_tick, unsigned short cmp_tick)
⽐如当前的 pwm clock 为 8MHz,需要设置 PWM 周期为 1ms、占空⽐为 50% 的 PWM0 ⼀个 frame ⽅法为:
pwm_set_cycle_and_duty(PWM0_ID, 8000, 4000);
PWM 开启和停⽌
void pwm_start(pwm_id id) ;
void pwm_stop(pwm_id id) ;
技术名词解释
如下设置了一个周期为1K占空比为50%,从PB3引脚输出的PWM波形
gpio_set_func(GPIO_PB3, AS_PWM0_N);
pwm_set_clk(CLOCK_SYS_CLOCK_HZ, 8000000);//8M时钟
pwm_set_cycle_and_duty(PWM0_ID, 8000, 4000);//1k周期,占空比为50%
pwm_start(PWM0_ID);
技术细节
提示:输出pwm期间一定要保证MCU不会进入睡眠模式,否则PWM会停止输出