STM32 驅動 MCP4017T 數(shù)字電位器芯片

一、MCP4017T 簡介

MCP4017T 是一款數(shù)字電位器(Digital Potentiometer),具有 7 位分辨率(即 128 個電阻步進),通過 I2C 接口控制。它采用非易失性存儲器,可在掉電后保留設定值,廣泛應用于音量控制、電壓調整、偏置電平調節(jié)等模擬電路中。

二、引腳功能

VDD 電源正
VSS GND
B 電位器端子 B
W 電位器滑動端(Wiper)
SDA IIC數(shù)據(jù)線
SCL IIC時鐘線

三、電阻網(wǎng)絡結構和滑動端(Wiper)控制原理

  1. 由 127 個相同阻值的電阻(RS)串聯(lián)組成,構成從 Terminal A 到 Terminal B 的一串“電阻階梯”(Resistor Ladder)。
  2. 每個電阻之間的連接點稱為“tap”(抽頭),滑動端(Wiper,W 端)可以連接到任意一個 tap。
  3. 由于電阻(RS)有 127 個,加上端點 A 和 B,共有 128 個 wiper 位置,對應 7 位分辨率(2? = 128)。
  4. 端點 A 和 B 接在串聯(lián)電阻的兩端,W 則是可調的輸出點。
  5. 00h(即十進制 0)表示 Wiper 連到 Terminal B,即 最小輸出(Zero Scale)。
  6. 3Fh(即十進制 63)是 中間位置(Mid Scale)。
  7. 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 -- 發(fā)送數(shù)據(jù) -- ACK -- 停止信號

2.讀時序

讀流程:起始信號 -- IIC地址讀 -- ACK -- 接收數(shù)據(jù) -- 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);             //發(fā)送從機地址,讀寫位為0,表示即將寫入
    MyI2C_ReceiveAck();                     //接收應答
    MyI2C_SendByte(Data);                   //發(fā)送數(shù)據(jù)
    MyI2C_ReceiveAck();                     //接收應答
    MyI2C_Stop();                           //I2C終止
}
uint8_t MCP4017T_ReadReg(void)
{
    uint8_t Data=0;
    MyI2C_Start();                          //I2C起始
    MyI2C_SendByte(MCP4017T_R);             //發(fā)送從機地址
    MyI2C_ReceiveAck();                     //接收應答
    Data = MyI2C_ReceiveByte();             //接收數(shù)據(jù)
    MyI2C_SendAck(1);                       //發(fā)送非應答
    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)//中斷服務函數(shù)  0.5S 觸發(fā)一次
{
    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,返回數(shù)據(jù)無處理
}
int main(void)
{
    MyI2C_Init();
    Timer_Init();
    LED_Init();
    //MCP4017T_WriteReg(0x3f);//設置 滑動端(Wiper,W 端) 位置
    while(1)
    {
    }
}

六、實驗現(xiàn)象

程序現(xiàn)象:B-W 端電阻由 0-10K 間循環(huán)變化,0 增大到 10K ,再 10K 減小到 0 循環(huán)
(萬用表測試及芯片誤差,實際電阻變化范圍為 150 -- 9.7K 左右)

注意該芯片斷電模式下 B-W 端電阻所測不準偏大,需上電再測,上電默認為之前設定的電阻值

以上內容個人理解,如有不正歡迎指正,需要資料及工程可留言郵箱

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容