PWM 子系统 PWM原理 利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其本质是一种对模拟信号电平进行数字编码的方法。在嵌入式设备中,PWM多用于控制马达、LED、振动器等模拟器件。
脉冲周期(T),单位是时间,ns, us ,ms。 脉冲频率(f),单位是赫兹(Hz),与脉冲周期成倒数关系,f=1/T。 脉冲宽度(W),简称“脉宽”,是脉冲高电平持续的时间。单位是时间,ns, us, ms。 占空比(D),脉宽除以脉冲周期的值。 W = ton
T = ton + toff = 1/f
D = ton / (ton+ toff) = ton / T
PWM consumer /* include/linux/pwm.h */ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); int pwm_enable(struct pwm_device *pwm); void pwm_disable(struct pwm_device *pwm); int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state); pwm_config,用于控制PWM输出信号的频率和占空比,其中频率是以周期(period_ns)的形式配置的,占空比是以有效时间(duty_ns)的形式配置的。
pwm_enable/pwm_disable,用于控制PWM信号输出与否。
pwm_apply_state需要定义一个pwm_state,可以一下子修改period/duty_cycle/polarity/enabled。
上面的API都以struct pwm_device类型的指针为操作句柄,该指针抽象了一个PWM设备,那么怎么获得PWM句柄呢?使用如下的API:
/* include/linux/pwm.h */ struct pwm_device *pwm_get(struct device *dev, const char *con_id); struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id); void pwm_put(struct pwm_device *pwm); struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, const char *con_id); void devm_pwm_put(struct device *dev, struct pwm_device *pwm); pwm_get/devm_pwm_get,从指定设备(dev)的DTS节点中,获得对应的PWM句柄。可以通过con_id指定一个名称,或者会获取和该设备绑定的第一个PWM句柄。设备的DTS文件需要用这样的格式指定所使用的PWM device:...