PWM

[已解决]PWM输出异常分析

发布于 2016-10-25 12:35:18
这几天打算将IoT_Camera板子装在一辆玩具小车上,由于小车使用的是无刷电机+电调的驱动组合,因此需要使用PWM来驱动电调。在调试过程中需要用到频率为50Hz的PWM输出,其中高电平的宽度在1ms~2ms之间。

那么问题来了,我是用的SDK工程中的pwm_demo.c来配置PWM波形,vpwm_test.c代码也是一样的。基本配置如下:
代码1.

pwm.id = id;
pwm.period_ns = period_us*1000;
pwm.counter_ns = high_us*1000;
rt_device_control(vpwmDevice, SET_PWM_DUTY_CYCLE, &pwm);


其中period_ns指pwm的周期,单位为纳秒。比如50Hz的波,周期为20ms,则设为20,000,000。
counter_ns则代表高电平的占空长度,单位为纳秒。此处需要2ms,则设为2,000,000即可。

然而问题并不像我想象中的那么easy,使用示波器测量发现实际波周期只有3.6ms,高电平时间倒是有2ms。因此决定去分析代码,看到pwm.c line112处的代码:
代码2.

if(duty == period)
{
reg = (duty & 0xfff) << 16 | (0 & 0xfff);
}
else
{
reg = (duty_revert & 0xfff) << 16 | (period & 0xfff);
}

PRINT_PWM_DBG("set duty_revert: %d, period: %d, reg: 0x%x
", duty_revert, period, reg);

PWM_SetPwmCmd(pwm_obj, pwm->id, reg);
return 0;
}


代码中的period表示pwm周期,duty代表高电平宽度,duty_revert代表低电平宽度,经实际测试,单位为us。在代码2之前添加设置为:
代码3.

period = 1000;
duty = 200;
duty_revert = period - duty;


则示波器捕获显示PWM波形正常,周期1ms,高电平200us,而设置改为:
代码4.

period = 20000;
duty = 2000;
duty_revert = period - duty;


则输出的波形还是和demo的效果一样,仔细看可发现,在代码2中,reg的周期及高电平存储位只有0xfff,显然当周期为20000时存储值溢出被截断了。也没有相关的芯片手册可参考,此处自作聪明的改成0xffff,示波器检测波形还是和demo的输出效果一样,不知此处的问题出在哪里?

查看更多

关注者
0
被浏览
3.2k
4 个回答
独行客
独行客 2016-10-25

我测试的是38kHZ方波,可以,比较准确!

你试试,不会是脉宽周期是有范围的,你看看pwm的源码,不会是超出范围了??
liuluqqzj
liuluqqzj 2016-10-25

我测试的是38kHZ方波,可以,比较准确!

你试试,不会是脉宽周期是有范围的,你看看pwm的源码,不会是超出范围了??



我感觉是超过范围了,我测了别的周期也是正常的,目测4ms内都是正常的。
喝水的面包
喝水的面包 2016-10-26
pwm的0,1,2 三个通道的输出频率范围:1khz-100khz,实现其他频率建议使用3,4通道,这些通道是gpio虚拟的pwm。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览