huangchui 发表于 2022-5-8 16:05

如何精确调整用PWM生成的正弦波的频率

我现在已经用定时器+DMA+PWM的方式实现了4KHz的输出波形。但是不能精确的微调频率,比如从4000到4100HZ 通过指令1HZ 步距小范围的连续调整。
    现在的方案是,使用两个定时器,其中定时器1做波形数据提取计数器,定时器2做PWM输出,利用定时器1的CCx比较事件触发一次DMA传送,数据是事先根据输出频率通过SIN计算得出的数组,数组的个数是随着输出频率的变化而变化的,数组是8位的,0--255 代表波形的值。定时器2的ARR设置为255,波形数组的值通过DMA定时更新到定时器2的CCR寄存器,PWM 的输出通过简单的RC滤波,即可生成正弦波了。
    这个方案的好处是可以用一个定时器生成多个不同频率的正弦波,而且PWM的频率是固定的,方便滤波。缺点是波形数据要占用大量的内存,而且比较高频率.如4K时,调节精度只有3、4HZ。
    请问大家有没有好的方案。

chuxh 发表于 2022-5-8 17:20

dds 方案就这样.......

huangchui 发表于 2022-5-8 17:23

还能再提高频率调节的分辨率吗

hanwe 发表于 2022-5-8 17:28

硬件所致,分辨率和频率成反比啊。

chuxh 发表于 2022-5-8 17:31

具体是怎样设置你的寄存器的?我正在调试F105VC的Timer3的Channel4,没有中断发生,不知道是怎么回事。

stly 发表于 2022-5-8 17:34

分辨率应该是还能调的

huangchui 发表于 2022-5-8 17:37

源码就不贴了,说下大概的原理。
使用两个定时器,分别是TIM1 和 TIM6.TIM1的CH1 ~ CH4 做 四路波形输出,不分频,ARR值为63(这个63是输出波形的Y轴分辨率)。TIM6 做波形输出定时器(中断开启),不分频,ARR=1000,即72M/1000=72K 的溢出率。在程序开始时生成一个256的正弦波的数组(数值0~63)。在TIM6的中断程序中,用一个32位变量对频率控制字进行累加,取高8位做地址,读取波形数组的数值并赋值给TIM1的CCRx寄存器。 此时在TIM1的对应通道管脚即可生成一个72KHz 的PWM 波,其正空比周期改变,这个周期就是频率控制字决定的。通过RC滤波,波形完美呈现。

pengf 发表于 2022-5-8 17:41

4路输出的作用是什么?

jlyuan 发表于 2022-5-8 17:44

我也在调试这个。争取这2天搞定。。

dengdc 发表于 2022-5-8 17:47

stm32 TIM产生正弦波 标记一下。

jlyuan 发表于 2022-5-8 17:58

DDS技术。mark

dingy 发表于 2022-5-8 18:02

DDS技术。mark

juventus9554 发表于 2022-5-8 18:05

所以最好用DAC单片机

huangchui 发表于 2022-5-8 18:08

问题解决了
页: [1]
查看完整版本: 如何精确调整用PWM生成的正弦波的频率