[技术问答]

N76E003的pwm,要求每个周期(32us)结束后占空比都要变化

[复制链接]
2626|18
手机看帖
扫描二维码
随时随地手机跟帖
kevinleez|  楼主 | 2019-2-17 00:18 | 显示全部楼层 |阅读模式
PWM设置为8位,CPU频率16MHZ,2分频,所以一个PWM周期是32us,需要在一个PWM周期(32us)结束后,重新加载的PWM5L和PWM5H的值都不同(音频采集来的信号)。
目前使用的方法是设置一个定时器中断15us(PWM周期32us的一半还少一点),每次进入定时器中断去判断LOAD是否为0,如果为0,那么说明前一次的PWM5被加载到当前将要输出的PWM内部BUF中了,我就重新修改PWM5的值,如果LOAD还是为1,那么我就退出中断。但是发现很多时候,同一个PWM5的值会被输出2次。。。。。
中断里的程序如下:
if(!LOAD){
                set_SFRPAGE;    //PWM4 and PWM5 duty seting is in SFP page 1       
                PWM5H = 0x00;
                PWM5L =新数据;       
                clr_SFRPAGE;
                set_LOAD;

}

后来翻阅资料,发现是否可以这样做?我对PWM5进行中心对齐模式,然后使用“中心点中断方式”,在中断的时候,正好是中心点,一个PWM周期执行到一半,此时进入中断,重新对PWM5进行赋值,是否可以?(只是发现理论上一个PWM的周期会变长一倍,从32us变成64us?)这种方式还没有去验证,要周一才能确定,先在论坛上请教一下各位大侠。


二九结狐六体| | 2019-2-17 08:37 | 显示全部楼层
这个,就不太清楚了啊!

使用特权

评论回复
稳稳の幸福| | 2019-2-17 09:47 | 显示全部楼层
因为你执行中断时候第二次已经装载了,而PWM修改生效要等当前没有执行完的周期执行完才行。所以你可以让中断在刚执行时候触发,不要等完成后触发。

使用特权

评论回复
tianxj01| | 2019-2-17 10:21 | 显示全部楼层
其实,你完全不需要这样操作,用典型的边沿对齐的PWM中断,在每个PWM周期完成后,刷新PWM数据,就已经完成了你需要的每个PWM周期都必须更新PWM数据的要求了,没有仔细分析过003内部PWM数据缓存过程,不过一般来说在这个PWM周期结束时候更新数据,应该是在间隔一个PWM周期后开始输出,也就是说,你实现了没周期同步更新PWM数据,只是实际更新过程被延迟了一个PWM周期而已,这样情况,对任何要求的应用都应该没问题的。

使用特权

评论回复
gx_huang| | 2019-2-17 10:48 | 显示全部楼层
我原来用中颖的MCU,用于三相变频电机驱动,有PWM归零中断,很方便。
后来试图用N76E003,只能改为每个周期中心点中断,周期确实会长一倍,需要调整PWM周期。
N76E003的PWM中断不友好,在边沿对齐模式,只有管脚边沿触发中断,没有周期归零中断,只有中心对齐模式,才有周期归零中断。
在边沿对齐模式,只有管脚边沿触发中断,但是,万一PWM输出一直低或者一直高,就不会触发中断了。

使用特权

评论回复
tianxj01| | 2019-2-17 11:16 | 显示全部楼层
gx_huang 发表于 2019-2-17 10:48
我原来用中颖的MCU,用于三相变频电机驱动,有PWM归零中断,很方便。
后来试图用N76E003,只能改为每个周期 ...

看了看N76E003的图17-7.(PWM 中断类型 ),确实,说的是PWM周期完成中断,实际上,对于边沿对齐,该中断只能发生在PIN边沿,而不是PWM周期边沿,如果PWM为连续高或者低,都将停止中断发生,只有中心对齐,才有PWM周期到顶或者到底的中断。而不关PIN状态。这样的话,要使用该同步中断,要么进行最大最小占空比限制,要不就必须采用中心对齐方式,限制的对输出其实影响是信号输出的动态范围,而且加入判断,会导致高速中断占用的时间资源过高。而中心对齐的话,要么是PWM最大分辨率下面周期变大一倍,要么是同周期下面,分辨率减小一半。

使用特权

评论回复
稳稳の幸福| | 2019-2-17 15:13 | 显示全部楼层
怎么使用定时器中断啊,使用PWM中断,这样可以设置中断的位置。

使用特权

评论回复
稳稳の幸福| | 2019-2-17 15:20 | 显示全部楼层
522905c690b39b9804.png

使用特权

评论回复
稳稳の幸福| | 2019-2-17 15:21 | 显示全部楼层
83935c690b8771816.png

使用特权

评论回复
zhuomuniao110| | 2019-2-17 20:45 | 显示全部楼层
就是每个周期的占空比要不同呗,肯定需要使用中断修改这个了,根据这个手册,肯定是当前周期内修改下次的,本周期完成后再生效。

使用特权

评论回复
小灵通2018| | 2019-2-17 22:11 | 显示全部楼层
几种都试试啊,是不是模式没有选择对

使用特权

评论回复
小灵通2018| | 2019-2-17 22:13 | 显示全部楼层
或者设置个启动PWM后就中断。比如一个PWM周期是低电平+高电平组成,你可以设置上升沿中断里面修改。甚至下降沿好像也可以,就是启动后不就是立马一个下降沿了。

使用特权

评论回复
小灵通2018| | 2019-2-17 22:13 | 显示全部楼层
等你设置好新的占空比后,已经执行一部分了,所以不影响当前的周期。

使用特权

评论回复
小灵通2018| | 2019-2-18 10:01 | 显示全部楼层
这个问题楼主搞定了没

使用特权

评论回复
xixi2017| | 2019-2-18 15:37 | 显示全部楼层
没这个板子,没法玩。

使用特权

评论回复
antusheng| | 2019-2-21 18:53 | 显示全部楼层
没消息了。

使用特权

评论回复
xuanhuanzi| | 2019-2-22 18:29 | 显示全部楼层
楼主最后怎么实现了?

使用特权

评论回复
yiy| | 2019-2-22 22:16 | 显示全部楼层
你用P定时器中断肯定跟不上自动的PWM,你中断时间金钱了,但是时间太短,你的指令进去后说不定当前结束了。

使用特权

评论回复
pigluffy| | 2019-2-22 23:34 | 显示全部楼层
本帖最后由 pigluffy 于 2019-2-22 23:56 编辑

樓主的目的就是跑32us的pwm,每次的duty都要不一樣;
那只要再多一個定時器出來固定跑32us進中斷更改duty寬度即可。

實現的方法可以讓pwm做邊緣對齊,然後pwm只需要做一次pwm週期的終點中斷,做第一次的32us timer啟動週期性中斷即可達成目的。

由於是利用pwm週期的終點中斷做第一次的32us timer啟動,所以32us timer一定會比pwm週期晚更新,就不用怕duty更改還會是舊的。

32us的timer中斷優先權可設最高讓duty更改的動作快點完成,避免還沒做完pwm週期就先完成,這樣就能確保下一次的pwm duty是新更改的。

使用特权

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

本版积分规则

46

主题

137

帖子

2

粉丝