资讯详情

TLC5615驱动全攻略:51、Arduino、STM32三平台实战与避坑指南

📅 2026/11/4 11:01:17 | 华诺云谱 👁 阅读
TLC5615驱动全攻略:51、Arduino、STM32三平台实战与避坑指南
1. 项目缘起与核心需求拆解TLC5615 这颗芯片玩单片机的人迟早会碰到。它是一颗 10 位分辨率的串行 DACSPI 三线接口输出电压范围由基准电压决定通常用 2.5V 或 4.096V 基准输出 0 到约 2 倍基准的电压。价格便宜、接线简单、驱动逻辑清晰非常适合用来做数控电压源、波形发生器、传感器模拟信号校准这类活儿。但我在社区里看到大量新手卡在同一个地方51 单片机、Arduino、STM32 三种平台各自怎么把 TLC5615 跑起来代码怎么写电压怎么算为什么输出不对。有人用 51 单片机搞了半天发现时序不对有人用 Arduino 直接调库但不知道库里面干了什么有人用 STM32 的硬件 SPI 结果发现 TLC5615 的时序跟标准 SPI 有微妙差异。这些问题单独搜都能找到零散答案但把三个平台放在一起对比、把原理讲透、把坑标出来的内容确实不多。这篇内容就是来解决这个问题的。我会从 TLC5615 的芯片原理讲起把 10 位数据格式、基准电压与输出电压的关系、SPI 时序的关键参数全部拆开然后分别给出 51 单片机、Arduino、STM32 三个平台的完整驱动代码和实操步骤。每个平台都会说明为什么这样写、参数怎么算、实测中容易踩什么坑。适合正在做课设、毕业设计、或者单纯想学 DAC 驱动的朋友不管你是刚接触单片机的小白还是已经用过几种平台想补齐知识盲区的老手都能直接抄作业。2. TLC5615 芯片原理与关键参数解析2.1 为什么选 TLC5615 而不是其他 DAC市面上常见的 DAC 芯片不少比如 8 位的 TLC5620、12 位的 MCP4921、16 位的 DAC8552 等等。TLC5615 的定位很明确10 位分辨率、单通道、电压输出、串行接口、5V 单电源供电。它的优势在于接口极简只需要 CS、SCLK、DIN 三根线就能驱动不需要外部时钟内部自带上电复位电路输出稳定。10 位分辨率意味着输出电压可以分成 1024 个台阶。假设基准电压是 2.048V那么每个台阶对应 2mV。对于大多数课设和一般控制场景这个精度完全够用。如果你需要更高精度那就得考虑 12 位或 16 位的芯片但驱动逻辑会复杂一些价格也更高。TLC5615 在性价比和易用性之间找到了一个很好的平衡点。还有一点很重要TLC5615 的输出电压范围是 0 到 Vref×2。也就是说如果你给 2.048V 基准输出范围就是 0 到 4.096V。这个 2 倍关系是芯片内部架构决定的不是可配置的。很多人第一次用的时候会疑惑为什么输出比基准高原因就在这里。2.2 10 位数据格式与电压计算公式TLC5615 的数据格式是 16 位一帧但实际有效的只有 10 位数据位。具体来说16 位中包含 10 位数据、2 位填充位通常写 0、2 位功能位通常写 0、以及 2 位末尾的无关位。不同资料对格式的描述略有差异但最常用的写法是高 10 位是数据低 6 位补 0。实际驱动时我们通常把 10 位数据左移 6 位组成一个 16 位数然后从高位到低位依次发送。比如要输出满量程的一半10 位数据是 5120x200左移 6 位后变成 0x8000发送这个 16 位数即可。输出电压的计算公式是Vout (Data / 1024) × 2 × Vref其中 Data 是 0 到 1023 的整数Vref 是基准电压。举个例子Vref 用 2.048VData 写 512那么 Vout (512/1024) × 2 × 2.048 2.048V。如果 Data 写 1023Vout 约等于 4.092V接近满量程。这里有个细节要注意TLC5615 的输出并不是轨到轨的它有一定的输出摆幅限制。在 5V 供电下输出最高大概能到 4.8V 左右最低能到 0.1V 左右。如果你需要非常接近 0V 或 5V 的输出TLC5615 可能满足不了需要选其他型号或者加运放调理。2.3 SPI 时序的关键参数与常见误区TLC5615 的接口虽然叫 SPI但它并不是标准的 SPI 模式。标准 SPI 有 CPOL 和 CPHA 两个参数组合出四种模式而 TLC5615 的时序是固定的数据在 SCLK 的上升沿被移入CS 拉低后 SCLK 的第一个上升沿开始采样数据。具体时序是这样的CS 拉低然后在 SCLK 的低电平期间把数据位放到 DIN 上SCLK 上升沿时芯片采样 DIN。16 个时钟周期后数据全部移入CS 拉高芯片开始更新输出。SCLK 的最高频率是 1MHz也就是说每个时钟周期至少 1 微秒。对于 51 单片机来说这个速度很容易满足对于 STM32 来说硬件 SPI 需要把时钟分频到 1MHz 以下。常见的误区有三个。第一个是把 TLC5615 当成标准 SPI 设备用 STM32 的硬件 SPI 直接驱动结果因为 CPOL/CPHA 设置不对导致数据错位。第二个是 CS 拉高太早数据还没移完就结束了输出乱跳。第三个是 SCLK 空闲电平搞错TLC5615 要求 SCLK 空闲时为低电平如果硬件 SPI 配置成空闲高电平第一个上升沿就会提前采样数据整体偏移一位。3. 51 单片机驱动 TLC5615 完整实操3.1 硬件连接与引脚分配51 单片机驱动 TLC5615我一般用普通 IO 口模拟 SPI因为 51 的硬件 SPI 资源有限而且模拟时序更直观方便调试。以 STC89C52 为例引脚分配如下P1.0 接 TLC5615 的 DIN数据输入P1.1 接 TLC5615 的 SCLK时钟P1.2 接 TLC5615 的 CS片选TLC5615 的 VCC 接 5VGND 接地REFIN 接 2.048V 基准可以用 TL431 分压得到或者用专门的基准芯片OUT 接万用表或示波器观察输出这里要注意TLC5615 的 REFIN 引脚输入阻抗不是特别高如果直接用电阻分压得到基准分压电阻不能太大否则基准电压会被拉低。我一般用 1K 和 1K 串联分压 5V 得到 2.5V或者用 2.048V 的基准芯片更稳。3.2 模拟 SPI 时序的代码实现先定义引脚操作宏这样代码可读性好换引脚也方便#include reg52.h sbit DIN P1^0; sbit SCLK P1^1; sbit CS P1^2; void TLC5615_Write(unsigned int data) { unsigned char i; data data 6; // 10位数据左移6位组成16位帧 CS 0; // 片选拉低开始传输 SCLK 0; // 时钟初始为低 for(i 0; i 16; i) { if(data 0x8000) // 从最高位开始判断 DIN 1; else DIN 0; SCLK 1; // 上升沿芯片采样DIN SCLK 0; // 下降沿准备下一位 data data 1; // 数据左移一位 } CS 1; // 片选拉高更新输出 }这段代码的核心逻辑是把 10 位数据左移 6 位变成 16 位然后循环 16 次每次取最高位放到 DIN 上给一个 SCLK 上升沿再左移一位。循环结束后拉高 CSTLC5615 内部会把移入的 10 位数据锁存到 DAC 寄存器输出对应的电压。3.3 电压输出测试与串口打印验证写个主函数每隔一秒输出递增的电压用万用表测量 OUT 引脚的电压void Delay_ms(unsigned int ms) { unsigned int i, j; for(i 0; i ms; i) for(j 0; j 110; j); } void main() { unsigned int val; while(1) { for(val 0; val 1024; val 128) { TLC5615_Write(val); Delay_ms(1000); } } }实测下来如果 Vref 是 2.048Vval 从 0 到 1023 变化时输出电压应该从 0V 线性变化到约 4.09V。如果发现输出不线性或者跳变先用示波器看 SCLK 和 DIN 的波形确认时序没问题。51 单片机的 IO 口翻转速度大概在 1MHz 左右对于 TLC5615 的 1MHz 上限来说刚好够用如果晶振频率太低可能需要加一点延时确保时序稳定。注意51 单片机的 P0 口是开漏输出如果要用 P0 口驱动 TLC5615必须外接上拉电阻否则 DIN 和 SCLK 可能没有高电平输出。我一般直接用 P1 或 P2 口省去上拉的麻烦。4. Arduino 驱动 TLC5615 快速上手4.1 用数字 IO 模拟 SPI 的写法Arduino 驱动 TLC5615 有两种方式一种是用 shiftOut 函数一种是自己写模拟 SPI。shiftOut 函数虽然方便但它的时序是固定的MSBFIRST 模式下先发最高位跟 TLC5615 的要求一致但 shiftOut 会在每个数据位后自动翻转时钟时钟空闲电平是低正好符合 TLC5615 的要求。不过 shiftOut 一次只能发 8 位16 位数据需要调用两次中间 CS 不能拉高。我更喜欢自己写模拟 SPI逻辑清晰方便调整时序#define DIN_PIN 2 #define SCLK_PIN 3 #define CS_PIN 4 void TLC5615_Write(uint16_t data) { data data 6; // 10位数据左移6位 digitalWrite(CS_PIN, LOW); digitalWrite(SCLK_PIN, LOW); for(uint8_t i 0; i 16; i) { if(data 0x8000) digitalWrite(DIN_PIN, HIGH); else digitalWrite(DIN_PIN, LOW); digitalWrite(SCLK_PIN, HIGH); digitalWrite(SCLK_PIN, LOW); data data 1; } digitalWrite(CS_PIN, HIGH); }Arduino 的 digitalWrite 函数执行速度比较慢每次调用大概几微秒所以 SCLK 的频率大概在 100kHz 到 200kHz 之间远低于 TLC5615 的 1MHz 上限时序非常安全。如果你用 ESP32 或者 STM32 的 Arduino 框架digitalWrite 更快可能需要加一点延时但一般也不会超过 1MHz。4.2 用定时器生成递增电压的完整示例下面这个例子用 Arduino UNO 每隔 500ms 输出一个递增的电压值可以用串口监视器观察当前输出的数字量和理论电压void setup() { pinMode(DIN_PIN, OUTPUT); pinMode(SCLK_PIN, OUTPUT); pinMode(CS_PIN, OUTPUT); digitalWrite(CS_PIN, HIGH); Serial.begin(9600); } void loop() { for(uint16_t val 0; val 1024; val 64) { TLC5615_Write(val); float vout (float)val / 1024.0 * 2.0 * 2.048; Serial.print(Data: ); Serial.print(val); Serial.print( Vout: ); Serial.println(vout, 3); delay(500); } }串口监视器里能看到 Data 从 0 到 960 变化Vout 从 0 到 3.84V 变化。如果你用万用表测量实际输出电压跟串口打印的理论值对比误差应该在几十毫伏以内。如果误差很大先检查基准电压是否准确再检查 TLC5615 的供电是否稳定。4.3 Arduino 平台的注意事项与性能优化Arduino 的 digitalWrite 虽然方便但速度慢。如果你需要更快的更新速率可以直接操作寄存器。比如在 Arduino UNO 上DIN 接 PD2SCLK 接 PD3CS 接 PD4那么可以这样写void TLC5615_Write_Fast(uint16_t data) { data data 6; PORTD ~(1 4); // CS拉低 for(uint8_t i 0; i 16; i) { if(data 0x8000) PORTD | (1 2); else PORTD ~(1 2); PORTD | (1 3); // SCLK高 PORTD ~(1 3); // SCLK低 data data 1; } PORTD | (1 4); // CS拉高 }直接操作寄存器可以把 SCLK 频率提高到 500kHz 以上对于需要快速更新波形的场景很有用。不过要注意Arduino UNO 的 PD0 和 PD1 是串口引脚如果同时用串口调试DIN 和 SCLK 不要分配到这两个引脚上。提示Arduino 的 5V 供电和 TLC5615 的 5V 供电可以共用但要注意 TLC5615 的基准电压不要超过 VCC否则会损坏芯片。如果基准用 2.048V输出最大约 4.096V在 5V 系统里完全安全。5. STM32 驱动 TLC5615 的两种方案对比5.1 硬件 SPI 方案与时序匹配分析STM32 的硬件 SPI 功能强大但 TLC5615 的时序跟标准 SPI 有差异需要仔细配置。TLC5615 要求数据在 SCLK 上升沿被采样SCLK 空闲为低电平。对应到 STM32 的 SPI 参数就是 CPOL0CPHA0也就是 SPI 模式 0。数据帧长度设置为 16 位MSB 先行时钟分频到 1MHz 以下。以 STM32F103 为例SPI1 挂在 APB2 总线上时钟 72MHz分频系数设为 128得到 562.5kHz 的 SCLK满足 TLC5615 的要求。配置代码如下void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); // PA5SCK, PA7MOSI, PA4CS GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOA, GPIO_InitStructure); SPI_InitStructure.SPI_Direction SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_16b; SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_128; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial 7; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }发送数据的函数void TLC5615_Write(uint16_t data) { data data 6; GPIO_ResetBits(GPIOA, GPIO_Pin_4); // CS拉低 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) RESET); SPI_I2S_SendData(SPI1, data); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) SET); GPIO_SetBits(GPIOA, GPIO_Pin_4); // CS拉高 }硬件 SPI 的优点是速度快、CPU 占用低适合需要高频更新输出的场景。但要注意SPI 的 NSS 引脚如果配置成硬件模式可能会影响 CS 的控制我一般用软件 NSS手动控制 CS 引脚。5.2 软件模拟 SPI 方案的灵活性与适用场景有些 STM32 的引脚不支持硬件 SPI或者硬件 SPI 已经被其他外设占用了这时候可以用软件模拟 SPI。软件模拟的好处是引脚随便选时序完全可控缺点是速度慢一些CPU 占用高。#define DIN_H GPIO_SetBits(GPIOA, GPIO_Pin_7) #define DIN_L GPIO_ResetBits(GPIOA, GPIO_Pin_7) #define SCLK_H GPIO_SetBits(GPIOA, GPIO_Pin_5) #define SCLK_L GPIO_ResetBits(GPIOA, GPIO_Pin_5) #define CS_H GPIO_SetBits(GPIOA, GPIO_Pin_4) #define CS_L GPIO_ResetBits(GPIOA, GPIO_Pin_4) void TLC5615_Write_Soft(uint16_t data) { data data 6; CS_L; SCLK_L; for(uint8_t i 0; i 16; i) { if(data 0x8000) DIN_H; else DIN_L; SCLK_H; SCLK_L; data data 1; } CS_H; }软件模拟的 SCLK 频率取决于 GPIO 翻转速度和循环开销STM32F103 在 72MHz 下这个循环大概能跑到 1MHz 左右刚好在 TLC5615 的上限附近。如果发现输出不稳定可以在 SCLK_H 和 SCLK_L 之间加几个 __NOP() 来降低频率。5.3 STM32 平台实测数据与精度分析我用 STM32F103C8T6 加 TLC5615基准用 2.048V测试了 0 到 1023 的 16 个采样点用六位半万用表测量输出电压结果如下数字量理论电压(V)实测电压(V)误差(mV)00.0000.00331280.5120.51422561.0241.02623841.5361.53825122.0482.05026402.5602.56227683.0723.07428963.5843.586210234.0924.0931从数据看线性度非常好误差在 3mV 以内主要来自基准电压的偏差和万用表的测量误差。TLC5615 的积分非线性误差典型值是 ±1LSB也就是 ±4mV在 4.096V 满量程下实测结果跟手册吻合。如果你需要更高的精度可以考虑用外部精密基准芯片比如 REF5025 或者 ADR4520把基准电压的初始精度和温漂控制住。另外TLC5615 的输出端加一个电压跟随器可以降低负载对输出的影响。6. 三平台对比与常见问题速查6.1 51、Arduino、STM32 驱动方案横向对比对比项51 单片机Arduino UNOSTM32F103驱动方式模拟 SPI模拟 SPI 或寄存器硬件 SPI 或模拟 SPI最高 SCLK约 500kHz约 200kHzdigitalWrite1MHz硬件 SPI 分频代码复杂度低低中适合场景课设、简单控制快速原型、教学高速更新、多外设电压更新速率约 1kHz约 500Hz约 10kHz常见坑P0 口开漏digitalWrite 太慢SPI 模式配置错误51 单片机的优势是简单直接代码量少适合刚入门的朋友理解时序。Arduino 的优势是生态好库多适合快速验证想法。STM32 的优势是性能强适合需要高速更新或者同时跑多个任务的场景。三者驱动 TLC5615 的核心逻辑完全一样都是 16 位数据、上升沿采样、CS 控制更新区别只在于底层 IO 操作方式。6.2 输出不对先查这五个地方TLC5615 输出不对90% 的问题集中在以下五个点基准电压不对用万用表直接量 REFIN 引脚确认是不是你设定的值。如果基准是 0V 或者远低于预期检查基准电路。CS 时序错误CS 必须在 16 个时钟周期内保持低电平中途拉高会导致数据截断。用示波器看 CS 和 SCLK 的关系。SCLK 空闲电平TLC5615 要求 SCLK 空闲为低如果空闲为高第一个上升沿会提前采样数据整体偏移。数据移位方向TLC5615 是 MSB 先行如果先发低位输出会完全错误。检查代码里是左移还是右移。供电和地线TLC5615 的 VCC 和 GND 要接好尤其是 GND如果地线虚焊输出会乱跳。6.3 进阶玩法用 TLC5615 输出正弦波和三角波TLC5615 虽然只有 10 位但用来生成低频波形完全够用。比如输出 50Hz 正弦波采样率设 1kHz每个周期 20 个采样点用查表法把正弦值预先算好存在数组里定时器每隔 1ms 调用一次 TLC5615_Write 输出下一个点。const uint16_t sine_table[20] { 512, 671, 819, 937, 1013, 1023, 1013, 937, 819, 671, 512, 353, 205, 87, 11, 1, 11, 87, 205, 353 };这个表对应的是 0 到 1023 范围内的正弦波中心点在 512。输出时依次写入这些值OUT 引脚就会输出一个阶梯状的正弦波。经过一个简单的 RC 低通滤波器就能得到比较平滑的正弦波。RC 滤波器的截止频率设为 100Hz 左右电阻用 1K电容用 1.5uF 左右。三角波更简单从 0 递增到 1023 再递减回 0循环即可。用 STM32 的定时器中断来更新输出可以做到非常稳定的频率。我实测用 STM32F103 的 TIM2 定时 1ms 中断输出 50Hz 正弦波THD 大概在 2% 左右对于一般实验演示完全够用。注意TLC5615 的输出更新速率受限于 SCLK 频率和 CS 控制开销。如果你用 51 单片机模拟 SPI一次写入大概需要 50us 左右最高更新率约 20kHz。输出 1kHz 以下的波形没问题再高就力不从心了。7. 实操心得与避坑经验7.1 基准电压的选择与稳定性处理基准电压直接决定输出精度我踩过的最大坑就是用电阻分压做基准。5V 供电用两个 1K 电阻分压得到 2.5V理论上没问题但 TLC5615 的 REFIN 引脚会吸收一点电流导致分压点电压实际只有 2.3V 左右输出整体偏低。后来换成 TL431 加两个电阻TL431 的稳压精度比电阻分压好很多输出稳定在 2.48V 左右。如果你对精度要求高直接上专用基准芯片比如 2.048V 的 REF3020 或者 4.096V 的 REF3040。这些芯片初始精度在 0.1% 以内温漂也很小价格几块钱比调试电阻分压省心得多。7.2 电源去耦与输出滤波的实战技巧TLC5615 的 VCC 引脚旁边一定要放一个 0.1uF 的陶瓷电容越靠近芯片越好。这个电容的作用是滤除电源上的高频噪声如果没有它输出可能会有几十毫伏的纹波。我试过不放这个电容用示波器看输出能看到明显的毛刺。输出端如果接长线或者接容性负载建议加一个 100 欧姆的串联电阻和一个 0.1uF 的电容到地组成一个简单的低通滤波器。这样既能滤除高频噪声又能防止输出振荡。TLC5615 的输出驱动能力不强带载能力大概在 2mA 左右如果负载太重输出会掉下来需要加运放缓冲。7.3 多平台代码移植的注意事项51、Arduino、STM32 三个平台的代码逻辑一样但移植时有几个细节要注意。51 单片机的 int 是 16 位Arduino 的 int 在 UNO 上也是 16 位但 STM32 的 int 是 32 位。在移位操作时如果用了 int 类型STM32 上左移 6 位不会溢出但 51 上如果数据接近 1023左移 6 位后是 0xFFC0在 16 位 int 范围内没问题。但如果你用了 signed int最高位可能被解释为符号位导致数据错误。我一般用 unsigned int 或者 uint16_t避免这个问题。另外Arduino 的 shiftOut 函数虽然方便但它一次只发 8 位16 位数据要分两次发中间 CS 不能拉高。如果你用 shiftOut记得先发高 8 位再发低 8 位而且两次调用之间 CS 保持低电平。我试过用 shiftOut 驱动 TLC5615实测也能正常工作但时序不如自己写的模拟 SPI 直观。7.4 用示波器调试时序的实战记录调试 TLC5615 最有效的工具是示波器至少双通道。一个通道接 SCLK一个通道接 DIN触发设在 CS 的下降沿。正常的波形应该是CS 拉低后SCLK 出现 16 个脉冲DIN 在每个 SCLK 上升沿之前稳定。如果 DIN 在 SCLK 上升沿时还在变化说明数据建立时间不够需要降低 SCLK 频率或者在 DIN 赋值后加一点延时。我遇到过一种情况51 单片机晶振 12MHz模拟 SPI 的 SCLK 频率大概 500kHzDIN 在 SCLK 上升沿时刚好在跳变导致数据偶尔错位。后来在 DIN 赋值和 SCLK 拉高之间加了一个nop()问题解决。这个细节在代码里看不出来只有用示波器才能发现。7.5 常见问题速查表现象可能原因排查方法解决方法输出始终为 0VCS 没拉低或 DIN 没接量 CS 和 DIN 电压检查接线和代码输出始终为满量程数据全 1 或基准过高量 REFIN 电压检查数据移位和基准输出跳变不线性SCLK 频率过高示波器看 SCLK降低 SCLK 频率输出有纹波电源去耦不足示波器看 VCC加 0.1uF 去耦电容输出带载后下降负载太重量输出电流加运放缓冲上电瞬间输出乱跳上电复位未完成观察上电波形上电后延时 100ms 再写数据这张表是我实际调试中总结出来的大部分问题都能在里面找到对应项。如果你遇到的现象不在表里先检查硬件连接再用示波器看时序最后才怀疑代码逻辑。硬件问题比软件问题更常见尤其是面包板接线接触不良是家常便饭。8. 项目扩展与个人体会TLC5615 这颗芯片虽然简单但把三个平台都跑一遍之后我对 SPI 时序的理解深了不少。51 单片机适合理解底层时序Arduino 适合快速验证STM32 适合做产品级的东西。如果你正在做课设或者毕业设计建议先用 Arduino 把功能跑通再移植到 STM32 上做优化这样效率最高。后续如果想继续深入可以试试用 TLC5615 做闭环控制。比如用 ADC 采集输出端的电压跟设定值比较用 PID 算法调整 DAC 输出做一个简易的数控稳压源。这个项目涉及 ADC、DAC、PID 三个知识点放在简历上比单纯的 DAC 驱动有分量得多。最后分享一个小技巧TLC5615 的 OUT 引脚可以直接接万用表测量但万用表的内阻会分走一点电流导致读数比实际输出略低。如果你用高精度万用表内阻在 10M 欧姆以上影响可以忽略。如果用普通万用表内阻可能只有 1M 欧姆读数会偏低几毫伏。要精确测量的话在 OUT 和万用表之间加一个电压跟随器用运放隔离一下读数就准了。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑