打印
[技术问答]

请问有什么方法能够让单片机获取到占空比一起在变化(PWM值一直在变换)的PWM值

[复制链接]
4385|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lussby|  楼主 | 2014-5-17 08:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大家一个问题,我现在想通过一个单片机不断地获取到PWM的值,先前做过一个实验,用了新唐的单片机通过PWM捕捉的方式,读取到了PWM的占空比时间以及周期。然后通过计算把PWM的值输出来,这样的方法是可行的,但是如果PWM的值是固定的那还好,如果PWM的值一直在变化,我发现我从单片机读回来的数中间有一些已经漏了,比如我输出的PWM值是从256到1逐渐连续变化的,也就是从256,255,254,253……1,这样一直到0.可是我发现单片机读出来的数是不连续的,而是间断的。读回来的数是256,240,226,……。很不连续的一段数,求大家能否给一个方案,能够让我实时读取到PWM的值的方法,在此先谢谢每一位出言献策的朋友。:)
沙发
风之牧| | 2014-5-17 09:05 | 只看该作者
这个是不是得看你的PWM频率和采样用的单片机的频率,还有你读回显示数据的频率,我觉得理论上是可以做到的

使用特权

评论回复
板凳
niuyaliang| | 2014-5-17 10:40 | 只看该作者
是不是你的频率设置的太大了,采集的频率设置的高点

使用特权

评论回复
地板
lussby|  楼主 | 2014-5-17 10:44 | 只看该作者
风之牧 发表于 2014-5-17 09:05
这个是不是得看你的PWM频率和采样用的单片机的频率,还有你读回显示数据的频率,我觉得理论上是可以做到的 ...

恩恩,我用的是新唐的M0516LBN单片机,使用的时钟是内部RC高速晶振22MHz的。下面是我的程序。经过测试,如果是固定的PWM值是没有问题的。请麻烦帮我指点下,或者帮我看下是不是我设置的频率有问题,谢谢了。 PWM捕捉.rar (2.7 MB)

使用特权

评论回复
5
lussby|  楼主 | 2014-5-17 10:47 | 只看该作者
niuyaliang 发表于 2014-5-17 10:40
是不是你的频率设置的太大了,采集的频率设置的高点

恩恩,上面有我的程序,方便帮我看下吗?我的程序采用固定的周期采样出来的是正确的,但是如果改变了PWM值以后,却老会漏读掉中断几个PWM值。

使用特权

评论回复
6
风之牧| | 2014-5-17 10:47 | 只看该作者
lussby 发表于 2014-5-17 10:44
恩恩,我用的是新唐的M0516LBN单片机,使用的时钟是内部RC高速晶振22MHz的。下面是我的程序。经过测试, ...

这个真指点不了,我没用过这个单片机,一点都不了解,只能根据我编程的经验提一点点意见,真不好意思啊

使用特权

评论回复
7
lussby|  楼主 | 2014-5-17 11:57 | 只看该作者
风之牧 发表于 2014-5-17 10:47
这个真指点不了,我没用过这个单片机,一点都不了解,只能根据我编程的经验提一点点意见,真不好意思啊 ...

恩恩,也是,没用过这单片机要看程序要花很长时间,而且你手头也没这IC不好看效果,我再自己看看。不过还是得谢谢您。

使用特权

评论回复
8
风之牧| | 2014-5-17 13:21 | 只看该作者
lussby 发表于 2014-5-17 11:57
恩恩,也是,没用过这单片机要看程序要花很长时间,而且你手头也没这IC不好看效果,我再自己看看。不过还 ...

不用客气,互相帮助 互相进步:handshake

使用特权

评论回复
9
lussby|  楼主 | 2014-5-17 14:00 | 只看该作者
风之牧 发表于 2014-5-17 13:21
不用客气,互相帮助 互相进步

:handshake

使用特权

评论回复
10
niuyaliang| | 2014-5-17 14:17 | 只看该作者
lussby 发表于 2014-5-17 10:44
恩恩,我用的是新唐的M0516LBN单片机,使用的时钟是内部RC高速晶振22MHz的。下面是我的程序。经过测试, ...

你把PWM中断的频率改高点试试,在固定模式下,你捕捉最大频率的PWM试试

使用特权

评论回复
11
lussby|  楼主 | 2014-5-17 15:39 | 只看该作者
固定模式下是指什么呢?是不是指PWM值是固定的呀?如果固定的话,测出来的值是对的,但是固定的话,我看不出来单片机是否有漏掉一些PWM值检测不到。我现在用示波器测到的PWM值100us。我看了数据手册,好像主频到50MHZ,检测到的是1000KHZ,但是我现在用的是内部22MHZ,不知道是不是这里出了问题,另外我上面的程序那样设置,捕捉频率是多少。。这个例程是我在以前的例程上修改的。但是对M058不太熟悉。所以不太清楚怎么设置其周期。现在在慢慢看数据手册。

使用特权

评论回复
12
lussby|  楼主 | 2014-5-17 15:39 | 只看该作者
niuyaliang 发表于 2014-5-17 14:17
你把PWM中断的频率改高点试试,在固定模式下,你捕捉最大频率的PWM试试


你好,固定模式下是指什么呢?是不是指PWM值是固定的呀?如果固定的话,测出来的值是对的,但是固定的话,我看不出来单片机是否有漏掉一些PWM值检测不到。我现在用示波器测到的PWM值100us。我看了数据手册,好像主频到50MHZ,检测到的是1000KHZ,但是我现在用的是内部22MHZ,不知道是不是这里出了问题,另外我上面的程序那样设置,捕捉频率是多少。。这个例程是我在以前的例程上修改的。但是对M058不太熟悉。所以不太清楚怎么设置其周期。现在在慢慢看数据手册。再次谢谢你的回答和帮忙。

使用特权

评论回复
13
niuyaliang| | 2014-5-17 16:21 | 只看该作者
lussby 发表于 2014-5-17 15:39
你好,固定模式下是指什么呢?是不是指PWM值是固定的呀?如果固定的话,测出来的值是对的,但是固定的话 ...
        sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
        sPt.u32Frequency = 0;                        /* Set the proper frequency to capture data (Less than the input data)*/
        sPt.u8HighPulseRatio = 50;                /* High Pulse peroid : Total Pulse peroid = 50 : 100 (Set a non-zero value),no important here */
        sPt.u32Duty = 0x10000;                        /* Set the counter to the maximum value */
        sPt.u8ClockSelector = DRVPWM_CLOCK_DIV_1;
        sPt.u8PreScale = 2;
        sPt.i32Inverter = 0;                        /*no invert */
        u8CapTimer = DRVPWM_CAP0;

应该是你这里的代码决定了采集频率

使用特权

评论回复
14
haolaishi| | 2014-5-18 08:49 | 只看该作者
给你两PWM的例子,M051下

使用特权

评论回复
15
haolaishi| | 2014-5-18 08:49 | 只看该作者
实验-TFT【PWM脉冲捕捉】.rar (78.5 KB)

使用特权

评论回复
16
haolaishi| | 2014-5-18 08:50 | 只看该作者
实验-TFT【PWM脉宽捕捉】.rar (77.51 KB)

使用特权

评论回复
17
lussby|  楼主 | 2014-5-19 10:59 | 只看该作者
haolaishi 发表于 2014-5-18 08:50

谢谢分享。我下载下来测试看看,谢谢!:)

使用特权

评论回复
18
xiaobinshenzhen| | 2015-2-9 11:26 | 只看该作者
学习学习

使用特权

评论回复
19
jisy15| | 2016-3-17 08:52 | 只看该作者
学习

使用特权

评论回复
20
a_ziliu| | 2016-3-22 14:12 | 只看该作者
這個問題有cpu的速度限制。
如果當pwm capture中斷發生,cpu來不及處理時,capure值就會抓取錯誤。
另外在capture中有計算的話,進出中斷上面也會有問題。

後來的ic有個pwm capture加上pdma,用硬體去補抓plus時間,會比較有效率。

使用特权

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

本版积分规则

14

主题

144

帖子

1

粉丝