风气网

AD9833产生三角波的问题

2024-09-20来自:本站整理
用ad9833模块产生的方波的幅度怎么比正弦波和三角波大好几倍,比如方波是6v的时候,三角波才不到

最大值都是0.65V,参见规格书

你给的是个信号发生器电路,只有输出信号,是没有外输入信号的;
另外,555定时器电路,在其中的定时电容上,也可得到锯齿波的;

利用市电,可采用个带过零点检测的光耦芯片电路,可得到50Hz的正方波(占空比=50%);
通过微分电路,即可获得窄脉冲波,然后再积分,即可得到你想要的很陡峭的锯齿波了;

有可能是你的负载上有电容,你断开其他的电路,直接去测量AD9833的输出脚就可以了,下面是一个例程,工参考
#include "head.h"
#include "cpu.h"
#include "AD9833.h"
//定义延时变量,用于宏AD9833_Delay()()
UNCHAR AD9833_delay_t;
/******************AD9833 延时******************/
/*宏定义:AD9833_Delay() */
#define AD9833_Delay()\
{\
AD9833_delay_t = (AD9833_Delay_Value);\
while ( --AD9833_delay_t!= 0 );\
}
/************延迟N 个SCLK 节拍***************/
void Delay_N_MCLK(UNCHAR N)
{
UNCHAR i,t;
for(i=0;i<=N;i++)
{
AD9833_SCLK = 1;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;
for(t=0;t<20;t++);
}
}
/******************向单个AD9833 写入一个16位的信息字节******************/
//AD9833_16 表示写入的信息,Which_AD9833 表示写入哪个AD9833;
void Write_16bit_One(UNCHAR Char_1,UNCHAR Char_2, UNCHAR Which_AD9833_CS)
{
UNCHAR i,t;
AD9833_SCLK = 1;
switch(Which_AD9833_CS) //确定片选
{
case 1:
P1=~0x80; break;
case 2:
P1=~0x40; break;
case 3:
P1=~0x20; break;
case 4:
P1=~0x10; break;
case 5:
P1=~0x08; break;
case 6:
P1=~0x04; break;
default:
P1=~0x00; break;
}
for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{
if((Char_1<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{
if((Char_2<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
P1 = 0xff;
}
/******************向所有AD9833 写入一个16位的信息字节******************/
void Write_16bit_All(UNINT AD9833_16_Data)
{
UNCHAR t,i;
i = 8;
AD9833_SCLK = 1;
P1 = 0xff; //片选
P1 = 0x03;
for(i=0;i<16;i++) //对于确定次数的循环建议使用for()结构
{
if((AD9833_16_Data<<i) &0x8000)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
while (--t != 0);
}
P1 = 0xff; //片选拉高
Delay_N_MCLK(8);
}
/******************初始化AD9833 ******************/
//主要实现控制寄存器的D8位的RESET 置1,使得内部所有寄存器
//初始化为频率为50,相位移为0
void AD9833_Init(void)
{
Write_16bit_All_Two(0x21,0x00); //RESET=1,
//Write_28bit_One_FR(1, 0, 0x4000,0x0000 );//改FREG0
//AD9833_50HZ_0Ps_Init();//初始化为标准三相电源
Write_16bit_All_Two(0x00,0x00); //RESET=0,
}
/******************初始化为标准三相电源 ******************/
//初始化为频率为50,相位移为0
void AD9833_50HZ_0Ps_Init(void)
{
Write_28bit_One_FR(1, 0, 0x6a,0x40,0x40,0x13 );//改FREG0
Write_28bit_One_FR(1, 1, 0xaa,0x40,0x80,0x13);//改FREG1
Write_12bit_One_PR(1, 0, 0, 0,0);//改PREG0
Write_12bit_One_PR(1, 1, 0, 0,0);//改PREG1
}
/****************** 向单个AD9833写入12位到某一相位寄存器 ******************/
//if_to_all 0:表示写向单个AD9833;--1:表示写向所有AD9833;
//Phase_0_or_1 表示写向哪一个相位寄存器--0:表示写向pREQ0-- 1:表示写向pREQ1
//Phase_12_Data: 表示相位信息;
//Which_AD9833_CS: 若if_to_all=0, 则使用该变量表示写向哪个AD9833
void Write_12bit_One_PR(bit If_to_all, bit Phase_0_or_1, UNCHAR Char_1,UNCHAR
Char_2,UNCHAR Which_AD9833_CS)
{
UNINT word_12;
if (Phase_0_or_1 == 1)//确定写入的14位信息
word_12= Char_1 |0xE0; //写向PREQ1
else
word_12= Char_1 |0xC0; //写向PREQ0
if (If_to_all == 1) //写动作
{//写向所有的AD9833
Write_16bit_All_Two(word_12,Char_2);
}
else //写向单个的AD9833
{
Write_16bit_One(word_12,Char_2,Which_AD9833_CS);
}
}
/****************** 改变某个AD9833 频率寄存器的MSBs 或LSBs ******************/
//Msbs_or_Lsbs 0:表示写向单个AD9833的LSBs; 1:表示写向所有
AD9833的MSBs;
//If_to_All 0: 表示写向单个AD9833; 1: 表示写向所有
AD9833;
//FREQ0_or_1 0:表示写向FREQ0 1:表示写向FREQ1
//Msbs_or_Lsbs_14_Data : 表示要写入的内容
//Which_AD9833_CS : 如果If_to_All=0, 则使用该变量表示写向哪个
AD9833
void Write_14bit_One_FR( bit Msbs_or_Lsbs, bit If_to_All,UNCHAR
FREQ0_or_1,UNCHAR Char_1,UNCHAR Char_2,UNCHAR Which_AD9833_CS)
{
UNCHAR word_14_h,control_word_h,control_word_l;
if (FREQ0_or_1 == 1) //确定写入的14位信息
{ //写向FREQ1
word_14_h= Char_1 |0x80;
}
else //写向FREQ0
{
word_14_h= Char_2 |0x40;
}
if(Msbs_or_Lsbs == 1) //确定控制寄存器的内容
{// 1:表示写向所有AD9833的MSBs;
control_word_h= 0x10 ;
control_word_l = 0x00;
}
else
{ // 0:表示写向单个AD9833的LSBs;
control_word_h= 0x00 ;
control_word_l = 0x00;
}
if (If_to_All == 1) //写动作
{ //写向所有的AD9833
Write_16bit_All_Two(0x20,0x00);
Write_16bit_All_Two(word_14_h,Char_2);
}
else //写向单个的AD9833
{
Write_16bit_One(0x20,0x00, Which_AD9833_CS);
Write_16bit_One(word_14_h,Char_2, Which_AD9833_CS);
}
}
/****************** 向AD9833写入连续的28位到某一频率寄存器 ******************/
//if_to_all 0:表示写向单个AD9833; 1:表示写向所有
AD9833;
//FREQ0_or_1 0:表示写向FREQ0 1:表示写向
FREQ1
void Write_28bit_One_FR(bit If_to_all, UNCHAR FREQ0_or_1, UNCHAR
low_14_h,UNCHAR low_14_l,UNCHAR high_14_h,UNCHAR high_14_l)
{
if (If_to_all==1) //写动作
{ //写向所有的AD9833
Write_16bit_All_Two(0x20,0x00);
Write_16bit_All_Two(low_14_h,low_14_l);
Write_16bit_All_Two(high_14_h,high_14_l);
}
else
{ //写向单个的AD9833
Write_16bit_One(0x20,0x00, FREQ0_or_1);
Write_16bit_One(low_14_h,low_14_l, FREQ0_or_1);
Write_16bit_One(high_14_h,high_14_l, FREQ0_or_1);
}
}
////////////////////替代void Write_16bit_All(UNINT AD9833_16_Data),
//,一下函数可以用
void Write_16bit_All_Two(UNCHAR Char_1,UNCHAR Char_2)
{
UNCHAR t,i;
i = 8;
AD9833_SCLK = 1;
P1 = 0xff; //片选
P1 = 0x03;

for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{// _nop_();
if((Char_1<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{
if((Char_2<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
P1 = 0xff; //片选拉高
Delay_N_MCLK(8);
}

有可能是你的负载上有电容,你断开其他的电路,直接去测量AD9833的输出脚就可以了,下面是一个例程,工参考
#include "head.h"
#include "cpu.h"
#include "AD9833.h"
//定义延时变量,用于宏AD9833_Delay()()
UNCHAR AD9833_delay_t;
/******************AD9833 延时******************/
/*宏定义:AD9833_Delay() */
#define AD9833_Delay()\
{\
AD9833_delay_t = (AD9833_Delay_Value);\
while ( --AD9833_delay_t!= 0 );\
}
/************延迟N 个SCLK 节拍***************/
void Delay_N_MCLK(UNCHAR N)
{
UNCHAR i,t;
for(i=0;i<=N;i++)
{
AD9833_SCLK = 1;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;
for(t=0;t<20;t++);
}
}
/******************向单个AD9833 写入一个16位的信息字节******************/
//AD9833_16 表示写入的信息,Which_AD9833 表示写入哪个AD9833;
void Write_16bit_One(UNCHAR Char_1,UNCHAR Char_2, UNCHAR Which_AD9833_CS)
{
UNCHAR i,t;
AD9833_SCLK = 1;
switch(Which_AD9833_CS) //确定片选
{
case 1:
P1=~0x80; break;
case 2:
P1=~0x40; break;
case 3:
P1=~0x20; break;
case 4:
P1=~0x10; break;
case 5:
P1=~0x08; break;
case 6:
P1=~0x04; break;
default:
P1=~0x00; break;
}
for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{
if((Char_1<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{
if((Char_2<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
P1 = 0xff;
}
/******************向所有AD9833 写入一个16位的信息字节******************/
void Write_16bit_All(UNINT AD9833_16_Data)
{
UNCHAR t,i;
i = 8;
AD9833_SCLK = 1;
P1 = 0xff; //片选
P1 = 0x03;
for(i=0;i<16;i++) //对于确定次数的循环建议使用for()结构
{
if((AD9833_16_Data<<i) &0x8000)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
while (--t != 0);
}
P1 = 0xff; //片选拉高
Delay_N_MCLK(8);
}
/******************初始化AD9833 ******************/
//主要实现控制寄存器的D8位的RESET 置1,使得内部所有寄存器
//初始化为频率为50,相位移为0
void AD9833_Init(void)
{
Write_16bit_All_Two(0x21,0x00); //RESET=1,
//Write_28bit_One_FR(1, 0, 0x4000,0x0000 );//改FREG0
//AD9833_50HZ_0Ps_Init();//初始化为标准三相电源
Write_16bit_All_Two(0x00,0x00); //RESET=0,
}
/******************初始化为标准三相电源 ******************/
//初始化为频率为50,相位移为0
void AD9833_50HZ_0Ps_Init(void)
{
Write_28bit_One_FR(1, 0, 0x6a,0x40,0x40,0x13 );//改FREG0
Write_28bit_One_FR(1, 1, 0xaa,0x40,0x80,0x13);//改FREG1
Write_12bit_One_PR(1, 0, 0, 0,0);//改PREG0
Write_12bit_One_PR(1, 1, 0, 0,0);//改PREG1
}
/****************** 向单个AD9833写入12位到某一相位寄存器 ******************/
//if_to_all 0:表示写向单个AD9833;--1:表示写向所有AD9833;
//Phase_0_or_1 表示写向哪一个相位寄存器--0:表示写向pREQ0-- 1:表示写向pREQ1
//Phase_12_Data: 表示相位信息;
//Which_AD9833_CS: 若if_to_all=0, 则使用该变量表示写向哪个AD9833
void Write_12bit_One_PR(bit If_to_all, bit Phase_0_or_1, UNCHAR Char_1,UNCHAR
Char_2,UNCHAR Which_AD9833_CS)
{
UNINT word_12;
if (Phase_0_or_1 == 1)//确定写入的14位信息
word_12= Char_1 |0xE0; //写向PREQ1
else
word_12= Char_1 |0xC0; //写向PREQ0
if (If_to_all == 1) //写动作
{//写向所有的AD9833
Write_16bit_All_Two(word_12,Char_2);
}
else //写向单个的AD9833
{
Write_16bit_One(word_12,Char_2,Which_AD9833_CS);
}
}
/****************** 改变某个AD9833 频率寄存器的MSBs 或LSBs ******************/
//Msbs_or_Lsbs 0:表示写向单个AD9833的LSBs; 1:表示写向所有
AD9833的MSBs;
//If_to_All 0: 表示写向单个AD9833; 1: 表示写向所有
AD9833;
//FREQ0_or_1 0:表示写向FREQ0 1:表示写向FREQ1
//Msbs_or_Lsbs_14_Data : 表示要写入的内容
//Which_AD9833_CS : 如果If_to_All=0, 则使用该变量表示写向哪个
AD9833
void Write_14bit_One_FR( bit Msbs_or_Lsbs, bit If_to_All,UNCHAR
FREQ0_or_1,UNCHAR Char_1,UNCHAR Char_2,UNCHAR Which_AD9833_CS)
{
UNCHAR word_14_h,control_word_h,control_word_l;
if (FREQ0_or_1 == 1) //确定写入的14位信息
{ //写向FREQ1
word_14_h= Char_1 |0x80;
}
else //写向FREQ0
{
word_14_h= Char_2 |0x40;
}
if(Msbs_or_Lsbs == 1) //确定控制寄存器的内容
{// 1:表示写向所有AD9833的MSBs;
control_word_h= 0x10 ;
control_word_l = 0x00;
}
else
{ // 0:表示写向单个AD9833的LSBs;
control_word_h= 0x00 ;
control_word_l = 0x00;
}
if (If_to_All == 1) //写动作
{ //写向所有的AD9833
Write_16bit_All_Two(0x20,0x00);
Write_16bit_All_Two(word_14_h,Char_2);
}
else //写向单个的AD9833
{
Write_16bit_One(0x20,0x00, Which_AD9833_CS);
Write_16bit_One(word_14_h,Char_2, Which_AD9833_CS);
}
}
/****************** 向AD9833写入连续的28位到某一频率寄存器 ******************/
//if_to_all 0:表示写向单个AD9833; 1:表示写向所有
AD9833;
//FREQ0_or_1 0:表示写向FREQ0 1:表示写向
FREQ1
void Write_28bit_One_FR(bit If_to_all, UNCHAR FREQ0_or_1, UNCHAR
low_14_h,UNCHAR low_14_l,UNCHAR high_14_h,UNCHAR high_14_l)
{
if (If_to_all==1) //写动作
{ //写向所有的AD9833
Write_16bit_All_Two(0x20,0x00);
Write_16bit_All_Two(low_14_h,low_14_l);
Write_16bit_All_Two(high_14_h,high_14_l);
}
else
{ //写向单个的AD9833
Write_16bit_One(0x20,0x00, FREQ0_or_1);
Write_16bit_One(low_14_h,low_14_l, FREQ0_or_1);
Write_16bit_One(high_14_h,high_14_l, FREQ0_or_1);
}
}
////////////////////替代void Write_16bit_All(UNINT AD9833_16_Data),
//,一下函数可以用
void Write_16bit_All_Two(UNCHAR Char_1,UNCHAR Char_2)
{
UNCHAR t,i;
i = 8;
AD9833_SCLK = 1;
P1 = 0xff; //片选
P1 = 0x03;

for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{// _nop_();
if((Char_1<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
for(i=0;i<8;i++) //对于确定次数的循环建议使用for()结构
{
if((Char_2<<i) &0x80)//确定SDATA上的数据
{
AD9833_SDATA = 1;
}
else
{
AD9833_SDATA = 0;
}
AD9833_SCLK = 0;
for(t=0;t<20;t++);
AD9833_SCLK = ~AD9833_SCLK;//在下降沿写?AD9833_Delay();
//_nop_(); AD9833_Delay();
for(t=0;t<10;t++);
}
P1 = 0xff; //片选拉高
Delay_N_MCLK(8);
}

41

sf

  • [叔姣全17256792148] - AD9833产生三角波的问题
    詹凌荷::有可能是你的负载上有电容,你断开其他的电路,直接去测量AD9833的输出脚就可以了,下面是一个例程,工参考 include "head.h"include "cpu.h"include "AD9833.h"\/\/定义延时变量,用于宏AD9833_Delay()()UNCHAR AD9833_delay_t;\/***AD9833 延时***\/ \/*宏定义:AD9833_Delay() *\/ define...
  • [叔姣全17256792148] - 用ad9833模块产生的方波的幅度怎么比正弦波和三角波大好几倍,比如方波...
    詹凌荷::最大值都是0.65V,参见规格书
  • [叔姣全17256792148] - DDS芯片AD9833的COMP引脚是干什么的?
    詹凌荷::COMP 电流补偿控制引脚
  • [叔姣全17256792148] - 求锯齿波转换或发生电路
    詹凌荷::你给的是个信号发生器电路,只有输出信号,是没有外输入信号的;另外,555定时器电路,在其中的定时电容上,也可得到锯齿波的;利用市电,可采用个带过零点检测的光耦芯片电路,可得到50Hz的正方波(占空比=50%);通过微分电路,即可获得窄脉冲波,然后再积分,即可得到你想要的很陡峭的锯齿波了;
  • 首页 热门
    返回顶部
    风记网