打印
[STM8]

STM8输出PWM的问题

[复制链接]
6995|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gfkdliling|  楼主 | 2010-3-1 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现一个奇怪的现象,使用STM8的TIM1产生PWM,更新TIM1_CCR时在两个特定的点有问题,更新不了。大概是在TIM1_CCR=230和TIM1_CCR=480时会出现
沙发
香水城| | 2010-3-1 15:52 | 只看该作者
现象是什么?

使用特权

评论回复
板凳
gfkdliling|  楼主 | 2010-3-1 15:57 | 只看该作者
刚才测试了一下,具体应该是TIM1_CCR=255 转换到 TIM1_CCR=256时会有问题,现象是先会输出一个两倍的脉宽,然后再输出占空比为很小(接近0)的脉宽

使用特权

评论回复
地板
gfkdliling|  楼主 | 2010-3-1 15:58 | 只看该作者
刚好是由0xFF到0x100变化时出的问题

使用特权

评论回复
5
gfkdliling|  楼主 | 2010-3-1 15:59 | 只看该作者
另外一个点也出来了,由0x1FF变化到0x200时也会有问题

使用特权

评论回复
6
香水城| | 2010-3-1 16:08 | 只看该作者
1)请注意更新时高低字节的次序。
2)是否使用了更新中断(事件)?如果没有,则可能出这样的问题。

使用特权

评论回复
7
gfkdliling|  楼主 | 2010-3-1 16:09 | 只看该作者
虽然我已经解决了,还是要感谢香水版主。我发现是编译器有一些小问题
TIM1_CCR1H = (unsigned char)(SetSpeed>>8);
TIM1_CCR1L = (unsigned char)(SetSpeed&0xFF);
以上是正确写法
TIM1_CCR1L = (unsigned char)(SetSpeed&0xFF);
TIM1_CCR1H = (unsigned char)(SetSpeed>>8);
以上是错误写法
TIM1_CCR1= SetSpeed;
这也是是错误写法

使用特权

评论回复
8
香水城| | 2010-3-1 16:13 | 只看该作者
你这样的解决方法是我6楼所说“高低字节更新的次序”问题,建议你考虑使用更新中断(事件)试试看。

使用特权

评论回复
9
gfkdliling|  楼主 | 2010-3-1 16:39 | 只看该作者
谢谢,我确实不是用的更新事件中断,因为电流环的周期是100uS,所以我在电流环里面更新的

使用特权

评论回复
10
sinadz| | 2010-3-1 20:31 | 只看该作者
不会吧,高低字节先写和后写区别会这么大?

使用特权

评论回复
11
gfkdliling|  楼主 | 2010-3-2 13:15 | 只看该作者
是的,AD采样也会有类似的问题,要特别小心

使用特权

评论回复
12
香水城| | 2010-3-2 13:39 | 只看该作者
不会吧,高低字节先写和后写区别会这么大?
sinadz 发表于 2010-3-1 20:31


当然有区别。

本来是0x00FF,如果先写低字节再写高字节,则会先出现0x0000,再出现0x0100,如果在数值变化过程中,出现比较成功的条件,就会出现楼主说的情况。同理,写高字节再写低字节,则会变化为0x01FF,再变化为0x0100,同样有出错的可能。

但使用我建议的更新中断(事件),将在每个周期的开始更新比较寄存器的数值,不会出现上述问题。

使用特权

评论回复
13
pkat| | 2010-3-2 22:01 | 只看该作者
之前我也没很在意这个问题,学习了

使用特权

评论回复
14
gfkdliling|  楼主 | 2010-3-4 11:59 | 只看该作者
使用我建议的更新中断比较好!多谢香水版主

使用特权

评论回复
15
yuandm1| | 2014-3-20 22:26 | 只看该作者
学习了

使用特权

评论回复
16
nienianhong| | 2014-3-20 23:02 | 只看该作者
学习了!

使用特权

评论回复
17
FAQ| | 2014-3-20 23:31 | 只看该作者
有用

使用特权

评论回复
18
81190865| | 2015-1-6 10:32 | 只看该作者
mark 多谢香主

使用特权

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

本版积分规则

27

主题

187

帖子

1

粉丝