有人用过TLV5638这块DA吗?我编好程了他就是不工作!

有人用过TLV5638这块DA吗?我编好程了他就是不工作!,第1张

恩挺好用的这个芯片

#include<reg52.h>

#include<intrins.H>

#include<string.h>

#define uint unsigned int

unsigned char code table_sin[256]=

{0x7f,0x82,0x85,0x88,0x8b,0x8f,0x92,0x95,0x98,0x9b,0x9e,0xa1,

0xa4,0xa7,0xaa,0xad,0xb0,0xb3,0xb6,0xb8,0xbb,0xbe,0xc1,0xc3,0xc6,0xc8,

0xcb,0xcd,0xd0,0xd2,0xd5,0xd7,0xd9,0xdb,0xdd,0xe0,0xe2,0xe4,0xe5,0xe7,

0xe9,0xeb,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,

0xfb,0xfb,0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xfe,0xfe,0xfe,

0xfe,0xfe,0xfd,0xfd,0xfc,0xfb,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,

0xf2,0xf1,0xef,0xee,0xec,0xeb,0xe9,0xe7,0xe5,0xe4,0xe2,0xe0,0xdd,0xdb,

0xd9,0xd7,0xd5,0xd2,0xd0,0xcd,0xcb,0xc8,0xc6,0xc3,0xc1,0xbe,0xbb,0xb8,

0xb6,0xb3,0xb0,0xad,0xaa,0xa7,0xa4,0xa1,0x9e,0x9b,0x98,0x95,0x92,0x8f,

0x8b,0x88,0x85,0x82,0x7f,0x7c,0x79,0x76,0x73,0x6f,0x6c,0x69,0x66,0x63,

0x60,0x5d,0x5a,0x57,0x54,0x51,0x4e,0x4b,0x48,0x46,0x43,0x40,0x3d,0x3b,

0x38,0x36,0x33,0x31,0x2e,0x2c,0x29,0x27,0x25,0x23,0x21,0x1e,0x1c,0x1a,

0x19,0x17,0x15,0x13,0x12,0x10,0xf,0xd,0xc,0xa,0x9,0x8,0x7,0x6,0x5,0x4,

0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,

0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xf,0x10,0x12,0x13,0x15,

0x17,0x19,0x1a,0x1c,0x1e,0x21,0x23,0x25,0x27,0x29,0x2c,0x2e,0x31,0x33,0x36,

0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,

0x63,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c}

#define uchar unsigned char

//速度模式参数

#define FASTSP 1 //快速模式

#define SLOESP 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=P1^0

sbit PinSCLK=P1^1

sbit CS=P1^2

//函数功能:短延时

void nNOP(uchar x)

//函数功能:长延时

void LongDelay(uint i)

//函数功能:置/复位CS信号

//说明:x=1-置位,x=0-复位

//函数功能:置/复位SCLK信号

//说明:x=1-置位,x=0-复位

#define SetSCLK(x) (PinSCLK=(x)?1:0)

//函数功能:向SPI写16位数据

//说明:temp为16位的数据

void SPIWrite(int 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)

//短延时函数:nNop( )

void nNop(uchar i)

{

for(i>0i--)

}

//长延时函数:LongDelay( )

void LongDelay(uint i)

{ uint j

for(i>0i--)

{ for(j=1000j>0j--)

}

}

//向SPI写16位数据函数:SPIWrite( )

void SPIWrite(int temp)

{ uint i

CS=0

for(i=0i<16i++)

{ PinDIN=(bit)(temp&0x8000)

SetSCLK(1)

temp<<=1

nNop(1)

SetSCLK(0)

nNop(1)

}

CS=1

}

//将电压值转换为对应的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))

//case IN_2048:temp=out_volt

break

default:break

}

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)

Data=VoltToData(ref,ex_ref,temp)

Data=Data|0x0000|(speed<<14)

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)

}

void InitIO( )

{ PinDIN=0

CS=0

PinSCLK=0

}

void main()

{

float i

InitIO()

while(1)

{ //SetDAC_A(FASTSP,IN_1024,0,1.0)

//SetDAC_B(FASTSP,IN_1024,0,1.0)

SetDAC_AB(SLOESP,IN_2048,0,1,2)

}

}

这个是从网上找的 改改就能用想输出几伏电压改改SetDAC_AB(SLOESP,IN_2048,0,1,2)

最后2个数字就可以这个是让AB同时输出的。接的时候不要让REF接东西就行了不然就成外部参考了

tlv5638,两通道输出,输出非常精准,5V供电就可以了。用3个IO口控制,内部供电可以输出最高2V,外部供电任意,但连线麻烦。可编程设置时间:快速1us,慢速:10us。编程也很简单··


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8085945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存