IIC通信驱动MCP4017可编程电阻编程(3)
可编程电阻,也被称为数字电位器或电子电位器,是一种可以通过数字信号控制其电阻值的电子设备。这些设备通常包含一个电阻阵列和一个电子开关网络,使得电阻值可以通过编程方式在多个预设值之间进行切换。本文将由浅入深的讲解MCP4017可编程电阻的使用驱动
接着前两篇博客文章对IIC通信协议进行了由浅入深的讲解,本篇博客文章将以IIC为基础,对可编程电阻进行驱动。如对IIC有疑问,可参考前两篇博客的内容,本文重点为MCP4017讲解。
IIC通信驱动EEPROM,AT24C02硬件存储器编程(2)-CSDN博客
1、什么是可编程电阻
可编程电阻,也被称为数字电位器或电子电位器,是一种可以通过数字信号控制其电阻值的电子设备。这些设备通常包含一个电阻阵列和一个电子开关网络,使得电阻值可以通过编程方式在多个预设值之间进行切换。
可编程电阻在许多应用中都有用,以下是一些主要的应用领域:
①、音频控制:可编程电阻可以用于音量控制,平衡器,均衡器和其他音频处理设备中。通过改变电阻值,可以控制音频信号的增益,从而实现音量的调整或音频特性的改变。
②、电源管理:在电源管理系统中,可编程电阻可用于动态调整电源分配,以满足系统的实时需求。例如,在电池供电的设备中,通过调整电阻值,可以优化电池的使用寿命。
③、传感器校准:某些传感器可能需要通过调整电阻值来进行校准。使用可编程电阻,可以方便地调整传感器的输出,以使其更准确地反映实际情况。
④、电机控制:在电机控制系统中,可编程电阻可以用于调整电机的运行速度或调整电机的电流。这对于需要精确控制电机运行的应用来说非常有用。
⑤、测试与测量:在电子测试设备中,可编程电阻可以作为模拟负载,用于测试电源,放大器和其他电子设备的性能。
⑥、自动控制系统:在自动控制系统中,可编程电阻可以用于调整系统的反馈回路,以优化系统的性能。
2、MCP4017官方手册阅读
由手册可知,MCP4017是一款可编程的电阻,其内置了7位寄存器,共计127个档位的分辨率。
MCP4017可编程电阻的数据存储类型为RAM,即电阻值数据掉电丢失,其工作电压为1.8V~5.5v。且MCP4017系列提供了5kΩ,10kΩ、50kΩ、100kΩ这4种产品型号供用户选择。
本文案例中使用了MCP4017-104E,它的阻值最大是100kΩ。
MCP4017引脚功能描述说明图
MCP4017芯片内部结构的抽象框图
简单来说就是,通过IIC总线传输了对应的阻值模式命令后,电阻滑子W内部将会向上或向下变动,此时实际输出的电阻值为RAW或RBW。
编程改变的是电阻滑子W在A、B端子间的位置,以此达到可编程电阻的目的。
可编程电阻的电阻内部原理示意图
由开发板的原理图可知,使用的MCP4017,引脚B已经进行了接地操作,而引脚A在芯片内部上拉并且未引出,因此可编程电阻的阻值为BW间的阻值即RBW。
又因W引脚上接了一个10k的恒定电阻R17,如果PB17引脚配置为ADC读取电压值的话,那么PB14引脚可读到的电压值为 V0 = Rbw / (R17+Rbw) * VCC
MCP4017的IIC通信从机设备地址为 010 1111 ---> 0x2F
根据IIC通信协议标准可知:
MCP4017的写数据设备地址为:0101 1110 ---> 5E
MCP4017的读数据设备地址为:0101 1111 ---> 5F
MCP4017内部有127个档位,当写入某个电阻值时,其对应的开关便会接通,其它的开关保持断开状态,因此,写入的值越大,MCP4017的电阻值也越大。
可编程电阻的参数设置值范围为:0x00 ~ 0x7F也就是 0 ~ 127
MCP4017-104E的最大阻值为100kΩ。
3、MCP4017编程思路
由手册可知,除了设备的地址数据外,MCP4017的数据位最多只有7位,最高位无论发送什么,都会被舍弃掉。
因官方参考手册是MCP4017/18/19三种型号产品写在一起的,所以本文的MCP4017编程思路同样适用于MCP4018、MCP4019等可编程电阻。
①、MCP4017写电阻数据编程思路
①、发送IIC启动信号
②、发送写MCP4017的地址
③、接收MCP4017的有效应答信号(0)
④、发送写入的1个字节数据(0~127)
⑤、接收MCP4017的有效应答信号(0)
⑥、发送IIC停止信号
②、MCP4017读电阻数据编程思路
①、发送IIC启动信号
②、发送读MCP4017的地址
③、接收MCP4017的有效应答信号(0)
④、接收MCP4017的阻值数据
⑤、发送无效应答信号(1)
⑥、发送IIC停止信号
4、MCP4017驱动编程源码
因官方参考手册是MCP4017/18/19三种型号产品写在一起的,所以本文的MCP4017驱动编程源码同样适用于MCP4018、MCP4019等可编程电阻驱动。
IIC驱动程序的编写有疑问的话,可参考前几天写的这两篇博客文章:
IIC通信驱动EEPROM,AT24C02硬件存储器编程(2)-CSDN博客
①、MCP4017.h
#ifndef __MCP4017_H
#define __MCP4017_H
#define MCP4017_READ_ADDR 0x
#define MCP4017_WRITE_ADDR 0x
void MCP4017_Init(void);
int MCP4017_Read_Res_Val(unsigned char *val);
int MCP4017_Write_Res_Val(unsigned char val);
#endif
②、MCP4017.c
#include "MCP4017.h"
/**
* @brief MCP4017初始化
* @param None
* @retval None
*/
void MCP4017_Init(void)
{
IIC_Init();
}
/**
* @brief MCP4017读取电阻阻值
* @param val:读取到的阻值数据
* @retval 成功返回0,失败返回-1
*/
int MCP4017_Read_Res_Val(unsigned char *val)
{
int ret = 0;
IIC_Start();
IIC_Write_Byte(MCP4017_READ_ADDR);
ret = IIC_Wait_Ack();
if(ret != 0)
{
IIC_Stop();
return -1;
}
*val = IIC_Read_Byte();
IIC_Write_Ack(1);
IIC_Stop();
return 0;
}
/**
* @brief MCP4017写电阻阻值
* @param val:设定的电阻值
* @retval 成功返回0,失败返回-1
*/
int MCP4017_Write_Res_Val(unsigned char val)
{
int ret = 0;
IIC_Start();
IIC_Write_Byte(MCP4017_WRITE_ADDR);
ret = IIC_Wait_Ack();
if(ret != 0)
{
IIC_Stop();
return -1;
}
IIC_Write_Byte(val);
ret = IIC_Wait_Ack();
if(ret != 0)
{
IIC_Stop();
return -1;
}
IIC_Stop();
return 0;
}
③、MCP4017实际驱动效果图
通过上电运行程序发现,MCP4017可编程电阻的阻值默认为50kΩ。如果只是重新下载程序,那么读出来的数据还会是上一次写入的程序,只有彻底断电后,才会读出初始默认的阻值。
④、电阻值数据转换
实际阻值 = 读出的数据 / 127 * 100kΩ
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)