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

[复制链接]
1123|7
 楼主| haolaishi 发表于 2015-6-15 16:37 | 显示全部楼层 |阅读模式
RT,实际要用到,M051如何产生频率连续可调的方波?
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 | 显示全部楼层
给你个例程看看,网上找的。
  1. #include "sineTable.h"
  2. #include "dds.h"

  3. #define DDS_FRAME_SIZE 2000
  4. #define DDS_UNITS_NUM 16

  5. STEREO_SAMPLE ddsFrameSample0[DDS_FRAME_SIZE];
  6. STEREO_SAMPLE ddsFrameSample1[DDS_FRAME_SIZE];


  7. DDS_CFG ddsCfg[DDS_UNITS_NUM];


  8. void DdsInitCfg(DDS_CFG* ddsCfg)
  9. {
  10.         ddsCfg->cst1=0xFFFFFFFF/ddsCfg->sampleRate;
  11. }
  12. void DdsChangeFreq(uint32_t freq,uint32_t chn)
  13. {

  14.         ddsCfg[chn].desireFreq=freq;


  15. }
  16. void DdsInit(void)
  17. {
  18.         uint32_t i;
  19.         for(i=0; i<DDS_UNITS_NUM; i++)
  20.         {
  21.                 ddsCfg[i].desireFreq=0;
  22.                 ddsCfg[i].phaseAccReg=0;
  23.                 ddsCfg[i].sampleRate=44100;

  24.                 DdsInitCfg(&ddsCfg[i]);
  25.         }

  26.         SoundBufferAssign((uint32_t)ddsFrameSample0,DDS_FRAME_SIZE*4,(uint32_t)ddsFrameSample1,DDS_FRAME_SIZE*4);
  27. }

  28. void PhaseAccRegUpdate(DDS_CFG* ddsCfg)
  29. {
  30.         ddsCfg->phaseAccReg=ddsCfg->desireFreq*ddsCfg->cst1+ddsCfg->phaseAccReg;
  31. }

  32. void DdsPeriodRoutine(void)
  33. {
  34.         uint32_t i,j;

  35.         uint32_t* rawBufPtr;

  36.         int16_t* samplePtr;

  37.         int32_t res;

  38.         uint32_t waveTableIdx=0;
  39.         int32_t waveValue;
  40.         res=SoundOpenFreeBuffer(&rawBufPtr);

  41.         if(res!=-1)
  42.         {
  43.                 samplePtr=(int16_t*)rawBufPtr;

  44.                 waveValue=0;


  45.                 for(i=0; i<DDS_FRAME_SIZE; i++)
  46.                 {
  47.                         for(j=0; j<DDS_UNITS_NUM; j++)
  48.                         {
  49.                                 PhaseAccRegUpdate(&ddsCfg[j]);

  50.                                 waveTableIdx=(ddsCfg[j].phaseAccReg>>18)&0x3FFF;
  51.                                 waveValue+=sineTbl[waveTableIdx];

  52.                         }
  53.                         waveValue/=DDS_UNITS_NUM;

  54.                         *samplePtr=waveValue;
  55.                         samplePtr++;
  56.                         *samplePtr=waveValue;
  57.                         samplePtr++;

  58.                 }
  59.                 res=SoundCloseBuffer(&rawBufPtr);
  60.         }


  61. }

评分

参与人数 1威望 +2 收起 理由
haolaishi + 2

查看全部评分

白丁野老 发表于 2015-6-17 07:29 | 显示全部楼层
用PWM就可以实现了。具体参考官方的例程。
陌小生 发表于 2015-6-17 14:42 | 显示全部楼层
可以考虑下DDS合成算法,用单个方波做波表。
 楼主| haolaishi 发表于 2015-6-23 08:39 | 显示全部楼层
Thefantasy 发表于 2015-6-16 08:46
1.可用 PWM 产生,CNR是周期,每次写完周期后,再把占空比CMR的值写成周期CNR的值的一半
2.可用Timer产生, ...

我看看去,谢谢Thefantasy的讲解。
 楼主| haolaishi 发表于 2015-6-23 08:40 | 显示全部楼层
旧影子 发表于 2015-6-16 15:26
给你个例程看看,网上找的。

讲解的很详细,我慢慢的理解下。
蔚蓝的海 发表于 2015-6-25 11:08 | 显示全部楼层
用Timer产生,把Timer醒成反转模式,Timer的寄存器 CMPR就是半周期值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

243

主题

1996

帖子

12

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