STM32 驱动 MCP4017T 数字电位器芯片

电子说

1.4w人已加入

描述

一、MCP4017T 简介

MCP4017T 是一款数字电位器(Digital Potentiometer),具有 7 位分辨率(即 128 个电阻步进),通过 I²C 接口控制。它采用非易失性存储器,可在掉电后保留设定值,广泛应用于音量控制、电压调整、偏置电平调节等模拟电路中。

二、引脚功能

VDD电源正
VSSGND
B电位器端子 B
W电位器滑动端(Wiper)
SDAIIC数据线
SCLIIC时钟线

三、电阻网络结构和滑动端(Wiper)控制原理

STM32单片机

  1. 由 127 个相同阻值的电阻(RS)串联组成,构成从 Terminal A 到 Terminal B 的一串“电阻阶梯”(Resistor Ladder)。
  2. 每个电阻之间的连接点称为“tap”(抽头),滑动端(Wiper,W 端)可以连接到任意一个 tap。
  3. 由于电阻(RS)有 127 个,加上端点 A 和 B,共有 128 个 wiper 位置,对应 7 位分辨率(2⁷ = 128)。
  4. 端点 A 和 B 接在串联电阻的两端,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.写时序

STM32单片机
写流程:起始信号 -- IIC地址写 -- ACK -- 发送数据 -- ACK -- 停止信号

2.读时序

STM32单片机
读流程:起始信号 -- 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 左右)
STM32单片机

注意该芯片断电模式下 B-W 端电阻所测不准偏大,需上电再测,上电默认为之前设定的电阻值

以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分