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

}

}

相关推荐
Zyed9 小时前
[STM32]Day14独立看门狗+窗口看门狗
stm32·单片机·嵌入式硬件
H__Rick9 小时前
C51学习-DAY7
单片机·嵌入式硬件·学习·51单片机
济6179 小时前
BMS系统专栏:认知电池管理系统BMS的知识与功能
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
欢乐熊嵌入式编程9 小时前
第2讲:什么是优秀的软件架构?
stm32·单片机·freertos·低功耗蓝牙·嵌入式架构·efr32
嵌入式ZYXC9 小时前
第9篇:《面试题:ADC前端为什么要加运放跟随器?什么情况下可以不加?》
stm32·单片机·嵌入式硬件·面试·职场和发展
DS小龙哥9 小时前
基于STM32设计的电动车智能充电计费系统
stm32·单片机·嵌入式硬件
普中科技10 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 49 章 FLASH 字库实验
stm32·单片机·嵌入式硬件·flash·gbk·字库·普中科技
kyle~10 小时前
机器人日志系统
c++·单片机·嵌入式硬件·机器人·ros2
踏着七彩祥云的小丑10 小时前
嵌入式测试学习第 34 天:常见bug类型:死机、重启、数据错乱、通信丢包
单片机·嵌入式硬件·学习
一个嵌入式学徒10 小时前
STM32+ESP8266 接入机智云平台完整步
stm32·单片机·嵌入式硬件