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