全部文档
OneOS简介 硬件支持 快速开发指南 编译构造工具 API参考文档 高级语言 用户编程手册 应用笔记 FAQ

PWM设备


API列表

函数 说明
os_device_find() 查找PWM设备
os_device_control() 控制PWM设备,可以设置周期、占空比、开关设备

os_device_find

该函数根据PWM设备名查找对应的PWM设备设备,函数原型如下:

os_device_t *os_device_find(const char *name);
参数 说明
name 设备名称
返回 说明
设备指针 查找到对应设备将返回相应的设备指针
OS_NULL 没有找到设备

os_device_control

该函数用于控制PWM设备参数,函数原型如下:

os_err_t os_device_control(os_device_t *dev, int cmd, void *arg);
参数 说明
dev 设备指针
cmd 命令控制字
arg 控制的参数
返回 说明
OS_EOK 函数执行成功
其他错误码 失败

脉冲编码器支持的命令控制字如下所示:

控制字 说明
OS_PWM_CMD_ENABLE 启动PWM设备
OS_PWM_CMD_DISABLE 停止PWM设备
OS_PWM_CMD_SET_PERIOD 设置PWM周期
OS_PWM_CMD_SET_PULSE 设置占空比

注意事项

  1. PWM的输出频率由周期时间period决定,例如周期时间为0.5ms(毫秒),则period值为500000ns(纳秒),输出频率为2KHz,占空比为pulse/period(注意定时器频率带来的误差),pulse值不能超过period。
  2. pulse和period设置独立,如STM32的PWM设备在设置period时不需要通道信息,则通道信息直接给0;
  3. period设置具有特殊性,如STM32的PWM设备设置period将改变多个通道,因此在修改周期时将把所有的通道进行自动停止,重新设定确认无误后,请调用指令打开。

使用示例

PWM设备使用示例

PWM设备的具体使用方式可以参考如下示例代码,示例代码的主要步骤如下:

  1. 查找PWM设备获取设备指针。
  2. 设置PWM周期和脉冲宽度。
  3. 使能PWM设备。
  4. while循环里每50毫秒修改一次脉冲宽度。
  5. 如果将PWM通道对应引脚和LED对应引脚相连,可以看到LED周期性由暗变到亮,然后又从亮变到暗;其他情况可以通过示波器观察。
#include <drv_cfg.h>
#include <os_device.h>
#include <os_clock.h>
#include <stdlib.h>

#ifdef OS_USING_SHELL
#include <shell.h>
#endif

int pwm_led_sample(int argc, char **argv)
{
    os_err_t    ret    = OS_EOK;
    os_uint32_t count  = 0;
    os_uint32_t period = 5000000; 
    os_uint32_t dir    = 1;      
    os_uint32_t pulse  = 0;      
    os_uint32_t channel  = 0;

    char *dev_name;
    struct os_device *pwm_dev = OS_NULL;


    if (argc != 3)
    {
        os_kprintf("usage: pwm_led_sample <dev> <channel>\r\n");
        os_kprintf("       pwm_led_sample pwm_tim1 1 \r\n");
        return -1;
    }

    dev_name = argv[1];
    channel  = strtol(argv[2], OS_NULL, 0);

    pwm_dev = os_device_find(dev_name);
    if (pwm_dev == OS_NULL)
    {
        os_kprintf("pwm sample run failed! can't find %s device!\n", dev_name);
        return OS_ERROR;
    }

    os_device_control(pwm_dev, OS_PWM_CMD_SET_PERIOD, period);

    os_device_control(pwm_dev, OS_PWM_CMD_SET_PULSE, pulse);

    os_device_control(pwm_dev, OS_PWM_CMD_ENABLE, &channel);

    while (count < 6)
    {
        os_task_mdelay(10);
        if (dir)
        {
            pulse += 100000;
        }
        else
        {
            pulse -= 100000;
        }
        if (pulse >= period)
        {
            dir = 0;
            count++;
            os_kprintf("PWM testing %d %d!\n", period, count);
        }
        if (0 == pulse)
        {
            dir = 1;
        }

        ret = os_device_control(pwm_dev, OS_PWM_CMD_SET_PULSE, pulse);
        if (ret != OS_EOK)
        {
            if (ret == OS_ENOSYS)
            {
                os_kprintf("PWM channel not exist!\n");
                return ret;
            }
        }
    }
    return ret;
}
/* Export to msh command list */
SH_CMD_EXPORT(pwm_led_sample, pwm_led_sample, "test_pwm_led_sample!");

运行结果如下:

sh />pwm_led_sample
PWM testing 5000000 0!
PWM testing 5000000 1!
PWM testing 5000000 2!
PWM testing 5000000 3!
PWM testing 5000000 4!
PWM testing 5000000 5!
PWM testing 5000000 6!

results matching ""

    No results matching ""