MSP430写TLV5616的驱动,输出线性关系不正确,求帮助!
如题,写TLV5616DR的驱动,主体如下。
void TLV5616_SetOutput_Voltage(unsigned int nVoltage)
{
//数据处理
unsigned char Mode_Byte =0;
unsigned char Msb = 0;
unsigned char Lsb = 0;
unsigned char i=0;
nVoltage %= 4096; //屏蔽高四位
Msb = nVoltage/256; //高8位,数据在高8位的后四位中
Lsb = nVoltage%256; //低8位
Msb = Msb << 4; //将数据移到高8位中的前四位
//时序开始
SET_SCLK;
SET_FS;
SET_CS;
_NOP();
_NOP();
CLR_CS;
CLR_FS;
//模式设置
Mode_Byte = Slow_Speed_Mode;
for(i=0;i<4;i++)
{
SET_SCLK;
if((Mode_Byte&0x80) != 0)
{
SET_DIN;
}
else
{
CLR_DIN;
}
CLR_SCLK;
Mode_Byte <<= 1;
}
for(i=0;i<4;i++) //先传输高四位
{
SET_SCLK;
if((Msb&0x80) != 0) //最高位为1
{
SET_DIN;
}
else
{
CLR_DIN;
}
CLR_SCLK;
Msb <<= 1;
}
for(i=0;i<8;i++)
{
SET_SCLK;
if((Lsb&0x80) != 0)
{
SET_DIN;
}
else
{
CLR_DIN;
}
CLR_SCLK;
Lsb <<= 1;
}
//时序恢复
SET_FS;
SET_CS;
SET_SCLK;
}
实际结果是这样的:用数字面板表显示。设定输入 0 对应 0.0输入 5对应 0.01 输入10 对应0.02 .。。。。
输入1000对应是 1.61 输入2000对应 3.21 输入3000对应 4.82 输入4000(接近最大值4095)对应的是5.01
而芯片供电电源是 VDD = 5V,REFIN接的是3.3。出现现在这样的结果找不到解决办法。 本帖最后由 小小码字员 于 2012-7-29 09:09 编辑
输出电压的公式为 2* REF*CODE/0x1000 按这个公式,CODE取2000时,那么输出就达到最大了(REF)值了。怎么解释这个公式啊?
自己解决了,从TLV5616输出电压公式看出,参考电压REF一定要小于或等于供电电压的一半,如供电电压选择5V,REF要小于等于2.5V.我刚开始选择的是供电电压 5V,参考电压 3.3V。结果就是 输入0~3300时,输出线性增长。但超过3300,后面全是供电电压5V.将REF改为2.5V后,正常了。 好东西,留着好好学习
我写好的模块。 VREF要小,不然满足不了上式 本帖最后由 peecehood 于 2012-10-8 13:45 编辑
写程式最好还是看清楚规格书,这颗我也有用。
另外,MSP430不是有硬体SPI? peecehood 发表于 2012-10-8 13:43 static/image/common/back.gif
写程式最好还是看清楚规格书,这颗我也有用。
另外,MSP430不是有硬体SPI?
哦,用的是MSP430F149,这个没有SPI。是啊,要好好看手册啊! 本帖最后由 peecehood 于 2012-10-17 08:38 编辑
MSP430F149官方的规格书是有硬体的喔,不过没用149所以要看看如何使用。
请参考官方文件中的fet140_spi0_04.c,就是使用TLV5616。
页:
[1]