一、简介AD5160BRJZ10-RL7 是 Analog Devices 公司生产的一款 256 位 SPI 兼容数字电位器 。二、主要技术特性参数值端到端电阻10 kΩ抽头位置256 (8位分辨率)接口类型SPI兼容 (3线串行)电源电压2.7V ~ 5.5V静态电流3 μA (典型值)温度系数45 ppm/°C带宽600 kHz封装SOT-23-8工作温度-40°C ~ 125°C存储类型Volatile (易失性上电预设中间电平)三、内部功能框图四、头文件/*** file ad5160.h* brief AD5160 Digital Potentiometer Driver Header File* version V1.0* date 2026-04-03* note Platform: STM32Lxxx, HAL Library*/#ifndef __AD5160_H#define __AD5160_H#ifdef __cplusplusextern C {#endif/* Includes ------------------------------------------------------------------*/#include stm32l4xx_hal.h#include stdint.h#include stdbool.h/* Definitions ---------------------------------------------------------------*/#define AD5160_TAPS 256U /* 抽头数量 */#define AD5160_MAX_VALUE 255U /* 最大值 (0xFF) */#define AD5160_RESISTANCE 10000U /* 总电阻 10kΩ (单位: 欧姆) *//* 默认配置使用 SPI1可根据需要修改 */#define AD5160_SPI hspi1#define AD5160_CS_PORT GPIOA#define AD5160_CS_PIN GPIO_PIN_4/* 宏定义方便操作片选 */#define AD5160_CS_LOW() HAL_GPIO_WritePin(AD5160_CS_PORT, AD5160_CS_PIN, GPIO_PIN_RESET)#define AD5160_CS_HIGH() HAL_GPIO_WritePin(AD5160_CS_PORT, AD5160_CS_PIN, GPIO_PIN_SET)/* 宏定义将抽头值转换为电阻值 */#define AD5160_TAP_TO_RES(tap) ((uint32_t)(tap) * AD5160_RESISTANCE / AD5160_MAX_VALUE)/* 宏定义将电阻值转换为抽头值 */#define AD5160_RES_TO_TAP(res) ((uint8_t)((res) * AD5160_MAX_VALUE / AD5160_RESISTANCE))/* 宏定义将抽头值转换为电压 (假设VDD3.3V) */#define AD5160_TAP_TO_VOLT(tap) ((float)(tap) * 3.3f / AD5160_MAX_VALUE)/* 枚举类型 ---------------------------------------------------------------*//*** brief AD5160 工作模式*/typedef enum {AD5160_MODE_VARIABLE_RESISTOR 0, /* 变阻器模式 */AD5160_MODE_POTENTIOMETER 1 /* 电位器分压模式 */} AD5160_Mode_t;/*** brief AD5160 初始化参数结构体*/typedef struct {SPI_HandleTypeDef *hspi; /* SPI 句柄 */GPIO_TypeDef *cs_port; /* CS 端口 */uint16_t cs_pin; /* CS 引脚 */uint8_t default_tap; /* 默认抽头值 (0-255) */} AD5160_Init_t;/*** brief AD5160 句柄结构体*/typedef struct {SPI_HandleTypeDef *hspi; /* SPI 句柄 */GPIO_TypeDef *cs_port; /* CS 端口 */uint16_t cs_pin; /* CS 引脚 */uint8_t current_tap; /* 当前抽头值 */AD5160_Mode_t mode; /* 工作模式 */} AD5160_Handle_t;/* 函数声明 ---------------------------------------------------------------*//* 初始化和配置 */HAL_StatusTypeDef AD5160_Init(AD5160_Handle_t *hdev, AD5160_Init_t *init);void AD5160_SetDefaultTap(AD5160_Handle_t *hdev, uint8_t tap);/* 核心操作 */HAL_StatusTypeDef AD5160_SetTap(AD5160_Handle_t *hdev, uint8_t tap);HAL_StatusTypeDef AD5160_SetResistance(AD5160_Handle_t *hdev, uint32_t resistance_ohm);uint8_t AD5160_GetCurrentTap(AD5160_Handle_t *hdev);uint32_t AD5160_GetCurrentResistance(AD5160_Handle_t *hdev);/* 便捷操作 */HAL_StatusTypeDef AD5160_Increment(AD5160_Handle_t *hdev);HAL_StatusTypeDef AD5160_Decrement(AD5160_Handle_t *hdev);HAL_StatusTypeDef AD5160_SetMiddle(AD5160_Handle_t *hdev);HAL_StatusTypeDef AD5160_SetMin(AD5160_Handle_t *hdev);HAL_StatusTypeDef AD5160_SetMax(AD5160_Handle_t *hdev);/* 辅助函数 */void AD5160_SetMode(AD5160_Handle_t *hdev, AD5160_Mode_t mode);#ifdef __cplusplus}#endif#endif /* __AD5160_H */五、驱动文件/*** file ad5160.c* brief AD5160 Digital Potentiometer Driver Source File* version V1.0* date 2026-04-03* note Platform: STM32Lxxx, HAL Library*/#include ad5160.h#include math.h/* 私有宏定义 -------------------------------------------------------------*/#define AD5160_SPI_TIMEOUT 100U /* SPI 超时时间 (ms) *//* 私有函数声明 -----------------------------------------------------------*/static HAL_StatusTypeDef AD5160_SPI_Write(AD5160_Handle_t *hdev, uint8_t data);/*** brief 初始化 AD5160 设备* param hdev: AD5160 句柄指针* param init: 初始化参数指针* retval HAL 状态*/HAL_StatusTypeDef AD5160_Init(AD5160_Handle_t *hdev, AD5160_Init_t *init){if (hdev NULL || init NULL){return HAL_ERROR;}/* 保存配置参数 */hdev-hspi init-hspi;hdev-cs_port init-cs_port;hdev-cs_pin init-cs_pin;hdev-current_tap 0;hdev-mode AD5160_MODE_POTENTIOMETER;/* 初始化 CS 引脚为输出初始为高电平 */GPIO_InitTypeDef gpio_init {0};gpio_init.Pin hdev-cs_pin;gpio_init.Mode GPIO_MODE_OUTPUT_PP;gpio_init.Pull GPIO_PULLUP;gpio_init.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(hdev-cs_port, gpio_init);AD5160_CS_HIGH();/* 设置默认抽头值 */AD5160_SetDefaultTap(hdev, init-default_tap);return HAL_OK;}/*** brief 设置默认抽头值 (上电后设置)* param hdev: AD5160 句柄指针* param tap: 抽头值 (0-255)* retval 无*/void AD5160_SetDefaultTap(AD5160_Handle_t *hdev, uint8_t tap){if (hdev ! NULL){AD5160_SetTap(hdev, tap);}}/*** brief SPI 写入单字节数据* param hdev: AD5160 句柄指针* param data: 要写入的数据 (8位)* retval HAL 状态*/static HAL_StatusTypeDef AD5160_SPI_Write(AD5160_Handle_t *hdev, uint8_t data){HAL_StatusTypeDef status;/* 片选有效 */AD5160_CS_LOW();/* SPI 发送数据 */status HAL_SPI_Transmit(hdev-hspi, data, 1, AD5160_SPI_TIMEOUT);/* 片选无效 */AD5160_CS_HIGH();return status;}/*** brief 设置抽头位置 (核心函数)* param hdev: AD5160 句柄指针* param tap: 抽头值 (0-255)* retval HAL 状态*/HAL_StatusTypeDef AD5160_SetTap(AD5160_Handle_t *hdev, uint8_t tap){HAL_StatusTypeDef status;if (hdev NULL){return HAL_ERROR;}/* 参数校验tap 值范围 0-255 自动满足 */status AD5160_SPI_Write(hdev, tap);if (status HAL_OK){hdev-current_tap tap;}return status;}/*** brief 设置电阻值* param hdev: AD5160 句柄指针* param resistance_ohm: 期望电阻值 (单位: 欧姆)* retval HAL 状态*/HAL_StatusTypeDef AD5160_SetResistance(AD5160_Handle_t *hdev, uint32_t resistance_ohm){uint8_t tap;uint32_t max_res AD5160_RESISTANCE;if (hdev NULL){return HAL_ERROR;}/* 电阻值限制 */if (resistance_ohm max_res){tap AD5160_MAX_VALUE;}else{/* 计算对应的抽头值 */tap (uint8_t)((resistance_ohm * AD5160_MAX_VALUE) / max_res);}return AD5160_SetTap(hdev, tap);}/*** brief 获取当前抽头值* param hdev: AD5160 句柄指针* retval 当前抽头值 (0-255)*/uint8_t AD5160_GetCurrentTap(AD5160_Handle_t *hdev){if (hdev NULL){return 0;}return hdev-current_tap;}/*** brief 获取当前电阻值* param hdev: AD5160 句柄指针* retval 当前电阻值 (单位: 欧姆)*/uint32_t AD5160_GetCurrentResistance(AD5160_Handle_t *hdev){if (hdev NULL){return 0;}return AD5160_TAP_TO_RES(hdev-current_tap);}/*** brief 抽头值递增 (增加一个步进)* param hdev: AD5160 句柄指针* retval HAL 状态*/HAL_StatusTypeDef AD5160_Increment(AD5160_Handle_t *hdev){uint8_t new_tap;if (hdev NULL){return HAL_ERROR;}new_tap (hdev-current_tap AD5160_MAX_VALUE) ? (hdev-current_tap 1) : AD5160_MAX_VALUE;return AD5160_SetTap(hdev, new_tap);}/*** brief 抽头值递减 (减少一个步进)* param hdev: AD5160 句柄指针* retval HAL 状态*/HAL_StatusTypeDef AD5160_Decrement(AD5160_Handle_t *hdev){uint8_t new_tap;if (hdev NULL){return HAL_ERROR;}new_tap (hdev-current_tap 0) ? (hdev-current_tap - 1) : 0;return AD5160_SetTap(hdev, new_tap);}/*** brief 设置抽头到中间位置 (0x80 128)* param hdev: AD5160 句柄指针* retval HAL 状态*/HAL_StatusTypeDef AD5160_SetMiddle(AD5160_Handle_t *hdev){if (hdev NULL){return HAL_ERROR;}return AD5160_SetTap(hdev, 0x80);}/*** brief 设置抽头到最小值 (0)* param hdev: AD5160 句柄指针* retval HAL 状态*/HAL_StatusTypeDef AD5160_SetMin(AD5160_Handle_t *hdev){if (hdev NULL){return HAL_ERROR;}return AD5160_SetTap(hdev, 0);}/*** brief 设置抽头到最大值 (255)* param hdev: AD5160 句柄指针* retval HAL 状态*/HAL_StatusTypeDef AD5160_SetMax(AD5160_Handle_t *hdev){if (hdev NULL){return HAL_ERROR;}return AD5160_SetTap(hdev, AD5160_MAX_VALUE);}/*** brief 设置工作模式 (仅用于记录不影响硬件操作)* param hdev: AD5160 句柄指针* param mode: 工作模式* retval 无*/void AD5160_SetMode(AD5160_Handle_t *hdev, AD5160_Mode_t mode){if (hdev ! NULL){hdev-mode mode;}}六、应用示例/*** file main.c* brief AD5160 应用示例 - 实现三角波输出* note Platform: STM32Lxxx, HAL Library*/#include main.h#include ad5160.h/* 全局变量 ---------------------------------------------------------------*/AD5160_Handle_t g_ad5160;/* SPI 句柄外部声明 (由 CubeMX 生成) */extern SPI_HandleTypeDef hspi1;/*** brief 系统初始化 (由 CubeMX 生成)*/void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_SPI1_Init(void);/*** brief 主函数*/int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI1_Init();/* AD5160 初始化配置 */AD5160_Init_t ad5160_init {.hspi hspi1,.cs_port AD5160_CS_PORT,.cs_pin AD5160_CS_PIN,.default_tap 0x80 /* 上电预设中间值 128 */};/* 初始化 AD5160 */if (AD5160_Init(g_ad5160, ad5160_init) ! HAL_OK){Error_Handler();}/* 设置工作模式为电位器模式 */AD5160_SetMode(g_ad5160, AD5160_MODE_POTENTIOMETER);/* 示例1: 基础设置 */AD5160_SetTap(g_ad5160, 64); /* 设置抽头为 64 (约 1/4 量程) */HAL_Delay(100);AD5160_SetResistance(g_ad5160, 5000); /* 设置电阻为 5kΩ */HAL_Delay(100);/* 示例2: 递增/递减操作 */for (uint8_t i 0; i 50; i){AD5160_Increment(g_ad5160);HAL_Delay(10);}for (uint8_t i 0; i 50; i){AD5160_Decrement(g_ad5160);HAL_Delay(10);}/* 示例3: 三角波输出 - 从 0 增加到 255再减少到 0 */while (1){/* 上升沿: 0 - 255 */for (uint8_t tap 0; tap 255; tap){AD5160_SetTap(g_ad5160, tap);HAL_Delay(5); /* 控制变化速率 */}/* 下降沿: 255 - 0 */for (uint8_t tap 255; tap 0; tap--){AD5160_SetTap(g_ad5160, tap);HAL_Delay(5);}}}/*** brief SPI1 初始化 (CubeMX 生成)*/static void MX_SPI1_Init(void){hspi1.Instance SPI1;hspi1.Init.Mode SPI_MODE_MASTER;hspi1.Init.Direction SPI_DIRECTION_2LINES_TXONLY; /* 仅发送模式 */hspi1.Init.DataSize SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity SPI_POLARITY_LOW; /* CPOL 0 */hspi1.Init.CLKPhase SPI_PHASE_1EDGE; /* CPHA 0 */hspi1.Init.NSS SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_16;hspi1.Init.FirstBit SPI_FIRSTBIT_MSB;hspi1.Init.TIMode SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial 7;HAL_SPI_Init(hspi1);}