一、简介:
TPL0501-100DCNR 是 TI 推出的一款 256 抽头数字电位器,采用 SPI 接口控制,端到端电阻为 100kΩ。它非常适合用来替代机械电位器,实现程序化的电阻调节,比如在可调电源、传感器校准或增益放大电路中。
TPL0501 的标称温度系数为35ppm/°C。
TPL0501 采用 8 引脚SOT-23 和 8 引脚UQFN封装,额定温度范围为--40°C至+125° C。
二、主要技术特性:
• 单通道256位置分辨率
• 100kΩ 端到端电阻选项
• 低温度系数:35ppm/°C
• SPI兼容串行接口
• 2.7V 至5.5V 单电源运行
• ±20%电阻容差
• 工作温度:--40°C至+125°C
• ESD性能测试符合JESD22标准-- 2000V 人体放电模型(A114-B,II类)
三、主要应用领域:
• 脉动式血氧计
• 水表
• 摄像机
• 医疗传感器贴片
• 楼宇安全网关
四、内部原理框图:

五、引脚定义:

六、头文件:
#ifndef _TPL0501_H
#define _TPL0501_H
#include "main.h" // 包含 HAL 库及 GPIO 定义
// 定义 GPIO 端口和引脚 (根据你的硬件连接修改)
#define TPL0501_CS_PORT GPIOA
#define TPL0501_CS_PIN GPIO_PIN_4
#define TPL0501_SCK_PORT GPIOA
#define TPL0501_SCK_PIN GPIO_PIN_5
#define TPL0501_MOSI_PORT GPIOA
#define TPL0501_MOSI_PIN GPIO_PIN_7
// 宏定义操作:拉高/拉低 CS 引脚
#define TPL0501_CS_HIGH() HAL_GPIO_WritePin(TPL0501_CS_PORT, TPL0501_CS_PIN, GPIO_PIN_SET)
#define TPL0501_CS_LOW() HAL_GPIO_WritePin(TPL0501_CS_PORT, TPL0501_CS_PIN, GPIO_PIN_RESET)
// 外部函数
void TPL0501_Init(void); // 初始化 GPIO
void TPL0501_SetWiper(uint8_t pos); // 设置抽头位置 (0-255)
#endif
七、驱动源文件:
#include "tpl0501.h"
// 函数: TPL0501_Init
// 功能: 配置 CS, SCK, MOSI 为推挽输出,并设置为默认高电平
void TPL0501_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能 GPIO 时钟 (以 GPIOA 为例)
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置 CS, SCK, MOSI
GPIO_InitStruct.Pin = TPL0501_CS_PIN | TPL0501_SCK_PIN | TPL0501_MOSI_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速即可
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 设置初始状态:CS 高 (未选中),SCK 低,MOSI 低
TPL0501_CS_HIGH();
HAL_GPIO_WritePin(TPL0501_SCK_PORT, TPL0501_SCK_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(TPL0501_MOSI_PORT, TPL0501_MOSI_PIN, GPIO_PIN_RESET);
}
// 函数: TPL0501_SetWiper
// 参数: pos (0 ~ 255)
// 0 -> W 接至 L (电阻最小值)
// 255 -> W 接至 H (电阻最大值)
// 说明: 使用软件模拟 SPI (时序简单,移植方便)
void TPL0501_SetWiper(uint8_t pos)
{
uint8_t i;
uint8_t data = pos; // 数据就是抽头位置
// 1. 片选有效: 拉低 CS
TPL0501_CS_LOW();
// 2. 发送 8 位数据 (MSB First)
for(i = 0; i < 8; i++)
{
// 设置数据线 (MOSI)
if(data & 0x80) // 取出当前最高位
HAL_GPIO_WritePin(TPL0501_MOSI_PORT, TPL0501_MOSI_PIN, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(TPL0501_MOSI_PORT, TPL0501_MOSI_PIN, GPIO_PIN_RESET);
// 产生时钟上升沿 (SCK 低->高),TPL0501 在上升沿采样
HAL_GPIO_WritePin(TPL0501_SCK_PORT, TPL0501_SCK_PIN, GPIO_PIN_SET);
// 短暂延时,根据你的主频调整,或者使用空指令
for(volatile int j=0; j<5; j++);
// 时钟恢复为低
HAL_GPIO_WritePin(TPL0501_SCK_PORT, TPL0501_SCK_PIN, GPIO_PIN_RESET);
for(volatile int j=0; j<5; j++);
// 移位,准备发送下一位
data <<= 1;
}
// 3. 结束传输: 拉高 CS
TPL0501_CS_HIGH();
// 4. 短暂延时,等待内部寄存器更新 (TPL0501 更新很快,几微秒,通常可省略)
HAL_Delay(1);
}
八、应用示例:
int main(void)
{
HAL_Init();
TPL0501_Init(); // 初始化驱动引脚
// 让电阻从最小逐渐变大,循环
while (1)
{
// 电位器最小: W 短接 L (如果 L 接地,则输出电阻接近 0)
TPL0501_SetWiper(0);
HAL_Delay(1000);
// 中间位置: 约 50kΩ (100k * (128/256))
TPL0501_SetWiper(128);
HAL_Delay(1000);
// 电位器最大: W 短接 H,输出 100kΩ
TPL0501_SetWiper(255);
HAL_Delay(1000);
}
}