打印
[STM8]

STM8-IO口模拟PWM输出

[复制链接]
8567|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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翻转输出抖动比较怀疑硬件配置或外部电路,
跟代码量大小有关只能说明有代码有问题,尤其程序逻辑。

使用特权

评论回复
5
WATS|  楼主 | 2016-4-13 14:19 | 只看该作者
aerwa 发表于 2016-4-13 12:21
是正常的啊,频率是主循环,能有几百HZ都是很不错的。

STM8内部时钟只有16MHZ

使用特权

评论回复
6
WATS|  楼主 | 2016-4-13 14:22 | 只看该作者
aerwa 发表于 2016-4-13 12:22
你是不是低成本方案做七彩灯啊。

火焰灯、我是在别人的板子上做的、原来别人的是能实现的

使用特权

评论回复
7
WATS|  楼主 | 2016-4-13 14:24 | 只看该作者
xmshao 发表于 2016-4-13 12:25
明明有TIMER可以输出PWM为啥不用呢?

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

TIMER的硬件口只有几个、太少了不够用,想扩展一下,代码量大,感觉会降低CPU的执行速度啊

使用特权

评论回复
8
yangshu_mcu| | 2016-4-13 14:27 | 只看该作者
这不是很正常的。主循环是查询模式。有的时候你根本运行不起来。还是乖乖的硬PWM吧

使用特权

评论回复
9
laoxu| | 2016-4-13 15:18 | 只看该作者
可以的!

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

这样做,PWM的定时时间,输出脉冲宽度,都可以做的比较准确。

使用特权

评论回复
10
WATS|  楼主 | 2016-4-13 16:22 | 只看该作者
laoxu 发表于 2016-4-13 15:18
可以的!

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

还是不太理解、不是还要跟另一个定时器的计数器作比较再输出的么、如果把输出程序加到中断中,中断执行太多东西,会不会导致CPU死机什么的。能不能给我讲详细点

使用特权

评论回复
11
lyjian| | 2016-4-13 21:19 | 只看该作者
关键要看你想做几位的PWM
模拟个8位不是什么难事
用过89C2051 24MHz模拟过RGB LED PWM混色调光控制

使用特权

评论回复
12
Bermanrep| | 2016-4-13 21:21 | 只看该作者
你两个输出中间应该加个延时吧

使用特权

评论回复
13
joketinnle| | 2016-4-13 21:24 | 只看该作者
用定时器中断做的PWM

使用特权

评论回复
14
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%的占空比亮度。能给个列子参考下不

使用特权

评论回复
15
WATS|  楼主 | 2016-4-13 21:49 | 只看该作者
joketinnle 发表于 2016-4-13 21:24
用定时器中断做的PWM

怎么处理,是用两个定时器,一个作为占空比点亮LED,另一个作为频率关掉LED么

使用特权

评论回复
16
lyjian| | 2016-4-13 22:09 | 只看该作者
WATS 发表于 2016-4-13 21:46
8位的STM8s,16MHZ、你是怎么处理的。我老感觉主频不够高啊 ,理论来说,主要达到4KHZ就足够了。但这个我 ...

LED显示,不需要做到4K的PWM频率,100Hz以上就足够了

使用特权

评论回复
17
lyjian| | 2016-4-13 22:12 | 只看该作者
WATS 发表于 2016-4-13 21:46
8位的STM8s,16MHZ、你是怎么处理的。我老感觉主频不够高啊 ,理论来说,主要达到4KHZ就足够了。但这个我 ...

你有没算过16K 1%占空比那脉宽才到多少时间,CPU能跑得过来吗?

使用特权

评论回复
18
自由心飞扬| | 2016-4-13 23:11 | 只看该作者
用定时器做的PWM不行,你上示波器看一下就明白了,即使进入循环体,循环交接时也会出现你不需要的脉冲宽度,受程序大小影响很大,时基不对。需要做硬PWM.能和主程序并行工作。

使用特权

评论回复
19
WATS|  楼主 | 2016-4-13 23:27 | 只看该作者
lyjian 发表于 2016-4-13 22:12
你有没算过16K 1%占空比那脉宽才到多少时间,CPU能跑得过来吗?

接近1us,是有点小。现在问题是我在跑用4k为PWM频率的时候,做呼吸灯,占空比越小抖动越明显。在做成火焰效果的时候就直接闪烁了,呼吸效果都看不出来了

使用特权

评论回复
20
joketinnle| | 2016-4-14 00:06 | 只看该作者
有必要那么高的频率吗?

使用特权

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

本版积分规则

12

主题

36

帖子

0

粉丝