This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

tlv5638 模拟方波输出问题

Other Parts Discussed in Thread: MSP430F5529, TLV5638

tlv5638 在输出方波的时候总是带有噪音的直流。msp430f5529控制。

附上代码和示波器DIN口显示的时序信号,大家给提提解决方案。

//****************tlv5638头文件******************//

#ifndef _tlv5638_H_
#define _tlv5638_H_

#define uint unsigned int
#define uchar unsigned char

/*** 参数定义 ***/
//速度模式参数
#define FASTSP 1 //快速模式
#define SLOWSP 0 //慢速模式

//电源模式参数
#define PWR_DOWN 1 //掉电模式
#define PWR_ON 0 //正常模式

//寄存器选择参数
#define DACB_BUFFER 0 //写DACB和BUFFER
#define BUFFER 1 //写BUFFER
#define DACA_BUFFERTOB 2 //写DACA和BUFFER的值更新DACB
#define CONTROL 3 //写控制寄存器

//参考源选择参数
#define EXTERNAL 0 //外部参考源
#define IN_1024 1 //内部1.024V参考源
#define IN_2048 2 //内部2.048V参考源

//引脚定义
//sbit PinDIN=P0^0;
//sbit PinSCLK=P0^2;
//sbit PinCS=P0^4;

//函数功能:短延时
void nNOP(uchar x);

//函数功能:长延时
void LongDelay(uint i);

//函数功能:置/复位CS信号
//说明:x=1—置位,x=0—复位
//#define SetCS(x)(PinCS=(x)?1:0)

//函数功能:置/复位SCLK信号
//说明:x=1—置位,x=0—复位
//#define SetSCLK(x) (PinSCLK=(x)?1:0)

//函数功能:向SPI写16位数据
//说明:temp为16位的数据
void SPIWrite(uint temp);

//函数功能:将电压值转换为对应的12位数字量
//说明:ref为参考源,ex_ref为当选择外部参考源的电压值,
// out_volt为输出模拟电压值
// 返回12数字量
int VoltToData(uint ref,float ex_ref,float out_volt);

//函数功能:设置DAC A(即A通道)输出
//说明:speed为速度模式,ref为参考源选择,temp为需要输出的电压
// ex_ref为当选择外部参考源的电压值
void SetDAC_A(uint speed,uint ref,float ex_ref,float temp);

//函数功能:设置DAC B(即B通道)输出
//说明:speed为速度模式,ref为参考源选择,temp为需要输出的电压
// ex_ref为当选择外部参考源的电压值
void SetDAC_B(uint speed,uint ref,float ex_ref,float temp);

//函数功能:设置DAC A与DAC B同时输出
//说明:speed为速度模式,ref为参考源选择,
// temp1为A通道需要输出的电压,temp2为B通道需要输出的电压
// ex_ref为当选择外部参考源的电压值
void SetDAC_AB(uint speed,uint ref,float ex_ref,float temp1,float temp2);
#endif//_TLV5638_H_

//**************主函数*****************//

#include <msp430.h>
#include "tlv5638.h"
//引脚定义 p1.5 DIN ; P1.4 SCLK;P1.3 CS;

#define PinDIN BIT5
#define PinSCLK BIT4
#define PinCS BIT3

#define Set_PinDIN() P1OUT |= PinDIN //因为脚不能位处理,所以这样子对脚赋值
#define Set_PinSCLK() P1OUT |= PinSCLK
#define Set_PinCS() P1OUT |= PinCS


#define Clr_PinDIN() P1OUT |= PinDIN; P1OUT&=~PinDIN
#define Clr_PinSCLK() P1OUT |= PinSCLK; P1OUT&=~PinSCLK //此处是给其求反,得到该位为零
#define Clr_PinCS() P1OUT |= PinCS; P1OUT&=~PinCS
//unsigned char watchar=0;
//long watchlong=0;
unsigned int watchint=0,watchint1=0,watchint2=0 ,watchint3=0,watchint4=0,watchint5=0,watch6=0,watch7;
//短延时函数:nNop( )
void nNop(uchar i)
{
for(;i>0;i--);
}

//长延时函数:LongDelay( )
void LongDelay(uint i)
{
uint j;
for(;i>0;i--)
{
for(j=1000;j>0;j--);
}
}

//向SPI写16位数据函数:SPIWrite( )
void SPIWrite(uint temp)
{
uint i,n;
Clr_PinCS();
for(i=0;i<16;i++)
{
n=(temp&0x8000);
if (n==0x8000)
{Set_PinDIN();}
else
{Clr_PinDIN();}
Set_PinSCLK();
watch6=temp;
temp<<=1;
watch7=temp;
nNop(1);
Clr_PinSCLK();
nNop(1);
}
Set_PinCS();
}

//将电压值转换为对应的12位数字量函数:VoltToData( )
int VoltToData(uint ref,float ex_ref,float out_volt)
{
int temp;
switch(ref)
{
case EXTERNAL:temp=(int)((out_volt*4096)/(2*ex_ref));
break;
case IN_1024:temp=(int)((out_volt*4096)/(2*1.024));
break;
case IN_2048:temp=(int)((out_volt*4096)/(2*2.048));
break;
default:break;
}
watchint=temp;
watchint1=(temp&0xfff);
return(temp&0xfff);
}

//设置DAC A(即A通道)输出函数:SetDAC_A( )
void SetDAC_A(uint speed,uint ref,float ex_ref,float temp)
{
int ModCMD;
int Data;
ModCMD=0x9000|(speed<<14)|(ref);
Data=VoltToData(ref,ex_ref,temp);
Data=Data|0x8000|(speed<<14);
SPIWrite(ModCMD);
nNop(10);
SPIWrite(Data);
}

//设置DAC B(即B通道)输出函数:SetDAC_B( )
void SetDAC_B(uint speed,uint ref,float ex_ref,float temp)
{
int ModCMD;
int Data;
ModCMD=0x9000|(speed<<14)|(ref);
watchint5=ModCMD;
Data=VoltToData(ref,ex_ref,temp);
watchint2=temp;
watchint3=Data;
Data=Data|0x0000|(speed<<14);
watchint4=Data;
SPIWrite(ModCMD);
nNop(10);
SPIWrite(Data);
}

//设置DAC A与DAC B同时输出函数SetDAC_AB( )
void SetDAC_AB(uint speed,uint ref,float ex_ref,float temp1,float temp2)
{
int ModCMD;
int DataA,DataB;
ModCMD=0x9000|(speed<<14)|(ref);
DataA=VoltToData(ref,ex_ref,temp1);
DataA=DataA|0x8000|(speed<<14);
DataB=VoltToData(ref,ex_ref,temp2);
DataB=DataB|0x1000|(speed<<14);
SPIWrite(ModCMD);
SPIWrite(DataB);
SPIWrite(DataA);
}


#include <msp430.h>
#include "tlv5638.h"
float vout;
int i,j;
void Init_DA5638()
{
Clr_PinDIN();
Clr_PinCS();
Clr_PinSCLK();
}

void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=PinDIN+PinSCLK;
P1DIR|=PinCS;
Init_DA5638();
while(1)
{
for(i=0;i<2;i++)
{
SetDAC_A(FASTSP,IN_1024,0,0.5);
}
for(i=0;i<2;i++)
{
SetDAC_A(FASTSP,IN_1024,0,1.5);
}
//SetDAC_A(FASTSP,IN_1024,0,0.5);
//SetDAC_AB(FASTSP,IN_1024,0,1.5,1.2);
}
}

//*********************示波器传出的DIN口数据**********************//

1101000000000001
1100001111101000

1101000000000001
1100001111101000

1101000000000001
1100101110111000

1101000000000001
1100101110111000

  • 1:一般不会是软件程序的问题。

    2:带有噪音的直流很可能是收到干扰了。

    3:建议检查一下电源的纹波和接地的方式。

  • 推荐给您一个解决方案文档

    http://www.chinabaike.com/z/keji/2011/0324/604299.html

    另外分享下我自己以前的解决方法:

    使用仪表:

           选频表或频谱分析仪

    测量方法:

           

         1)打开选频电平表的电源开关,待仪表工作正常后,进行校准;首先校准“零”点,然后再校准满度;

         2)将选频表的输入衰减倍率旋钮放在适当位置;

         3)将频段开关旋钮放在3.4kHz~150kHz范围内;

         4)将选频表的输入电缆线接在直流配电屏的输出端;

         5)慢慢旋转频率微调旋钮,使表头指针指在最大的位置上,如果表头无指示,则应减小输入衰减量,如果表头指针已达满度则应增加输入衰减量。杂音电压的数值应等于表头的指示数加上衰减量。

  • 噪音波动多少mV?建议用示波器检查一下噪声信号是否有周期性,纹波多大;然后量一下电源的纹波