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

[复制链接]
7361|14
 楼主| kaifeier 发表于 2015-9-13 19:00 | 显示全部楼层 |阅读模式
    我现在已经用定时器+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。
    请问大家有没有好的方案。
icecut 发表于 2015-9-13 19:48 | 显示全部楼层
dds 方案就这样.......
 楼主| kaifeier 发表于 2015-9-13 20:15 | 显示全部楼层
还能再提高频率调节的分辨率吗
songchenping 发表于 2015-9-14 09:39 | 显示全部楼层
硬件所致,分辨率和频率成反比啊。
williamhenry 发表于 2015-9-16 16:34 | 显示全部楼层
具体是怎样设置你的寄存器的?我正在调试F105VC的Timer3的Channel4,没有中断发生,不知道是怎么回事。
拉克丝 发表于 2015-9-17 21:55 | 显示全部楼层
分辨率应该是还能调的
 楼主| kaifeier 发表于 2015-9-18 12:41 | 显示全部楼层
问题解决了:)
 楼主| kaifeier 发表于 2015-9-18 12:48 | 显示全部楼层
最后的方案是采用STM32单片机实现DDS技术。网上的方案很少,我是参考了几家的原理,又自己脑补了下。其实挺简单的
只需要简单的RC滤波可以输出很漂亮的0.01 到 4000的正弦波,调节步距可精确到0.01HZ,而且还能在同一通道输出调制后的信号。一个定时器的4个通道均可生成任意频率和波形。
 楼主| kaifeier 发表于 2015-9-18 13:06 | 显示全部楼层
源码就不贴了,说下大概的原理。
使用两个定时器,分别是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滤波,波形完美呈现。
sjh2100 发表于 2017-9-6 15:19 | 显示全部楼层
kaifeier 发表于 2015-9-18 13:06
源码就不贴了,说下大概的原理。
使用两个定时器,分别是TIM1 和 TIM6.  TIM1的CH1 ~ CH4 做 四路波形输出 ...

4路输出的作用是什么?
hua_ren 发表于 2017-9-7 11:13 | 显示全部楼层
我也在调试这个。争取这2天搞定。。
电子乌托邦 发表于 2018-5-9 22:50 | 显示全部楼层
stm32 TIM产生正弦波 标记一下。
fengfeng的恒 发表于 2018-5-10 09:02 | 显示全部楼层
DDS技术。mark
HAORANAN123 发表于 2018-5-10 13:11 | 显示全部楼层

DDS技术。mark
gejigeji521 发表于 2020-5-10 12:07 | 显示全部楼层
所以最好用DAC单片机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部