打印

M051如何产生频率连续可调的方波?

[复制链接]
785|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haolaishi|  楼主 | 2015-6-15 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Thefantasy| | 2015-6-16 08:46 | 只看该作者
1.可用 PWM 产生,CNR是周期,每次写完周期后,再把占空比CMR的值写成周期CNR的值的一半
2.可用Timer产生,把Timer醒成反转模式,Timer的寄存器 CMPR就是半周期值。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
haolaishi + 2
板凳
旧影子| | 2015-6-16 15:26 | 只看该作者
给你个例程看看,网上找的。
#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);
        }


}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
haolaishi + 2
地板
白丁野老| | 2015-6-17 07:29 | 只看该作者
用PWM就可以实现了。具体参考官方的例程。

使用特权

评论回复
5
陌小生| | 2015-6-17 14:42 | 只看该作者
可以考虑下DDS合成算法,用单个方波做波表。

使用特权

评论回复
6
haolaishi|  楼主 | 2015-6-23 08:39 | 只看该作者
Thefantasy 发表于 2015-6-16 08:46
1.可用 PWM 产生,CNR是周期,每次写完周期后,再把占空比CMR的值写成周期CNR的值的一半
2.可用Timer产生, ...

我看看去,谢谢Thefantasy的讲解。

使用特权

评论回复
7
haolaishi|  楼主 | 2015-6-23 08:40 | 只看该作者
旧影子 发表于 2015-6-16 15:26
给你个例程看看,网上找的。

讲解的很详细,我慢慢的理解下。

使用特权

评论回复
8
蔚蓝的海| | 2015-6-25 11:08 | 只看该作者
用Timer产生,把Timer醒成反转模式,Timer的寄存器 CMPR就是半周期值

使用特权

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

本版积分规则

个人签名:不忘初心,积极乐观,勤且道义!

243

主题

1996

帖子

12

粉丝