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

简单说该芯片可以看作一个 128 段的有级可调电位器,每级间的阻值 RS = RAB/2⁷-1 ,例如本次测试的芯片为 MCP4017T-103ELT,RAB = 10K,RS = 10K/127 = 78.74 欧,故每移动一级开关(滑动端W),B-W 端电阻变化 78.74 欧,该开关(滑动端W)位置可通过IIC接口通讯设定。

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

读流程:起始信号 -- 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 端电阻所测不准偏大,需上电再测,上电默认为之前设定的电阻值
以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱
全部0条评论
快来发表一下你的评论吧 !