Arduino教程学习A18-Arduino连接TM8211(PT8211)廉价16bit音频DAC

Ansifa 于 2015-6-30 16:20 编辑



Arduino连接TM8211(PT8211)廉价16bit音频DAC



首先说一下DAC和PWM的关系:

DAC是通过电阻分压+开关组合直接凑出想要的电压,输出是直流恒定电压量,比如1024级的DAC,输出512,就是0.5个VCC直流。PWM是通过振荡占空比得到想要电压,比如比如1024级的PWM,输出512,就是50%时间高电平VCC,50%时间低电平0。产生能量刚好是0.5个VCC一样的能量。



LED调光,电机调速,更适合使用PWM。产生模拟音频,产生指定直流电压,控制仪表等更适合使用DAC





TM8211(PT8211)是一片输出分辨率有16bit(65536级电压值),两通道输出的DAC。非常廉价,淘宝零售价大概在0.4元一片左右,而专门用做数字DAC的芯片比如TLC5615(10bit),MAX515(10bit)之类的都需要2元以上甚至更高



下面是转载的介绍:

TM8211是两路16位数模转换集成电路,可广泛应用于数字音频、多媒体系统。芯片采用CMOS工艺设计,内部电路结构基于R-2R电阻网络结构设计,并在全电源电压范围内实现16bit的动态范围。 TM8211可通过采用数字串行总线数据输入,采用快速R-2R网络结构来支持8X的过采样音频信号处理。TM8211 支持较宽范围的采样频率,并与PT8211、TDA1311兼容,输入采用LSBJ (Least Significant Bit Justified ) 格式, 数字编码格式采用MSB在前的补码格式。 TM8211 采用8-pin SOP or DIP封装。



此音频DAC比起数字DAC输出电压范围不够宽广,线性不如数字DAC好。抖动也比较大。不过价格低廉,在要求低的时候可以当做普通数字DAC使用。



硬件连接:

根据官方PDF的标准电路,随便找三个arduino的IO口接BCK/WS/DIN即可。

C({5)TZBW%M6RC1JY)OMM.png

2015-6-30 16:18 上传
(33.6 KB)





软件编写:

ARDUINO 代码复制打印下载

//定义引脚,可以自行修改引脚对应int BCK = 10, WS = 9, DIN = 8;unsigned int cnt = 0;//TM8211驱动函数,void TM8211(unsigned int wr_dat8211){  for(int i = 16; i > 0; i--)  {  digitalWrite(BCK, LOW);  digitalWrite(DIN, (wr_dat8211 >> i) & 0x01);  digitalWrite(BCK, HIGH);  }}void setup(){  //所有引脚都是输出方式  pinMode(BCK, OUTPUT);  pinMode(WS, OUTPUT);  pinMode(DIN, OUTPUT);}void loop(){  //cnt是DA值  if(cnt > 0xFFF0)  {  cnt = 0;  }  //WS是通道选择,这段代码是两个通道LCH/RCH同时输出cnt,也可以分开LCH/RCH控制的,具体看pdf  digitalWrite(WS, LOW);  TM8211(cnt);  digitalWrite(WS, HIGH);  digitalWrite(WS, LOW);  delay(1);  cnt += 0x0F;  //每次输出增加16个等级}
//定义引脚,可以自行修改引脚对应

int BCK = 10, WS = 9, DIN = 8;

unsigned int cnt = 0;



//TM8211驱动函数,

void TM8211(unsigned int wr_dat8211)

{

for(int i = 16; i > 0; i--)

{

digitalWrite(BCK, LOW);

digitalWrite(DIN, (wr_dat8211 >> i) & 0x01);

digitalWrite(BCK, HIGH);

}

}



void setup()

{

//所有引脚都是输出方式

pinMode(BCK, OUTPUT);

pinMode(WS, OUTPUT);

pinMode(DIN, OUTPUT);

}



void loop()

{

//cnt是DA值

if(cnt > 0xFFF0)

{

cnt = 0;

}

//WS是通道选择,这段代码是两个通道LCH/RCH同时输出cnt,也可以分开LCH/RCH控制的,具体看pdf

digitalWrite(WS, LOW);

TM8211(cnt);

digitalWrite(WS, HIGH);

digitalWrite(WS, LOW);

delay(1);

cnt += 0x0F; //每次输出增加16个等级

}



代码输出的是一个锯齿波,输出电平0x0000-0xFFFF。1毫秒上升0x0F个等级
接一个LED在输出端即可看到渐亮效果。

由于LED亮起电压1.8v,本例是0-5v扫描,在0-1.8v扫描时候可能看不到LED亮起,请留意,这不是程序问题,是正常现象


via - 极客工坊

标签: Arduino教程