ad9833多少位,请问AD9833的频率控制字怎么写 希望能举一个实例要求详细解答过程
来源:整理 编辑:亚灵电子网 2024-09-06 12:13:23
1,请问AD9833的频率控制字怎么写 希望能举一个实例要求详细解答过程
先计算十进制的控制字,转成28位的二进制数,然后再分成高低14位并补成16位,补的两位为频率寄存器的选择。

2,通过硬件SPI设置AD9833输出方波怎么弄延迟关键么SPI写函数已经被厂
第一步,查看芯片手册配置SPI工作方式,控制芯片的SPI工作方式必须和AD9833的一样。第二步,使用厂商做好的函数进行AD9833的设置。(我没有用过AD9833)但是带串行接口的芯片一般都需要设置一下,怎么设置需要看AD手册了。第三步,向AD发送你想要输出的数字量吧。

3,AD9833产生三角波的问题
有可能是你的负载上有电容,你断开其他的电路,直接去测量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,相位移为0void 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,相位移为0void 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, 则使用该变量表示写向哪个AD9833void 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; //写向PREQ1else word_12= Char_1 |0xC0; //写向PREQ0if (If_to_all == 1) //写动作 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, 则使用该变量表示写向哪个AD9833void 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位信息 word_14_h= Char_1 |0x80; } else //写向FREQ0 word_14_h= Char_2 |0x40; }if(Msbs_or_Lsbs == 1) //确定控制寄存器的内容 control_word_h= 0x10 ; control_word_l = 0x00; }else control_word_h= 0x00 ; control_word_l = 0x00; }if (If_to_All == 1) //写动作 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:表示写向FREQ1void 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) //写动作 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 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()结构 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);}

文章TAG:
多少ad9833多少位 请问AD9833的频率控制字怎么写 希望能举一个实例要求详细解答过程
相关文章推荐
- 发电机没电压输出故障,小发电机启动后无输出电压
- 如何测宿舍电压,宿舍电压怎么测?
- 甲类功率放大电路的,什么是甲类功放?
- 控制电路的连接方法,电路连接的基本方式
- 变压器电焊机次级电压,焊接变压器的输出电压
- 隔离dcdc芯片厂商,dc-dc隔离电源芯片
- 上电的瞬间大电压,为什么通电瞬间电压高?
- th22671电路图,tb2926hq电路图
- 激光 驱动 电路,红色激光笔电路原理?
- pN8124芯片参数,pn8124f参数
- adc电路的特点,普通adc的典型电路
- 任意波发生器 芯片33250 a任意波形发生器
- 投影仪升压电路,如何维修DLP投影仪?
- 单端电压 差动电压,差分电压和单端电压
- 8550如何做转灯电路,358转向灯电路图