基于STM32LXXX的数字电位器(TPL0401B-10DCKR)驱动应用程序设计

张开发
2026/4/5 16:25:54 15 分钟阅读

分享文章

基于STM32LXXX的数字电位器(TPL0401B-10DCKR)驱动应用程序设计
一、简介TPL0401B-10DCKR是德州仪器TI推出的一款单通道、128抽头、10kΩ的数字电位器采用I2C接口控制默认地址为0x3E (0111110)。该芯片采用SC-70-6超小型封装非常适合对空间敏感的低功耗应用场景。二、主要技术特性参数值端到端电阻10kΩ抽头数128 (7位分辨率)接口类型I2C (标准模式100kHz/快速模式400kHz)I2C地址0x3E (7位地址二进制0111110)工作电压2.7V ~ 5.5V静态电流1.5µA (典型值)温度系数22ppm/℃工作温度-40℃ ~ 125℃封装SC-70-6存储器类型易失性 (断电后复位至中间值)三、引脚定义引脚号引脚名称类型描述4SDA数字I/OI2C数据线开漏需外接上拉电阻典型4.7kΩ3SCL数字输入I2C时钟线开漏需外接上拉电阻2GND电源地器件地6H模拟端电位器高端连接最高电位5W模拟端电位器抽头端可调输出1VDD电源工作电压 2.7V ~ 5.5V建议加0.1µF旁路电容至GND四、头文件/*** file tpl0401b.h* brief TPL0401B-10DCKR 数字电位器驱动头文件* version V1.0*/#ifndef __TPL0401B_H#define __TPL0401B_H#ifdef __cplusplusextern C {#endif#include stm32l4xx_hal.h/* 硬件配置宏 */#define TPL0401B_I2C_HANDLE hi2c1 /* I2C句柄根据实际修改 */#define TPL0401B_I2C_ADDR 0x3E 1 /* 7位地址左移1位得到8位写地址0x7C *//* 抽头位置定义 */#define TPL0401B_TAP_MIN 0 /* 最小抽头(A端) */#define TPL0401B_TAP_MAX 127 /* 最大抽头(B端) */#define TPL0401B_TAP_MID 64 /* 中间抽头(默认复位位置) *//* 接口函数声明 *//*** brief 设置抽头位置* param tap 抽头位置(0~127)* retval HAL状态*/HAL_StatusTypeDef TPL0401B_SetWiper(uint8_t tap);/*** brief 获取当前抽头位置* param pTap 存储读取的抽头位置* retval HAL状态*/HAL_StatusTypeDef TPL0401B_GetWiper(uint8_t *pTap);/*** brief 增加抽头位置* retval HAL状态*/HAL_StatusTypeDef TPL0401B_Increment(void);/*** brief 减少抽头位置* retval HAL状态*/HAL_StatusTypeDef TPL0401B_Decrement(void);#ifdef __cplusplus}#endif#endif /* __TPL0401B_H */五、驱动文件/*** file tpl0401b.c* brief TPL0401B-10DCKR 数字电位器驱动源文件*/#include tpl0401b.h/*** brief 设置抽头位置* param tap 抽头位置 (0 ~ 127)* retval HAL状态* note tap值超过127时自动钳位*/HAL_StatusTypeDef TPL0401B_SetWiper(uint8_t tap){uint8_t wiperValue;/* 参数检查与钳位 */if (tap TPL0401B_TAP_MAX) {wiperValue TPL0401B_TAP_MAX;} else {wiperValue tap;}/* I2C写入一个字节数据 抽头位置 */return HAL_I2C_Master_Transmit(TPL0401B_I2C_HANDLE,TPL0401B_I2C_ADDR,wiperValue,1,HAL_MAX_DELAY);}/*** brief 读取当前抽头位置* param pTap 存储读取值的指针* retval HAL状态* note 本器件不支持读操作此函数通过软件虚拟实现* 如需真实读取需在每次写入时保存副本*/HAL_StatusTypeDef TPL0401B_GetWiper(uint8_t *pTap){/** 注意: TPL0401B硬件不支持读回抽头位置* 此函数需配合软件缓存使用或直接返回上次写入的值。* 下方示例仅为框架实际需维护一个静态变量。*/static uint8_t lastWiper TPL0401B_TAP_MID;if (pTap NULL) {return HAL_ERROR;}*pTap lastWiper;return HAL_OK;}/*** brief 抽头位置增加1* retval HAL状态*/HAL_StatusTypeDef TPL0401B_Increment(void){static uint8_t currentWiper TPL0401B_TAP_MID;if (currentWiper TPL0401B_TAP_MAX) {currentWiper;return TPL0401B_SetWiper(currentWiper);}return HAL_OK; /* 已达最大值 */}/*** brief 抽头位置减少1* retval HAL状态*/HAL_StatusTypeDef TPL0401B_Decrement(void){static uint8_t currentWiper TPL0401B_TAP_MID;if (currentWiper TPL0401B_TAP_MIN) {currentWiper--;return TPL0401B_SetWiper(currentWiper);}return HAL_OK; /* 已达最小值 */}六、应用示例/*** brief 主函数 - TPL0401B应用示例*/#include main.h#include tpl0401b.h/* 全局变量 */extern I2C_HandleTypeDef hi2c1; /* STM32CubeMX生成的I2C句柄 */int main(void){HAL_Init();SystemClock_Config(); /* 系统时钟配置 */MX_GPIO_Init();MX_I2C1_Init(); /* I2C外设初始化 *//* 应用示例1: 基本设置 *//* 设置抽头位置为中间值 (默认复位值) */TPL0401B_SetWiper(TPL0401B_TAP_MID);HAL_Delay(100);/* 设置抽头位置为最大值 (10kΩ) */TPL0401B_SetWiper(TPL0401B_TAP_MAX);HAL_Delay(100);/* 设置抽头位置为最小值 (0Ω) */TPL0401B_SetWiper(TPL0401B_TAP_MIN);HAL_Delay(100);/* 应用示例2: 步进扫描 *//* 从最小值逐渐增加到最大值 */for (uint8_t i TPL0401B_TAP_MIN; i TPL0401B_TAP_MAX; i) {TPL0401B_SetWiper(i);HAL_Delay(10); /* 等待输出稳定 */}/* 应用示例3: 使用增减函数 *//* 复位到最小值后逐次增加 */TPL0401B_SetWiper(TPL0401B_TAP_MIN);for (uint8_t i 0; i TPL0401B_TAP_MAX; i) {TPL0401B_Increment();HAL_Delay(5);}/* 主循环: 周期性渐变输出 */uint8_t direction 1; /* 1:增加, 0:减少 */uint8_t position TPL0401B_TAP_MID;while (1){/* 三角波扫描 */if (direction) {if (position TPL0401B_TAP_MAX) {position;} else {direction 0;}} else {if (position TPL0401B_TAP_MIN) {position--;} else {direction 1;}}TPL0401B_SetWiper(position);HAL_Delay(20); /* 扫描间隔20ms */}}

更多文章