一、简介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-BII类三、主要应用领域• 脉动式血氧计• 水表• 摄像机• 医疗传感器贴片• 楼宇安全网关四、内部原理框图五、引脚定义六、头文件#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); // 初始化 GPIOvoid 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, MOSIGPIO_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. 片选有效: 拉低 CSTPL0501_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);elseHAL_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 j0; j5; j);// 时钟恢复为低HAL_GPIO_WritePin(TPL0501_SCK_PORT, TPL0501_SCK_PIN, GPIO_PIN_RESET);for(volatile int j0; j5; j);// 移位准备发送下一位data 1;}// 3. 结束传输: 拉高 CSTPL0501_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);}}