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

}

}

相关推荐
从零点2 小时前
如何在cmake中添加自己的项目文件夹文件
嵌入式硬件
广州灵眸科技有限公司2 小时前
瑞芯微(EASY EAI)RV1126B 人脸98关键点算法识别
开发语言·科技·嵌入式硬件·物联网·算法·php
篮子里的玫瑰2 小时前
FreeRTOS:信号量与互斥量在DMA串口发送中的实战剖析
stm32·单片机·嵌入式硬件·算法
LCG元3 小时前
STM32实战:基于STM32F103的智能鱼缸自动投喂与换水系统
stm32·单片机·嵌入式硬件
进击的小头3 小时前
第3篇:嵌入式芯片核心架构基础:冯·诺依曼架构与哈佛架构的本质差异与场景适配
单片机·嵌入式硬件·架构
UTP协同自动化测试3 小时前
用UTP标准版搭建物联网模组交联测试环境:APP + UART + I2C + GPIO + PWM
嵌入式硬件·物联网·测试工具
要退休的攻城狮4 小时前
跳到千问挖的坑里去了
c++·人工智能·嵌入式硬件·visualstudio
liuluyang5304 小时前
DW_apb_uart 16650 寄存器详解
单片机·嵌入式硬件·uart·基础外设
Wave8454 小时前
STM32低功耗模式
stm32·单片机·嵌入式硬件