本文代码使用
HAL
库。
文章目录
- 前言
- 一、MCP4017 的重要特性
- 二、MCP4017 计算 RBW 阻值
- 三、MCP4017 地址
- 四、MCP4017 读写函数
- 五、CubeMX 创建工程 (利用 ADC 测量 MCP4017 电压)、
- 对应代码:
- 总结
前言
一、MCP4017 的重要特性
蓝桥杯 板子上的是 MCP4017T-104ELT,如 图1。
- MCP4017 是一个 可编程电阻,通过 写入的数值 可以 改变电阻的大小 。
重点在于 6 引脚(W),5 引脚(B)。VDD 接 一个 R17 的 10 K电阻,经过 PB14 口 接 跳帽 J15,再接到 5 引脚的 跳帽 J16,最后接地 。
将其 6 引脚,5 引脚 的内部电路图 简化为 图2 。相当于一个 滑动变阻器 ,RAB 是一个大电阻,通过滑动划片 W ,可改变 RWB 的阻值
。
当 W 划到最左边 A 处时,RWB = RAB ; 当 W 划到 中间时,RWB = 1/2 RAB ; 当 W 划到 最右边时, RWB 约等于 0( 内部有一些模拟开关,不完全等于 0 )。
- MCP4017 是 7 位 的 电阻器网络分辨率 。
- 有 0 ~ 127 个电阻器 。 (在 RAB 中有128个电阻器)
- 通电默认PB14 口电阻为 中等比例。
- RAB 电阻值为 0 ~ 100 K 欧。
- 带有读取和写命令的简单 I2C 协议。
二、MCP4017 计算 RBW 阻值
RAB 大电阻的 内部结构 如 图 3 。其 内部有 128 (N 范围是 0 ~ 127)个 电阻器 Rs。
RW 相当于模拟开关,阻值接近于 0 。
参考数据手册 可知 RAB 的最大 电阻为 100 K 欧
。则 每个 Rs 的 阻值 为 RAB / 128 = 100K / 128
.
上面讲到 MCP4017 是一个 可编程电阻,类似于一个 滑动变阻器。
当 图 2 中 W 划到最左边 A 处时,相当于 图 3 中 N = 127,则 RWB = RAB 。
当 W 划到 最右边时,相当于 N = 0,则 RWB = 0 。
例如:
当 图 3 中 N = 0 时,可以看到 W 和 B 之间有 0 个 RS 电阻 和 一个RW,则 RWB = RS ·0 + RW 。
当 图 3 中 N = 1 时,可以看到 W 和 B 之间有 1 个 RS 电阻 和 一个RW,则 RWB = RS · 1 + RW 。
上面讲了 RS 的阻值:
则我们需要的 RWB = RW + N · RS = RW + N · RAB / 128 。
三、MCP4017 地址
MCP4017 是 I2C总线上 的一个 从属设备,它支持 7位 从属寻址。从属地址包含7个固定位,一个读写位(0101111 R/W)。如下 图 3 。
前 7 位 都是固定的,最后一位 R/W = 0 代表 写,则 地址为 01011110 , 即 0x5e。
最后一位 R/W = 1 代表 读,则 地址为 01011111 , 即 0x5f。
四、MCP4017 读写函数
比赛会给出我们 iic 的底层驱动代码,我们需要自己写出 MCP4017 读写函数。
这里 写入读取 的数据是 单 字节的,不要超过相应的范围
。
- 写 函数。
void MCP4017_Write(u8 val)
{
I2CStart(); //起始信号
I2CSendByte(0x5e); //控制字,写
I2CWaitAck(); //等待响应
I2CSendByte(val); //发送要写入的数据
I2CWaitAck();
I2CStop(); //停止
}
- 读 函数。
u8 MCP4017_Read(void)
{
u8 val;
I2CStart(); //起始信号
I2CSendByte(0x5f); //控制字,读
I2CWaitAck(); //等待响应
val = I2CReceiveByte(); //接收数据
I2CSendNotAck();
I2CStop(); //停止
return val;
}
举例:
电压显示 大约 3V 。
3.3 · ( 127 / (127 + 10)大约 显示 3 V电压。
MCP4017_Write(0x7f); //0x7f 十进制就是 127
五、CubeMX 创建工程 (利用 ADC 测量 MCP4017 电压)、
(1)设置 RCC。
(2)在 STM32G431 内部集成 两个 最高位 12 位 的 ADC1, ADC2 ;对应的 IO 接口是 PB12 , PB15。我们选用 ADC1,使用 PB12 测量电压。MCP4017 的 io 接口是 PB14。
设置 IO 接口。
(3)由于我们使用的两个都是 ADC1 ,则需要在 ADC1 里设置信息。
- 设置为 两个 通道。
- 设置对应的通道 1,2 ,及其速度。(设置慢一些为 640.5 Cycles)
(4)添加 .c / .h 文件。
(5)创建工程。
对应代码:
floatvolt_mcp; //电压值
I2CInit(); //初始化 i2c
MCP4017_Write(0x3f);
HAL_ADC_Start(&hadc1); //启动 ADC1
volt_mcp = HAL_ADC_GetValue(&hadc1) / 4095.0f * 3.3f; //读出数据
若对 ADC 的代码不了解的 ,可以参考我之前的文章:
蓝桥杯 stm32 实现 ADC 采集数据功能 CubeMX
总结
大家可以自己试试,不理解的可以留言讨论。