PWM的高低时间

Viewed 46

一、描述你遇到的问题

示例代码直接给数值,单位是什么?

二、你具体做的所有步骤结果截图


通过uapi_pwm_get_frequency获取频率40MHz,转换0.025us

这里会触发检测不超过0xFFFF,我想要周期为30ms的10ms高电平的PWM波,该怎么获取?

2 Answers

根据您的需求,您需要生成一个周期为 30ms、高电平时间为 10ms 的 PWM 波。以下是如何配置的步骤:

  • 1.计算周期和占空比:
    周期为 30ms,高电平时间为 10ms,因此占空比为 10ms / 30ms = 1/3。

  • 2.配置 PWM 参数:
    使用uapi_pwm_open接口打开 PWM 通道,并配置low_time和high_time。

  • low_time为低电平时间,即 20ms。
  • high_time为高电平时间,即 10ms。
  • 3.启动 PWM:
    使用uapi_pwm_start接口启动 PWM 输出。

示例代码如下:

#include "pwm.h"

void configure_pwm() {
    pwm_channel_t channel = 0; // 选择PWM通道
    pwm_config_t cfg = {
        .low_time = 20000,  // 20ms低电平时间
        .high_time = 10000, // 10ms高电平时间
        .cycles = 0,        // 循环次数,0表示无限循环
        .repeat = true       // 重复输出
    };

    uapi_pwm_init();
    uapi_pwm_open(channel, &cfg);
    uapi_pwm_start(channel);
}

请确保在调用uapi_pwm_start之前,已经正确配置了low_time和high_time,并且这些值不超过 0xFFFF。

非也,照你这么配置得出的PWM周期为0.3751ms


在这可以看出他是将高低时间相加作为分频系数,而我之前也问过分频系数的高十六位配置失败,也就是说分频系数最大0XFFFF,但是根据我测量的数据,大于0XFFF的分频系数会缩小一半,连周期1ms的PWM都获取不了,目前只想到用模拟IO来实现,但会占用cpu,求解