打印
[技术问答]

关于PWM捕获的一些不解

[复制链接]
2287|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
_寒寒_|  楼主 | 2015-9-30 17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用新唐M0有一段时间了。发现新唐的数据手册真的是博大精深啊。其中,关于pwm捕获的内容比较少,不过其中还是提到了高低脉宽的计算方式。在英文版的227页上写了


In this case, the CNR is 8:
1. The PWM counter will be reloaded with CNRx when a capture interrupt flag (CAPIFx) is set.
2. The channel low pulse width is (CNR + 1 – CRLR).
3. The channel high pulse width is (CNR + 1 – CFLR).


即 CRLR和CFLR可以认为保存了高低电平的时间。然后,官方给的demo中却是这样


    while(u32i < 4)
    {
        /* Wait for Capture Falling Indicator */
        while(PWM_GetCaptureIntFlag(PWM, u32Ch) < 2);

        /* Clear Capture Falling and Rising Indicator */
        PWM_ClearCaptureIntFlag(PWM, u32Ch, PWM_CAPTURE_INT_FALLING_LATCH | PWM_CAPTURE_INT_RISING_LATCH);

        /* Get Capture Falling Latch Counter Data */
        u32Count[u32i++] = PWM_GET_CAPTURE_FALLING_DATA(PWM, u32Ch);

        /* Wait for Capture Rising Indicator */
        while(PWM_GetCaptureIntFlag(PWM, u32Ch) < 2);

        /* Clear Capture Rising Indicator */
        PWM_ClearCaptureIntFlag(PWM, u32Ch, PWM_CAPTURE_INT_RISING_LATCH);

        /* Get Capture Rising Latch Counter Data */
        u32Count[u32i++] = PWM_GET_CAPTURE_RISING_DATA(PWM, u32Ch);
    }

    u16RisingTime = u32Count[1];

    u16FallingTime = u32Count[0];

<font color="#ff0000">    u16HighPeroid = u32Count[1] - u32Count[2];</font>

<font color="#ff0000">    u16LowPeroid = 0x10000 - u32Count[1];</font>

    u16TotalPeroid = 0x10000 - u32Count[2];
完全搞不懂了,我到底是要以文档为主呢,还是以demo为主了。重点是,这些都是从官方下载的,都是亲生的 ╮(╯_╰)╭

沙发
稳稳の幸福| | 2015-9-30 19:18 | 只看该作者
你要看看DEMO运行正确不正确,如果运行正确,那就是说明文档是错的,如果运行错误,就是文档正确的。

使用特权

评论回复
板凳
cspoly| | 2015-10-1 10:56 | 只看该作者
那段說明是配合圖的範例.
PWM Capture的計數器重置是在中斷觸發的時候, 文件的範例是上升沿和下降沿都有觸發.
不過sample code只有始能下降沿觸發中斷, 所以在下降沿的時候才會將記數器重置.
樓主可以看看CalPeriodTime()上面說明的圖.

使用特权

评论回复
地板
mintspring| | 2015-10-4 08:17 | 只看该作者
PWM我一直都是稀里糊涂,反正会用,也不是很精通,都是抄人家的例子,自己修修改改。

使用特权

评论回复
5
734774645| | 2015-10-4 11:11 | 只看该作者
这个可以驱动运放,然后做音响

使用特权

评论回复
6
_寒寒_|  楼主 | 2015-10-8 11:07 | 只看该作者
本帖最后由 _寒寒_ 于 2015-10-8 11:15 编辑
cspoly 发表于 2015-10-1 10:56
那段說明是配合圖的範例.
PWM Capture的計數器重置是在中斷觸發的時候, 文件的範例是上升沿和下降沿都有觸 ...

原来如此,这样这说就懂了,谢谢哈,文档上关于捕获的描述还是比较少

使用特权

评论回复
7
_寒寒_|  楼主 | 2015-10-8 11:18 | 只看该作者
mintspring 发表于 2015-10-4 08:17
PWM我一直都是稀里糊涂,反正会用,也不是很精通,都是抄人家的例子,自己修修改改。 ...

水水更健康

使用特权

评论回复
8
lovecat2015| | 2015-10-8 13:29 | 只看该作者
这个确实够麻烦的啊,楼主找一下问题吧

使用特权

评论回复
9
_寒寒_|  楼主 | 2015-10-8 13:32 | 只看该作者
lovecat2015 发表于 2015-10-8 13:29
这个确实够麻烦的啊,楼主找一下问题吧

cspoly 已经解答了

使用特权

评论回复
10
mintspring| | 2015-10-8 21:13 | 只看该作者
捕获是两次中断之间的时间吗?

使用特权

评论回复
11
mintspring| | 2015-10-8 21:13 | 只看该作者
PWM的捕获是什么意思啊,是测量PWM脉冲宽度的时间吗?

使用特权

评论回复
12
mintspring| | 2015-10-8 21:14 | 只看该作者
捕捉,捕捉未知值,比如测脉冲宽度,捕捉触发时,把tmer的值读到ccp 比较,未知值和设定值比较,tmer的值和ccp设定值一旦相等就触发中断,处理相应问题

使用特权

评论回复
13
quray1985| | 2015-10-8 21:35 | 只看该作者
不知道新唐的Arduino的servo该如何写啊

使用特权

评论回复
14
_寒寒_|  楼主 | 2015-10-10 11:28 | 只看该作者
mintspring 发表于 2015-10-8 21:14
捕捉,捕捉未知值,比如测脉冲宽度,捕捉触发时,把tmer的值读到ccp 比较,未知值和设定值比较,tmer的值和 ...

找份stm32的datasheet去看看就知道了

使用特权

评论回复
15
_寒寒_|  楼主 | 2015-10-10 11:29 | 只看该作者
quray1985 发表于 2015-10-8 21:35
不知道新唐的Arduino的servo该如何写啊

Arduino??????

使用特权

评论回复
16
598330983| | 2015-10-10 17:28 | 只看该作者
servo是什么,第一次听说,Arduino这个目前新唐有开发板已经提供兼容接口了

使用特权

评论回复
17
mintspring| | 2015-10-10 17:57 | 只看该作者
确实要找份手册看看,要不好多功能你不清楚怎么回事,目前缺的就是中文手册。

使用特权

评论回复
18
IversonCar| | 2015-10-11 08:28 | 只看该作者
你是说代码和文档有出入?

使用特权

评论回复
19
C洛达尔多| | 2015-10-12 08:36 | 只看该作者
应该没什么问题的,讲的挺清楚的

使用特权

评论回复
20
gejigeji521| | 2015-10-12 17:33 | 只看该作者
发现新唐的数据手册真的是博大精深啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

94

帖子

1

粉丝