OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13971|回复: 4

请问在pwm中调整下一个周期的占空比的问题

[复制链接]

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
发表于 2012-4-18 15:08:23 | 显示全部楼层 |阅读模式
请问在pwm中调整下一个周期的占空比的问题。我现在用Timer4的第二通道产生pwm,利用预装载功能,在每个pwm更新周期前设置下一个周期的占空比,但好像临停止的时候(脉冲流的尾段)会送多一个到两个错误的脉冲。
请帮忙看看是什么问题。
代码是这样的:
    ......
    ......
    if (buff[t]&0x08) TIM4->CCR2=50; else TIM4->CCR2=130;   //(A处)
    while (!(TIM4->SR&1)) ;                           
    TIM4->SR&=~1;                            //清除更新事件标志
    if (buff[t]&0x04) TIM4->CCR2=50; else TIM4->CCR2=130;   //(B处)     //这里不等A处设置的pwm时间周期结束,就直接再写入新的参数,利用预装载功能
    while (!(TIM4->SR&1)) ;                  //检查更新事件。这里等待的是A处设置的pwm时间周期结束
    TIM4->SR&=~1;
    if (buff[t]&0x02) TIM4->CCR2=50; else TIM4->CCR2=130;   //(C处)
    while (!(TIM4->SR&1)) ;
    TIM4->SR&=~1;
    if (buff[t]&0x01) TIM4->CCR2=50; else TIM4->CCR2=130;   //(D处)
    while (!(TIM4->SR&1)) ;                           //这里等待的是C处设置的pwm时间周期结束
    TIM4->SR&=~1;      //D处设置的pwm时间周期这时还没有结束
  }
  TIM4->CR1|=1<<3;       //到最后了,改单脉冲模式,这个脉冲结束时,定时器自动停止。但这里好像会送多一到两个错误脉冲出去。

或者有否其他更好的处理方面?

请帮忙。

谢谢。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-18 15:26:38 | 显示全部楼层
回复【楼主位】gz_ddc:
---------------------------------
你这样的做法,貌似不靠谱.
当你检查到更新的时候,并不是立即更新的,while,赋值,都需要时间,这个期间,可能PWM的下一个周期已经开始输出了,然后你又修改CCR2的值,导致输出脉冲不正确.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
 楼主| 发表于 2012-4-18 15:30:31 | 显示全部楼层
那怎搞嘛?

回复【2楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

37

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2012-1-25
在线时间
1 小时
 楼主| 发表于 2012-4-18 15:36:19 | 显示全部楼层
我那里检查更新是检查前一个pwm周期是不是结束,见代码的第5行。我是想用那个预装载功能,即是我现在赋的值要等前一个pwm周期完成后,在更新周期时才装入,我就在前一个pwm周期还没结束时(前一个pwm周期的期间),再赋一个新的值给它。等它下次更新周期时拿这个值。

另外,速度很高,1uS级别的。


回复【2楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-4-18 21:13:22 | 显示全部楼层
自动重装是在计数器溢出的情况下重装的。
比如装入计数器值为1,向下计数:计一次数,由1到0,再计一次才溢出。
所以重装值应该为 (要计数值) - 1。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 13:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表