一、MCP4017T 簡介
MCP4017T 是一款數字電位器(Digital Potentiometer),具有 7 位分辨率(即 128 個電阻步進),通過 I2C 接口控制。它采用非易失性存儲器,可在掉電后保留設定值,廣泛應用于音量控制、電壓調整、偏置電平調節等模擬電路中。
二、引腳功能
| 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瀏覽量
84892 -
STM32
+關注
關注
2309文章
11161瀏覽量
373395 -
STM32單片機
+關注
關注
59文章
553瀏覽量
60601
發布評論請先 登錄
怎么使用MCP4012T數字電位器
MCP4131數字電位器的使用
怎樣使用IAP15單片機的SPI控制數字電位器MCP41XXX
常用數字電位器芯片有哪些
優化數字電位器電路設計方案
優化數字電位器電路,減少絕對和溫度差異
使用IAP15 SPI寫數字電位器MCP41XXX
STM32 驅動 MCP4017T 數字電位器芯片
評論