牛卧堂MCU技术交流
标题:
如何产生频率连续可调的方波?
[打印本页]
作者:
leefine
时间:
2015-4-18 10:07
标题:
如何产生频率连续可调的方波?
如何产生频率连续可调的方波?
作者:
Angus
时间:
2015-4-26 10:45
本帖最后由 Angus 于 2015-4-26 10:46 编辑
1>,可用 PWM 产生,CNR是周期,每次写完周期后,再把占空比CMR的值写成周期CNR的值的一半
2>,可用Timer产生,把Timer醒成反转模式,Timer的寄存器 CMPR就是半周期值。
作者:
leefine
时间:
2015-5-23 15:20
可有具体参看资料或者例子?谢谢!
作者:
leefine
时间:
2015-5-23 15:22
我是想搞一个频率值介于1Hz-10000Hz连续可调的?
作者:
leefine
时间:
2015-5-23 15:45
我使用环境是Keil MDK5.0
作者:
leefine
时间:
2015-5-23 16:31
查看量不少,回复太少。
作者:
Angus
时间:
2015-5-23 17:37
方法一, 用定时器toggle模式. 只要调整Timer寄存器CMPR值,就调整了频率.
方法二, 用PWM, 调整频率时,要同时调整周期寄存器CNR和占空比寄存器CMR
作者:
eeyrw
时间:
2015-5-23 21:26
其实可以考虑下DDS合成算法,用单个方波做波表。
作者:
leefine
时间:
2015-5-26 20:28
eeyrw,是否可以提供详细点的资料,谢谢。
作者:
eeyrw
时间:
2015-5-27 13:50
本帖最后由 eeyrw 于 2015-5-27 13:54 编辑
// 凑合看看吧,这个好象是可以同时合成多个波叠加的。。
复制代码
#include "sineTable.h"
#include "dds.h"
#define DDS_FRAME_SIZE 2000
#define DDS_UNITS_NUM 16
STEREO_SAMPLE ddsFrameSample0[DDS_FRAME_SIZE];
STEREO_SAMPLE ddsFrameSample1[DDS_FRAME_SIZE];
DDS_CFG ddsCfg[DDS_UNITS_NUM];
void DdsInitCfg(DDS_CFG* ddsCfg)
{
ddsCfg->cst1=0xFFFFFFFF/ddsCfg->sampleRate;
}
void DdsChangeFreq(uint32_t freq,uint32_t chn)
{
ddsCfg[chn].desireFreq=freq;
}
void DdsInit(void)
{
uint32_t i;
for(i=0; i<DDS_UNITS_NUM; i++)
{
ddsCfg[i].desireFreq=0;
ddsCfg[i].phaseAccReg=0;
ddsCfg[i].sampleRate=44100;
DdsInitCfg(&ddsCfg[i]);
}
SoundBufferAssign((uint32_t)ddsFrameSample0,DDS_FRAME_SIZE*4,(uint32_t)ddsFrameSample1,DDS_FRAME_SIZE*4);
}
void PhaseAccRegUpdate(DDS_CFG* ddsCfg)
{
ddsCfg->phaseAccReg=ddsCfg->desireFreq*ddsCfg->cst1+ddsCfg->phaseAccReg;
}
void DdsPeriodRoutine(void)
{
uint32_t i,j;
uint32_t* rawBufPtr;
int16_t* samplePtr;
int32_t res;
uint32_t waveTableIdx=0;
int32_t waveValue;
res=SoundOpenFreeBuffer(&rawBufPtr);
if(res!=-1)
{
samplePtr=(int16_t*)rawBufPtr;
waveValue=0;
for(i=0; i<DDS_FRAME_SIZE; i++)
{
for(j=0; j<DDS_UNITS_NUM; j++)
{
PhaseAccRegUpdate(&ddsCfg[j]);
waveTableIdx=(ddsCfg[j].phaseAccReg>>18)&0x3FFF;
waveValue+=sineTbl[waveTableIdx];
}
waveValue/=DDS_UNITS_NUM;
*samplePtr=waveValue;
samplePtr++;
*samplePtr=waveValue;
samplePtr++;
}
res=SoundCloseBuffer(&rawBufPtr);
}
}
复制代码
作者:
chenwenbin
时间:
2015-6-2 10:55
用PWM就可以實現了
欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/)
Powered by Discuz! X3.2