搜索
bottom↓
回复: 34
打印 上一主题 下一主题

求助:51单片机产生32路PWM最高效方法

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2022-11-17 10:44:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 EvanXU 于 2022-11-17 10:56 编辑

项目中用到51单片机做32路PWM输出,频率最低200HZ(当然越高越好),占空比细分最少255份(也是约多越好),目前使用的定时器中断IO翻转,如果做200HZ,占空比255细分,那么中断频率=200*255=51K(也就是每19us中断一次),中断里还有32路IO口的计数值要判断,需要大约10us,主程序的执行时间就剩下了9us,一下子让主程序的执行效率降低了50%,如果想把PWM频率做高点,占空比细分做多点,主程序的效率就更低了,请问有什么更高效的方法吗?或者有什么单片机可以同时输出32路PWM的么?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出15入186汤圆

2
发表于 2022-11-17 10:46:20 | 只看该作者
200HZ随便玩,想要多少路都可以,用一路定时器产生5mS时基,在中断里自己写代码判断实现。

出0入0汤圆

3
 楼主| 发表于 2022-11-17 10:54:40 | 只看该作者
yuyu87 发表于 2022-11-17 10:46
200HZ随便玩,想要多少路都可以,用一路定时器产生5mS时基,在中断里自己写代码判断实现。 ...
(引用自2楼)

200HZ只输出肯定没问题,占空比数值想可调份数更多一些,5ms的时基就不行了吧

出0入0汤圆

4
 楼主| 发表于 2022-11-17 10:56:03 | 只看该作者
yuyu87 发表于 2022-11-17 10:46
200HZ随便玩,想要多少路都可以,用一路定时器产生5mS时基,在中断里自己写代码判断实现。 ...
(引用自2楼)

5ms时基最多能产生100HZ翻转吧,占空比固定50%,不可调

出0入0汤圆

5
发表于 2022-11-17 11:01:24 来自手机 | 只看该作者
yuyu87 发表于 2022-11-17 10:46
200HZ随便玩,想要多少路都可以,用一路定时器产生5mS时基,在中断里自己写代码判断实现。 ...
(引用自2楼)

再想想  

出40入514汤圆

6
发表于 2022-11-17 11:03:38 | 只看该作者
没有其它功能代码需要执行吗
STC8G有型号有那么多高级pwm的,我就用来做过一款楼梯灯

出0入0汤圆

7
 楼主| 发表于 2022-11-17 11:08:26 | 只看该作者
智涅 发表于 2022-11-17 11:03
没有其它功能代码需要执行吗
STC8G有型号有那么多高级pwm的,我就用来做过一款楼梯灯 ...
(引用自6楼)

还有按键,和OLED显示,你们做这个楼梯灯能用到这么多路PWM?不是一路就够了吗?楼梯还需要那么多路灯?STC8G可以做32路?

出0入0汤圆

8
 楼主| 发表于 2022-11-17 11:11:53 | 只看该作者
huangqi412 发表于 2022-11-17 11:01
再想想
(引用自5楼)

出0入442汤圆

9
发表于 2022-11-17 11:13:38 来自手机 | 只看该作者
EvanXU 发表于 2022-11-17 10:56
5ms时基最多能产生100HZ翻转吧,占空比固定50%,不可调
(引用自4楼)

可以用stc8试试,我试验过2路adc,192khz中断采样,再配个2m串口在主程序里跑,是没问题的(主频36mhz,定时器中断有一点点抖动)。然后pwm输出可以考虑用寄存器复用输出。

出0入0汤圆

10
 楼主| 发表于 2022-11-17 11:27:46 | 只看该作者
wye11083 发表于 2022-11-17 11:13
可以用stc8试试,我试验过2路adc,192khz中断采样,再配个2m串口在主程序里跑,是没问题的(主频36mhz, ...
(引用自9楼)

192K中断,有点猛啊,2M串口不敢想象,你这直接起飞,串口和AD咋都用这么高频率?36M主频我也没敢用,据说STC大于35M,就特别容易跑飞,产品出货油锅类似问题么?

出0入0汤圆

11
发表于 2022-11-17 11:30:11 | 只看该作者
主程序还有50%的时间够了

出45入38汤圆

12
发表于 2022-11-17 11:37:10 | 只看该作者
本帖最后由 国学芯用 于 2022-11-18 10:38 编辑

STC8G2K64S4  有45路PWM    4元含税   19952583534  联系我  免费送样 包邮

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

13
 楼主| 发表于 2022-11-17 11:40:11 | 只看该作者
国学芯用 发表于 2022-11-17 11:37
STC8G2K64S4  有45路PWM   19952583534  联系我  免费送样 包邮
(引用自12楼)

感谢大哥,我马上去看一看

出0入442汤圆

14
发表于 2022-11-17 11:40:47 | 只看该作者
EvanXU 发表于 2022-11-17 11:27
192K中断,有点猛啊,2M串口不敢想象,你这直接起飞,串口和AD咋都用这么高频率?36M主频我也没敢用,据 ...
(引用自10楼)

打算采样192K双通道音频的(我也忘了是256K还是192K了)。这样等效2个通道各96Ksps,做6~8个累加输出1个数生成16KHz的实际采样率。然后发现因为ADC只能挨个转换,因此产生了固定相位差。。后来需求没了,就没继续整了。但是STC跑这么高是没问题的。批量确实存在一致性问题。你的32路PWM计算会占用大量时间。 中断反而是挨个输出,用个并行374之类的倒是可以占用最少的中断输出时间。

出0入0汤圆

15
 楼主| 发表于 2022-11-17 11:57:32 | 只看该作者
wye11083 发表于 2022-11-17 11:40
打算采样192K双通道音频的(我也忘了是256K还是192K了)。这样等效2个通道各96Ksps,做6~8个累加输出1个 ...
(引用自14楼)

我还是一直低估了STC,我这个最头疼的就是32路PWM的计算,还必须在中断里边算,导致中断执行时间加长

出0入309汤圆

16
发表于 2022-11-17 11:58:01 | 只看该作者
本帖最后由 iamseer 于 2022-11-17 12:03 编辑

你51是什么51?这区别可大了。指令效率在这里差别很大。如果你是标准51,那指令周期可能得12倍。

我以ch55x举个例,这片子比标准51快:
一路PWM中断需要干三件事(我没实际写但应该差不多):
1. 把外部RAM里的PWM值送到寄存器里: MOVX 一周期
2. 比较寄存器值和PWM计数器值:用加法替代减法回避C位影响 ADD一周期
3. 把比较结果送到IO: MOV bit,C二周期
一路PWM算4周期,算上计数器值累加和补码,以及中断现场保护,保守大概算30周期。 LJMP 6clk 三对push/pop 6clk 取PWM计数器 算PWM计数器 PWM计数器放回内存 RETI 5clk
那么一共是总共算30+4*32 = 158周期。24M时钟就是6us多,这样算算CPU占用也就25%不到。48M时钟再少一半。不算什么大问题。

出0入0汤圆

17
发表于 2022-11-17 11:58:19 来自手机 | 只看该作者
仅需要外挂俩片H7即可

出0入442汤圆

18
发表于 2022-11-17 12:32:09 来自手机 | 只看该作者
EvanXU 发表于 2022-11-17 11:57
我还是一直低估了STC,我这个最头疼的就是32路PWM的计算,还必须在中断里边算,导致中断执行时间加长 ...
(引用自15楼)

。。最不济你有10ms的时间计算pwm表。。最笨的办法总共32路,每路256bit,一共用1kbyte内存存储状态表(把pwm当成状态),2kbyte作为2组状态,一组完了切换另一组。需要计算么?除非你没有做过一丁点算法。

出0入91汤圆

19
发表于 2022-11-17 12:45:00 | 只看该作者
你做10档的 PWM  那就只要10倍速度就够了

出0入0汤圆

20
 楼主| 发表于 2022-11-17 13:17:56 | 只看该作者
wye11083 发表于 2022-11-17 12:32
。。最不济你有10ms的时间计算pwm表。。最笨的办法总共32路,每路256bit,一共用1kbyte内存存储状态表( ...
(引用自18楼)

我这边要占空比随时变化,并不是两个组态就结束的,以空间换时间的方案也可行,但是就要考虑芯片资源了

出0入0汤圆

21
 楼主| 发表于 2022-11-17 13:19:51 | 只看该作者
colinzhao 发表于 2022-11-17 11:58
仅需要外挂俩片H7即可
(引用自17楼)

H7具体时哪个型号?

出0入442汤圆

22
发表于 2022-11-17 14:03:37 | 只看该作者
本帖最后由 wye11083 于 2022-11-17 14:04 编辑
EvanXU 发表于 2022-11-17 13:17
我这边要占空比随时变化,并不是两个组态就结束的,以空间换时间的方案也可行,但是就要考虑芯片资源了 ...
(引用自20楼)


好吧,随时变化就只能在中断里扫描32个数了——貌似就一个cmp,bset/bclr,clkh,clkl,大概一圈8个指令,32圈256个指令,估计32MHz的STC8绝对能在16个us内跑完。。

还有,你确定PWM要实时变化? 难道不是每新的一轮变化一次? 所以你说的那些意义不大。如果上面那种模式,则最终的PWM输出可能是错乱的——本来固定的111.......00000......变成了随机的,因为你不知道某个值什么时刻变了。

出0入0汤圆

23
发表于 2022-11-17 22:31:42 | 只看该作者
EvanXU 发表于 2022-11-17 13:19
H7具体时哪个型号?
(引用自21楼)

抱歉,我是想来点幽默,STM32H7

出10入10汤圆

24
发表于 2022-11-18 07:56:30 | 只看该作者
赛元SC95FW40,12位40路PWM输出

出0入0汤圆

25
 楼主| 发表于 2022-11-18 09:16:45 | 只看该作者
szxszx 发表于 2022-11-18 07:56
赛元SC95FW40,12位40路PWM输出
(引用自24楼)

多谢了,我找到资料了,上传上来分享给大家

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

26
 楼主| 发表于 2022-11-18 09:17:53 | 只看该作者
colinzhao 发表于 2022-11-17 22:31
抱歉,我是想来点幽默,STM32H7
(引用自23楼)

不敢用ST了,以前看着他猛涨很不爽,现在看着他狂跌还可以

出0入0汤圆

27
发表于 2022-11-18 09:33:52 | 只看该作者
EvanXU 发表于 2022-11-18 09:17
不敢用ST了,以前看着他猛涨很不爽,现在看着他狂跌还可以
(引用自26楼)

随便一个51都可以,人家都说了,5ms定时,8位随便玩;
不要想200*256;看看硬件有没有可以用的

出0入0汤圆

28
发表于 2022-11-18 09:43:01 | 只看该作者
之前做过软PWM,8M时钟10000字,输出大约800hz,用你的思路cpu要单周期完成所有操作,实际是CPU没有用多少,就算多几路也多不了多少,中断中没有多少活

出0入0汤圆

29
发表于 2022-11-18 09:47:38 | 只看该作者
缺点就是做不到真正的1字的精准度,进中断要时间,计算要时间,io也要时间,不过相对稳定

出0入0汤圆

30
发表于 2022-11-18 13:24:31 来自手机 | 只看该作者
相位差180℃的试一试

出45入38汤圆

31
发表于 2022-11-18 13:46:41 | 只看该作者
mcu5i51 发表于 2022-11-18 09:43
之前做过软PWM,8M时钟10000字,输出大约800hz,用你的思路cpu要单周期完成所有操作,实际是CPU没有用多少,就算 ...
(引用自28楼)

STC8G2K64S4-36I-LQFP48,  45路增强型15位PWM, 再加3路传统 PWM/CCP/PCA, 资料在最新 STC-ISP 的 资料下载部分下载

出0入0汤圆

32
发表于 2022-11-21 09:45:27 | 只看该作者
szxszx 发表于 2022-11-18 07:56
赛元SC95FW40,12位40路PWM输出
(引用自24楼)

这个估计最合适了 直接40路

出0入0汤圆

33
 楼主| 发表于 2022-11-22 15:48:09 | 只看该作者
国学芯用 发表于 2022-11-18 13:46
STC8G2K64S4-36I-LQFP48,  45路增强型15位PWM, 再加3路传统 PWM/CCP/PCA, 资料在最新 STC-ISP 的 资料下 ...
(引用自31楼)

好的,资料找到了,准备用这个了,STC国货之光吧

出45入38汤圆

34
发表于 2022-11-25 09:02:17 | 只看该作者
EvanXU 发表于 2022-11-17 11:27
192K中断,有点猛啊,2M串口不敢想象,你这直接起飞,串口和AD咋都用这么高频率?36M主频我也没敢用,据 ...
(引用自10楼)

请放心使用,STC内部高可靠复位电路    如果搞不定,请联系我司, 我们拉技术 组个 QQ 群支持大家,会专人跟踪服务

出45入38汤圆

35
发表于 2022-11-25 17:02:07 | 只看该作者
mcu5i51 发表于 2022-11-18 09:43
之前做过软PWM,8M时钟10000字,输出大约800hz,用你的思路cpu要单周期完成所有操作,实际是CPU没有用多少,就算 ...
(引用自28楼)

STC8G系列的指令集,分享给大家,大部分都是一个时钟完成
https://www.stcai.com/filedownload/631009

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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