微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > dac8832产生正弦波,频率上不去

dac8832产生正弦波,频率上不去

时间:10-02 整理:3721RD 点击:

最近在调DAC8832,想试试用它产生1K正弦波。每个周期用32个点恢复,每隔T/32中断一次,在中断里单片机将数字量写进8832(软SPI)。结果发现频率只能到390多HZ,比它频率低的波形能正常产生,但是比这个频率高了就始终是390多HZ。难道是因为我在中断里运行时间太长了?可是代码也没几行啊,主系统时钟也用的是8M,对于这个状况表示很困惑,具体代码如下:

/*************init_clk.c**************************/

#include "msp430x14x.h"

void init_clk(void)
{
unsigned char i;
BCSCTL1 &= ~(XT2OFF + XTS); //启动XT2高速时钟模块
BCSCTL2 |= SELM1+SELS; //MCLK主时钟选XT2为时钟源.XT2输入不分频. SMCLK选为XT2为时钟源.
do
{
IFG1 &=~OFIFG; //清OSCFault 标志
for(i=0xff;i>0;i--); //延时等待其开启稳定
}
while(IFG1 & OFIFG); //检查OSCFault标志位是否为0,若为0则表示XT2开启稳定.
}

/**************************************************/

/*************spi.c**********************************/

#include "msp430x14x.h"

//软SPI:P4.3作为SIMO P4.4作为SCLK P4.5作为片选端

#define simo_out P4DIR|=BIT3
#define simo_0 P4OUT&=~BIT3
#define simo_1 P4OUT|=BIT3

#define sclk_out P4DIR|=BIT4
#define sclk_0 P4OUT&=~BIT4
#define sclk_1 P4OUT|=BIT4

#define cs_out P4DIR|=BIT5
#define cs_0 P4OUT&=~BIT5
#define cs_1 P4OUT|=BIT5

float codesin[32]={0,0.1951,0.3827,0.5556,0.7071,0.8315,0.9239,0.9808,
1.0000,0.9808,0.9239,0.8315,0.7071,0.5556,0.3827,0.1951,0.0000,-0.1951,
-0.3827,-0.5556,-0.7071,-0.8315,-0.9239,-0.9808,-1.0000,-0.9808,-0.9239,
-0.8315,-0.7071,-0.5556,-0.3827,-0.1951};
int code[32];

void code_8832()
{
char i;
for(i=0;i<32;i++)
code[i]=(int)((codesin[i]+2.5)*32768/2.5);//Vout=-Vref+code*Vref/32768
}

void dac8832_spi(int data)
{
int i;
simo_out;
sclk_out;
cs_out;

cs_1;
cs_0;
for(i=0;i<16;i++)
{
sclk_0;
if(data&0x8000)
simo_1;
else
simo_0;
sclk_1;
data<<=1;
}
cs_1;
}

/*********************************************/

/**************main.c**********************/


#include "msp430x14x.h"

void init_clk(void);
void code_8832();
void dac8832_spi(int data);

int k;
extern int code[32];

void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
init_clk();
code_8832();

CCTL0 = CCIE;
CCR0 = 125;
TACTL = TASSEL_2 + MC_1+ID0; // MCLK,二分频, upmode
_EINT();

while(1);
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
dac8832_spi(code[k++]);
k=k%32;
}

/************************************************/

你用示波器看下两点之间的时间间隔是多少。

另外DAC输出是怎么接的呢?会不会是容性负载过大?

用示波器看到两点之间时间间隔是80us,但是我用定时器设定的应该是31us啊...........

定时器设的时间不一定准,准确的定时是需要通过示波器来观察的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top