[STM8] STM8-IO口模拟PWM输出

[复制链接]
 楼主| WATS 发表于 2016-4-13 11:40 | 显示全部楼层 |阅读模式
在搞一个用多个IO口模拟PWM输出来控制LED,使用内部芯片晶振,遇到了很大的问题。PWM输出存在抖动,在代码量大的时候根本没有效果、直接在闪烁了。搞了好几天没搞定、求大神指导
void SET_LEFT_3(uint dat)
{
  CHANGE_LAY3_PWM();
  Count=TIM1_GetCounter();
  if(dat<Count)
    GPIO_WriteLow(GPIOD,GPIO_PIN_4);
  else if(dat>Count)
    GPIO_WriteHigh(GPIOD,GPIO_PIN_4);
}
aerwa 发表于 2016-4-13 12:21 来自手机 | 显示全部楼层
是正常的啊,频率是主循环,能有几百HZ都是很不错的。
aerwa 发表于 2016-4-13 12:22 来自手机 | 显示全部楼层
你是不是低成本方案做七彩灯啊。
xmshao 发表于 2016-4-13 12:25 | 显示全部楼层
明明有TIMER可以输出PWM为啥不用呢?

用IO模拟也无妨,估计要做的事情不多吧。

GPIO翻转输出抖动比较怀疑硬件配置或外部电路,
跟代码量大小有关只能说明有代码有问题,尤其程序逻辑。
 楼主| WATS 发表于 2016-4-13 14:19 | 显示全部楼层
aerwa 发表于 2016-4-13 12:21
是正常的啊,频率是主循环,能有几百HZ都是很不错的。

STM8内部时钟只有16MHZ
 楼主| WATS 发表于 2016-4-13 14:22 | 显示全部楼层
aerwa 发表于 2016-4-13 12:22
你是不是低成本方案做七彩灯啊。

火焰灯、我是在别人的板子上做的、原来别人的是能实现的
 楼主| WATS 发表于 2016-4-13 14:24 | 显示全部楼层
xmshao 发表于 2016-4-13 12:25
明明有TIMER可以输出PWM为啥不用呢?

用IO模拟也无妨,估计要做的事情不多吧。

TIMER的硬件口只有几个、太少了不够用,想扩展一下,代码量大,感觉会降低CPU的执行速度啊
yangshu_mcu 发表于 2016-4-13 14:27 | 显示全部楼层
这不是很正常的。主循环是查询模式。有的时候你根本运行不起来。还是乖乖的硬PWM吧
laoxu 发表于 2016-4-13 15:18 | 显示全部楼层
可以的!

用一个定时中断,将模拟PWM输出程序加到这个定时中断程序中,定时时间以最长的中断执行时间再加点余量计算,并且加一级PWM输出缓冲区,即本次输出的PWM脉冲电平,存入PWM输出缓冲区,等下次定时中断发生时,优先输出刷新。

这样做,PWM的定时时间,输出脉冲宽度,都可以做的比较准确。
 楼主| WATS 发表于 2016-4-13 16:22 | 显示全部楼层
laoxu 发表于 2016-4-13 15:18
可以的!

用一个定时中断,将模拟PWM输出程序加到这个定时中断程序中,定时时间以最长的中断执行时间再加 ...

还是不太理解、不是还要跟另一个定时器的计数器作比较再输出的么、如果把输出程序加到中断中,中断执行太多东西,会不会导致CPU死机什么的。能不能给我讲详细点
lyjian 发表于 2016-4-13 21:19 | 显示全部楼层
关键要看你想做几位的PWM
模拟个8位不是什么难事
用过89C2051 24MHz模拟过RGB LED PWM混色调光控制
Bermanrep 发表于 2016-4-13 21:21 | 显示全部楼层
你两个输出中间应该加个延时吧
joketinnle 发表于 2016-4-13 21:24 | 显示全部楼层
用定时器中断做的PWM
 楼主| WATS 发表于 2016-4-13 21:46 | 显示全部楼层
lyjian 发表于 2016-4-13 21:19
关键要看你想做几位的PWM
模拟个8位不是什么难事
用过89C2051 24MHz模拟过RGB LED PWM混色调光控制 ...

8位的STM8s,16MHZ、你是怎么处理的。我老感觉主频不够高啊 ,理论来说,主要达到4KHZ就足够了。但这个我给了16KHZ,都调不出1%的占空比亮度。能给个列子参考下不
 楼主| WATS 发表于 2016-4-13 21:49 | 显示全部楼层
joketinnle 发表于 2016-4-13 21:24
用定时器中断做的PWM

怎么处理,是用两个定时器,一个作为占空比点亮LED,另一个作为频率关掉LED么
lyjian 发表于 2016-4-13 22:09 | 显示全部楼层
WATS 发表于 2016-4-13 21:46
8位的STM8s,16MHZ、你是怎么处理的。我老感觉主频不够高啊 ,理论来说,主要达到4KHZ就足够了。但这个我 ...

LED显示,不需要做到4K的PWM频率,100Hz以上就足够了
lyjian 发表于 2016-4-13 22:12 | 显示全部楼层
WATS 发表于 2016-4-13 21:46
8位的STM8s,16MHZ、你是怎么处理的。我老感觉主频不够高啊 ,理论来说,主要达到4KHZ就足够了。但这个我 ...

你有没算过16K 1%占空比那脉宽才到多少时间,CPU能跑得过来吗?
自由心飞扬 发表于 2016-4-13 23:11 | 显示全部楼层
用定时器做的PWM不行,你上示波器看一下就明白了,即使进入循环体,循环交接时也会出现你不需要的脉冲宽度,受程序大小影响很大,时基不对。需要做硬PWM.能和主程序并行工作。
 楼主| WATS 发表于 2016-4-13 23:27 | 显示全部楼层
lyjian 发表于 2016-4-13 22:12
你有没算过16K 1%占空比那脉宽才到多少时间,CPU能跑得过来吗?

接近1us,是有点小。现在问题是我在跑用4k为PWM频率的时候,做呼吸灯,占空比越小抖动越明显。在做成火焰效果的时候就直接闪烁了,呼吸效果都看不出来了
joketinnle 发表于 2016-4-14 00:06 | 显示全部楼层
有必要那么高的频率吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

36

帖子

0

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

12

主题

36

帖子

0

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