[STM8] STM8输出PWM的问题

[复制链接]
8016|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变化时出的问题
 楼主| gfkdliling 发表于 2010-3-1 15:59 | 显示全部楼层
另外一个点也出来了,由0x1FF变化到0x200时也会有问题
香水城 发表于 2010-3-1 16:08 | 显示全部楼层
1)请注意更新时高低字节的次序。
2)是否使用了更新中断(事件)?如果没有,则可能出这样的问题。
 楼主| 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;
这也是是错误写法
香水城 发表于 2010-3-1 16:13 | 显示全部楼层
你这样的解决方法是我6楼所说“高低字节更新的次序”问题,建议你考虑使用更新中断(事件)试试看。
 楼主| gfkdliling 发表于 2010-3-1 16:39 | 显示全部楼层
谢谢,我确实不是用的更新事件中断,因为电流环的周期是100uS,所以我在电流环里面更新的
sinadz 发表于 2010-3-1 20:31 | 显示全部楼层
不会吧,高低字节先写和后写区别会这么大?
 楼主| gfkdliling 发表于 2010-3-2 13:15 | 显示全部楼层
是的,AD采样也会有类似的问题,要特别小心
香水城 发表于 2010-3-2 13:39 | 显示全部楼层
不会吧,高低字节先写和后写区别会这么大?
sinadz 发表于 2010-3-1 20:31


当然有区别。

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

但使用我建议的更新中断(事件),将在每个周期的开始更新比较寄存器的数值,不会出现上述问题。
pkat 发表于 2010-3-2 22:01 | 显示全部楼层
之前我也没很在意这个问题,学习了
 楼主| gfkdliling 发表于 2010-3-4 11:59 | 显示全部楼层
使用我建议的更新中断比较好!多谢香水版主
yuandm1 发表于 2014-3-20 22:26 | 显示全部楼层
学习了
nienianhong 发表于 2014-3-20 23:02 | 显示全部楼层
学习了!
FAQ 发表于 2014-3-20 23:31 | 显示全部楼层
81190865 发表于 2015-1-6 10:32 | 显示全部楼层
mark 多谢香主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

187

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部