打印
[STM32F1]

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

[复制链接]
349|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangchui|  楼主 | 2022-5-8 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在已经用定时器+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 | 只看该作者
硬件所致,分辨率和频率成反比啊。

使用特权

评论回复
5
chuxh| | 2022-5-8 17:31 | 只看该作者
具体是怎样设置你的寄存器的?我正在调试F105VC的Timer3的Channel4,没有中断发生,不知道是怎么回事。

使用特权

评论回复
6
stly| | 2022-5-8 17:34 | 只看该作者
分辨率应该是还能调的

使用特权

评论回复
7
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滤波,波形完美呈现。

使用特权

评论回复
8
pengf| | 2022-5-8 17:41 | 只看该作者
4路输出的作用是什么?

使用特权

评论回复
9
jlyuan| | 2022-5-8 17:44 | 只看该作者
我也在调试这个。争取这2天搞定。。

使用特权

评论回复
10
dengdc| | 2022-5-8 17:47 | 只看该作者
stm32 TIM产生正弦波 标记一下。

使用特权

评论回复
11
jlyuan| | 2022-5-8 17:58 | 只看该作者
DDS技术。mark

使用特权

评论回复
12
dingy| | 2022-5-8 18:02 | 只看该作者
DDS技术。mark

使用特权

评论回复
13
juventus9554| | 2022-5-8 18:05 | 只看该作者
所以最好用DAC单片机

使用特权

评论回复
14
huangchui|  楼主 | 2022-5-8 18:08 | 只看该作者
问题解决了

使用特权

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

本版积分规则

918

主题

12323

帖子

4

粉丝