接着前两篇博客文章对IIC通信协议进行了由浅入深的讲解,本篇博客文章将以IIC为基础,对可编程电阻进行驱动。如对IIC有疑问,可参考前两篇博客的内容,本文重点为MCP4017讲解。

        IIC通信驱动硬件编程 (1)-CSDN博客

        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通信驱动硬件编程 (1)-CSDN博客

        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Ω

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐