叽里呱啦 发表于 2026-2-14 09:56:49

AI8051U硬件移相,一个脚输出SPWM正弦波,另一个脚输出移相90度方波,可以实现吗?

想用AI8051U通过DMA输出
一路100K的SPWM正弦波,但同时
还需要一路可移相0度或者90度的同步鉴相方波,
这个方波可以通过硬件移相实现吗?


叽里呱啦 发表于 2026-2-14 10:19:04

是不是硬件移相功能只能移一模一样的波形,比如一路是SPWM正弦波,那移相出来的另一路也只能是一模一样的SPWM正弦波,只是相位不同而已

王昱顺 发表于 2026-2-14 10:38:01

叽里呱啦 发表于 2026-2-14 10:19
是不是硬件移相功能只能移一模一样的波形,比如一路是SPWM正弦波,那移相出来的另一路也只能是一模一样的SP ...
是的,这个方波没法通过硬件移相得到。
因为SPWM本质也是一个占空比连续变化的方波,移相只能在单个周期内移动,移动完了还是一个SPWM方波
想要你说的这种移相,建议直接在DMA中断里操作IO口,因为频率不会很高,这么操作是可行的
简单的思路就是:将SPWM的一整个表,分为四段执行,分别是0~波峰,波峰~0,0~波谷,波谷~0。然后根据实际需要,可以选择在分段1、分段3结束取反io(0°方波),分段2,分段4结束取反io(90°方波),即可达到你的需求
具体可以参考梁工的示例程序:
Ai8051U- DMA支持高速高级PWM-HSPWMA例程:输出SPWM经过滤波可以得到正弦波 - 144MHz-PWM-硬件移相/45路PWM+3路CCP/7组不同周期的PWM/DAC 国芯人工智能技术交流网站 - AI32位8051交流社区
只需要传入DMA地址的时候,分为&(T_SINE_1000Hz),&(T_SINE_1000Hz),&(T_SINE_1000Hz),&(T_SINE_1000Hz)即可(点数为60,每个起始地址为(点数/4*第几段)-1)四段依次传入即可
处理内容都写在void PWMAT_DMA_ISR (void) interrupt DMA_PWMAT_VECTOR中即可


当然,你这个100K的SPWM,频率比较高,使用io操作虽然可行,但是中断内占用时间就稍微多一些了
想要实现硬件的移相是不行,硬件的产生方波是可以的,不过要额外占用PWMB,通过调整PWMB为100K的方波,然后给CNTR中填入0或者一半的初始值,再跟PWMA保持一起开启定时器运行,也可以做到同步的输出
就是每次PWMA重载的时候,中间会稍微断一下(因为重新载入DMA需要时间),这时需要停下PWMB重启给初值然后再同步启动,不然两个就对不齐了

叽里呱啦 发表于 2026-2-14 10:51:56

王昱顺 发表于 2026-2-14 10:38
是的,这个方波没法通过硬件移相得到。
因为SPWM本质也是一个占空比连续变化的方波,移相只能在单个周期内 ...

谢谢版主,将波表分段DMA,这个思路妙啊{:qiang:}

叽里呱啦 发表于 2026-2-14 11:02:21

王昱顺 发表于 2026-2-14 10:38
是的,这个方波没法通过硬件移相得到。
因为SPWM本质也是一个占空比连续变化的方波,移相只能在单个周期内 ...

那还想请教一下,是不是这种DMA的方式产生SPWM会导致波形不连续呢?因为重载需要时间,导致波形会断开一段时间,这样就不连续了

王昱顺 发表于 2026-2-14 11:05:24

叽里呱啦 发表于 2026-2-14 11:02
那还想请教一下,是不是这种DMA的方式产生SPWM会导致波形不连续呢?因为重载需要时间,导致波形会断开一 ...

是的,低频率下不明显,高频率下就比较影响了
你这个100K如果是PWM的基准频率,SPWM如果是1K这种,基本就看不出来,如果SPWM本身频率也高,那么可能就比较明显了
DMA装载中断的时候,占空比是不变的,从SPWM的波形来看,就像是有一小段横线的样子,主要看你能不能接受这种情况了,暂时没有太好的解决办法

叽里呱啦 发表于 2026-2-14 11:12:38

王昱顺 发表于 2026-2-14 11:05
是的,低频率下不明显,高频率下就比较影响了
你这个100K如果是PWM的基准频率,SPWM如果是1K这种,基本就 ...

好的,谢谢版主
页: [1]
查看完整版本: AI8051U硬件移相,一个脚输出SPWM正弦波,另一个脚输出移相90度方波,可以实现吗?