更多内容,请访问我的网站:https://jiangge12.github.io/
翻出早年买的几颗 TLC5615,无聊想试试性能怎么样,测试结果比只ESP32自带的DAC快一点点,但是比 ESP32 的8位 DAC 精度高些,是10位的。
下面这种叫 DIP封装,可以方便插在面包板上实验。
实验步骤:
用到硬件:ESP32 、TLC5615、示波器、面包板 以及几条线。
1. TLC5615 连线如下:
Vdd 和 AGND ---------------- 5V电源,可由ESP32提供。
Out 和 AGND ---------------- 输出,可接示波器或万用表观察输出电压的变化。
三个数据引脚 ----------------- 按下面程序连接普通数字引脚,不同的单片机改改即可。
REFIN -------------------------- 外接参考电压,不接不行 !
通常要求是 Vcc/2, 这样输出范围是 0 ~ 2x REFIN ,即 0 ~ Vcc.
如Vcc是5V,可以由 TL431 这类的 2.5v 电压基准器件提供,或者Vcc接电阻分压。
本次测试为了省事,接 ESP32 GPIO25(DAC输出),比较方便获得了 Vcc/2 。
如没有以上条件,临时调试程序也可以把 REFIN 接到 Vcc,不过512以上的输出限幅。
DOUT -------------------------- 这里只用到单个TLC5615 芯片,不接。
2. 软件:Arduino IDE, TLC5615 库
下载的库居然是错的,出来的波形怪怪的。
啃一下PDF后,写成下面的DAC函数就可以用了,关键就是 data & 0x0200 这句。
3. 下面程序写入 ESP32 即可在示波器上看到正弦波
#define DIN_Pin 22
#define SCLK_Pin 19
#define CS_Pin 23
float Pi = 3.1416;
int i = 0;
int slice = 60; // 766Hz
int output;
void setup() {
Serial.begin(115200);
dacWrite(25,127); //8 位DAC, 127 输出 Vcc/2 给Ref, TLC5615输出范围: 0 ~ Ref x2
pinMode(DIN_Pin,OUTPUT);
pinMode(SCLK_Pin,OUTPUT);
pinMode(CS_Pin,OUTPUT);
}
void loop() {
output = 511*(sin( i * 2 * Pi/slice)+1);
TLC5615_Convert( output );
i++;
if ( i >= slice) i = 0;
}
void TLC5615_Convert(unsigned int data)
{
digitalWrite(CS_Pin, LOW); // DAC start
for ( int i=0; i<12; i++) // 共传输12位,仅前10位有效,后两位任意
{
if (data & 0x0200) digitalWrite(DIN_Pin, HIGH); // 10位 max:0x03FF ,最高位为1 = 0x200 , (data & 0x0200)取最高位值
else digitalWrite(DIN_Pin, LOW);
digitalWrite(SCLK_Pin, HIGH);
digitalWrite(SCLK_Pin, LOW);
data <<= 1; // 向左位移1位,也可以写为:data = data<<1
}
digitalWrite(CS_Pin, HIGH); // DAC end
}