基于STM32LXXX的数字电位器(TPL0501-100DCNR)驱动应用程序设计

一、简介:

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);

}

}

相关推荐
FreakStudio4 小时前
做了个Claude Code CLI 电子宠物:程序员的实体监工代码搭子
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
芯岭技术5 小时前
PY32L020系列32位MCU,超低功耗、高性价比,支持三种低功耗模式
单片机·嵌入式硬件
危桥带雨10 小时前
RTC理论知识
stm32·单片机·嵌入式硬件·实时音视频
ElfBoard12 小时前
飞凌精灵(ElfBoard)技术贴|如何在RK3506开发板上实现UART功能复用
大数据·linux·人工智能·驱动开发·单片机·嵌入式硬件·物联网
踏着七彩祥云的小丑13 小时前
嵌入式——认识电子元器件——二极管系列
单片机·嵌入式硬件
Jack_022013 小时前
基于51单片机的智能电动窗帘控制OLED显示设计
单片机·嵌入式硬件·51单片机·智能家居·oled显示·电动窗帘
sz49723859913 小时前
vscode多种编译环境共存的方法
ide·vscode·stm32·编辑器·esp32
摘星台13 小时前
linux环境对stm32单片机进行程序烧录
linux·stm32·单片机
Joseph Cooper14 小时前
STM32MP157 Linux驱动学习笔记(三):系统级驱动框架(UART/PCIe)
linux·stm32·学习
森G14 小时前
STM32F103C8T6工程---标准库版usart2写回显
stm32·单片机