求助:PT8211-16位音频DA编程疑问
小弟刚学51单片机,蛋痛地从老式VCD上拆下一块PT8211来玩。找到对应文档,貌似很容易驱动的样子,于是有了下面的程序。
为了调试方便,驱动函数只操作高8位,低8位置0。
问题来了:
输入127的时候得到约3.682V最高电压,
输入128时得到最低电压1.241V,
输入0时得到约2.470V,
输入255时得到2.460V.
VCC为4.92V.
按我的理解应该是输入0时,输出电压最小且为0V,输入255时输出电压最大且等于VCC.为什么会出现我的这种情况呢?是我的函数错误还是我理解文档错误,又或者这类音频双DA就是这样设计的呢?
求高人指点一二,拜谢!附上我的函数和找到的说明档.
#include <reg52.h>
//#include "Time.h"
//#include <intrins.h>
//#define NOP _nop_();_nop_();_nop_();_nop_();_nop_()
sbit BCK=P3^6;
sbit WS=P3^5;
sbit DIN=P3^4;
/*双16位D/A芯片,这里当8位用*/
void PT8211_Write(unsigned char R_dat,L_dat)
{
unsigned char i=0;
WS=0; //右声道输入
for(i=0;i<8;i++)
{
BCK=0;
if(R_dat&0x80) //比较高位,是1送1,是0送0
{
DIN=1;
}
else
{
DIN=0;
}
R_dat=R_dat<<1;
BCK=1; //BCK上升沿送入数据
}
for(i=0;i<8;i++){BCK=0;DIN=0;BCK=1;} //低8位全置零
WS=1; //左声道输入
for(i=0;i<8;i++)
{
BCK=0;
if(L_dat&0x80) //if((L_dat>>7)&0x01)
{
DIN=1;
}
else
{
DIN=0;
}
L_dat=L_dat<<1;
BCK=1;
}
for(i=0;i<8;i++){BCK=0;DIN=0;BCK=1;} //低8位全置零
}
本帖最后由 gzhuli 于 2012-6-4 16:17 编辑
音频DAC是用二进制补码的,最高位是符号位:
0x7F -> 127
...
0x01 -> 1
0x00 -> 0 (中点电压)
0xFF -> -1
0xFE -> -2
...
0x80 -> -128
音频DAC是用二进制补码的,最高位是符号位:
0x7F -> 127
...
0x01 -> 1
0x00 -> 0 (中点电压)
0xFF -> -1
0xFE -> -2
...
0x80 -> -128
感谢gzhuli!
是不是由于这个符号位的存在,单电源下我无法将输出调到0V或VCC了对吧?这是IC的设计决定的?
音频DAC一般都不是轨到轨输出的,本来就到不了0和VCC,而且直流精度很差,因为音频应用不关心直流精度,只关心线性度。 非常感谢,我消化一下先{:funk:} 修改完毕{:biggrin:}
void PT8211_Write(unsigned char R_dat,L_dat)
{
unsigned char i=0;
R_dat-=128;
WS=0; //右声道输入
for(i=0;i<8;i++)
{
BCK=0;
if(R_dat&0x80) //比较高位,是1送1,是0送0
{
DIN=1;
}
else
{
DIN=0;
}
R_dat=R_dat<<1;
BCK=1; //BCK上升沿送入数据
}
for(i=0;i<8;i++){BCK=0;DIN=0;BCK=1;} //低8位全置零
WS=1; //左声道输入
L_dat-=128;
for(i=0;i<8;i++)
{
BCK=0;
if(L_dat&0x80) //if((L_dat>>7)&0x01)
{
DIN=1;
}
else
{
DIN=0;
}
L_dat=L_dat<<1;
BCK=1;
}
for(i=0;i<8;i++){BCK=0;DIN=0;BCK=1;} //低8位全置零
} 谢谢 下载进去试试 好,可以玩玩,毕竟是16位呢。可以ADC组成闭环系统。 gzhuli 发表于 2012-6-4 17:03 static/image/common/back.gif
音频DAC一般都不是轨到轨输出的,本来就到不了0和VCC,而且直流精度很差,因为音频应用不关心直流精度,只 ...
学习了!
MARK 学习学习。{:smile:} 对这些便宜的音频DAC用基准校正直流偏差后,不知能不能当做工业DAC用,哪位小伙伴去试试
页:
[1]