EvanXU 发表于 2022-11-17 10:44:11

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

本帖最后由 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的么?

yuyu87 发表于 2022-11-17 10:46:20

200HZ随便玩,想要多少路都可以,用一路定时器产生5mS时基,在中断里自己写代码判断实现。

EvanXU 发表于 2022-11-17 10:54:40

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

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

EvanXU 发表于 2022-11-17 10:56:03

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

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

huangqi412 发表于 2022-11-17 11:01:24

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

再想想

智涅 发表于 2022-11-17 11:03:38

没有其它功能代码需要执行吗{:titter:}
STC8G有型号有那么多高级pwm的,我就用来做过一款楼梯灯{:titter:}

EvanXU 发表于 2022-11-17 11:08:26

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

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

EvanXU 发表于 2022-11-17 11:11:53

huangqi412 发表于 2022-11-17 11:01
再想想
(引用自5楼)

{:biggrin:}

wye11083 发表于 2022-11-17 11:13:38

EvanXU 发表于 2022-11-17 10:56
5ms时基最多能产生100HZ翻转吧,占空比固定50%,不可调
(引用自4楼)

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

EvanXU 发表于 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,就特别容易跑飞,产品出货油锅类似问题么?

modbus 发表于 2022-11-17 11:30:11

主程序还有50%的时间够了

国学芯用 发表于 2022-11-17 11:37:10

本帖最后由 国学芯用 于 2022-11-18 10:38 编辑

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

EvanXU 发表于 2022-11-17 11:40:11

国学芯用 发表于 2022-11-17 11:37
STC8G2K64S4有45路PWM   19952583534联系我免费送样 包邮
(引用自12楼)

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

wye11083 发表于 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计算会占用大量时间。{:sweat:} 中断反而是挨个输出,用个并行374之类的倒是可以占用最少的中断输出时间。

EvanXU 发表于 2022-11-17 11:57:32

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

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

iamseer 发表于 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时钟再少一半。不算什么大问题。

colinzhao 发表于 2022-11-17 11:58:19

仅需要外挂俩片H7即可

wye11083 发表于 2022-11-17 12:32:09

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

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

ackyee 发表于 2022-11-17 12:45:00

你做10档的 PWM那就只要10倍速度就够了

EvanXU 发表于 2022-11-17 13:17:56

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

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

EvanXU 发表于 2022-11-17 13:19:51

colinzhao 发表于 2022-11-17 11:58
仅需要外挂俩片H7即可
(引用自17楼)

H7具体时哪个型号?

wye11083 发表于 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......变成了随机的,因为你不知道某个值什么时刻变了。

colinzhao 发表于 2022-11-17 22:31:42

EvanXU 发表于 2022-11-17 13:19
H7具体时哪个型号?
(引用自21楼)

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

szxszx 发表于 2022-11-18 07:56:30

赛元SC95FW40,12位40路PWM输出

EvanXU 发表于 2022-11-18 09:16:45

szxszx 发表于 2022-11-18 07:56
赛元SC95FW40,12位40路PWM输出
(引用自24楼)

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

EvanXU 发表于 2022-11-18 09:17:53

colinzhao 发表于 2022-11-17 22:31
抱歉,我是想来点幽默,STM32H7
(引用自23楼)

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

mcu5i51 发表于 2022-11-18 09:33:52

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

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

mcu5i51 发表于 2022-11-18 09:43:01

之前做过软PWM,8M时钟10000字,输出大约800hz,用你的思路cpu要单周期完成所有操作,实际是CPU没有用多少,就算多几路也多不了多少,中断中没有多少活

mcu5i51 发表于 2022-11-18 09:47:38

缺点就是做不到真正的1字的精准度,进中断要时间,计算要时间,io也要时间,不过相对稳定

lnso 发表于 2022-11-18 13:24:31

相位差180℃的试一试

国学芯用 发表于 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 的 资料下载部分下载

huangqi412 发表于 2022-11-21 09:45:27

szxszx 发表于 2022-11-18 07:56
赛元SC95FW40,12位40路PWM输出
(引用自24楼)

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

EvanXU 发表于 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国货之光吧

国学芯用 发表于 2022-11-25 09:02:17

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

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

国学芯用 发表于 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
页: [1]
查看完整版本: 求助:51单片机产生32路PWM最高效方法