一、MCP4017T 简介
MCP4017T 是一款数字电位器(Digital Potentiometer),具有 7 位分辨率(即 128 个电阻步进),通过 I²C 接口控制。它采用非易失性存储器,可在掉电后保留设定值,广泛应用于音量控制、电压调整、偏置电平调节等模拟电路中。
二、引脚功能
| VDD | 电源正 |
|---|---|
| VSS | GND |
| B | 电位器端子 B |
| W | 电位器滑动端(Wiper) |
| SDA | IIC数据线 |
| SCL | IIC时钟线 |
三、电阻网络结构和滑动端(Wiper)控制原理

- 由 127 个相同阻值的电阻(RS)串联组成,构成从 Terminal A 到 Terminal B 的一串“电阻阶梯”(Resistor Ladder)。
- 每个电阻之间的连接点称为“tap”(抽头),滑动端(Wiper,W 端)可以连接到任意一个 tap。
- 由于电阻(RS)有 127 个,加上端点 A 和 B,共有 128 个 wiper 位置,对应 7 位分辨率(2⁷ = 128)。
- 端点 A 和 B 接在串联电阻的两端,W 则是可调的输出点。
- 00h(即十进制 0)表示 Wiper 连到 Terminal B,即 最小输出(Zero Scale)。
- 3Fh(即十进制 63)是 中间位置(Mid Scale)。
- 7Fh(即十进制 127)表示 Wiper 连到 Terminal A,即 最大输出(Full Scale)
简单说该芯片可以看作一个 128 段的有级可调电位器,每级间的阻值 RS = RAB/2⁷-1 ,例如本次测试的芯片为 MCP4017T-103ELT,RAB = 10K,RS = 10K/127 = 78.74 欧,故每移动一级开关(滑动端W),B-W 端电阻变化 78.74 欧,该开关(滑动端W)位置可通过IIC接口通讯设定。
四、IIC时序
1.写时序

写流程:起始信号 -- IIC地址写 -- ACK -- 发送数据 -- ACK -- 停止信号
2.读时序

读流程:起始信号 -- IIC地址读 -- ACK -- 接收数据 -- NACK -- 停止信号
五、程序
MCP4017T.c
#include "stm32f10x.h" // Device header
#include "MyI2C.h"
/*IIC 地址-------------------------------------------------------------------------------------------*/
#define MCP4017T_W 0x5E
#define MCP4017T_R 0x5F
void MCP4017T_WriteReg(uint8_t Data)
{
MyI2C_Start(); //I2C起始
MyI2C_SendByte(MCP4017T_W); //发送从机地址,读写位为0,表示即将写入
MyI2C_ReceiveAck(); //接收应答
MyI2C_SendByte(Data); //发送数据
MyI2C_ReceiveAck(); //接收应答
MyI2C_Stop(); //I2C终止
}
uint8_t MCP4017T_ReadReg(void)
{
uint8_t Data=0;
MyI2C_Start(); //I2C起始
MyI2C_SendByte(MCP4017T_R); //发送从机地址
MyI2C_ReceiveAck(); //接收应答
Data = MyI2C_ReceiveByte(); //接收数据
MyI2C_SendAck(1); //发送非应答
MyI2C_Stop(); //I2C终止
return Data;
}
main.c
#include "stm32f10x.h"
//#include "Delay.h"
//#include "OLED.h"
#include "MCP4017T.h"
#include "LED.h"
#include "Timer.h"
#include "MyI2C.h"
int8_t direction = 1,Series = 0;//Series:滑动端(Wiper,W 端)位置,范围 0-127 0-7F ; drection 变化方向:1 递增 / -1 递减
void TIM2_IRQHandler(void)//中断服务函数 0.5S 触发一次
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//获取TIM2更新中断(TIM_IT_Update)标志位
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除更新中断标志位
}
if(direction == 1)
{
Series++;
MCP4017T_WriteReg(Series);//设置 滑动端(Wiper,W 端) 位置
if(Series >= 127)
{
direction = -1;//变化方向,设置为递减
}
}else
{
Series--;
MCP4017T_WriteReg(Series);//设置 滑动端(Wiper,W 端) 位置
if(Series <= 0)
{
direction = 1;//变化方向,设置为递增
}
}
LED_Show();//滑动端(Wiper,W 端)变化指示灯
MCP4017T_ReadReg();//返回滑动端(Wiper,W 端)的位置,范围 0-127 0-7F,返回数据无处理
}
int main(void)
{
MyI2C_Init();
Timer_Init();
LED_Init();
//MCP4017T_WriteReg(0x3f);//设置 滑动端(Wiper,W 端) 位置
while(1)
{
}
}
六、实验现象
程序现象:B-W 端电阻由 0-10K 间循环变化,0 增大到 10K ,再 10K 减小到 0 循环
(万用表测试及芯片误差,实际电阻变化范围为 150 -- 9.7K 左右)
注意该芯片断电模式下 B-W 端电阻所测不准偏大,需上电再测,上电默认为之前设定的电阻值
以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱
-
数字电位器
+关注
关注
4文章
277浏览量
84640 -
STM32
+关注
关注
2305文章
11120浏览量
371044 -
STM32单片机
+关注
关注
59文章
553浏览量
60299
发布评论请先 登录
怎么使用MCP4012T数字电位器
MCP4131数字电位器的使用
怎样使用IAP15单片机的SPI控制数字电位器MCP41XXX
常用数字电位器芯片有哪些
优化数字电位器电路设计方案
优化数字电位器电路,减少绝对和温度差异
使用IAP15 SPI写数字电位器MCP41XXX

STM32 驱动 MCP4017T 数字电位器芯片
评论