四、MCP4017可编程电阻
1.概况
内部结构
由Total(Rab)可知这个可编程电阻总电阻为100k欧(当寄存器为0x7F时达到最大电阻)。
由Step(Rs),可知相当于寄存器每增加一个数,电阻增加787.402欧
电阻的计算
:由下图大图可知,Rs的阻值为 AB之间的总电阻除以127,其中Rw的阻值几乎为零,可以忽略不计。N为我们写入的数据。RAB为常量,可以根据数据手册查找
当我们传入0x7f时,对应的电阻就是100K。这里要注意的一点是,我们写进去的一个数字(0-127),读出来也是一个数字,转化为电阻阻值:R = 787.4 * read_resistor 欧,电压:3.3*(R/(R+10)) (假设外接的电压为3.3)
所以蓝桥杯嵌入式这块板子上,
获取MCP当前电阻的方式:
1、读取寄存器值(R_data),然后利用 公式 电阻(R) = R_data * 787.4
2、读取PB14电压(V_data),然后利用公式 V_data = 3.3*(R/(R+10)) (假设参考电压为3.3v)。然后解方程即可得知
从机器件的地址
地址前面几位都是固定的:0101 111x(R/~W)
得到MCP4017的从机地址,如果是读操作的话就是0x5F,写操作的话就是0X5E。
接下来,我们根据时序图来编写MCP的读写操作。
原理图:
由此利用AD转换读取PB14引脚,得出PB14处的电压值。
然后分压公式计算出可编程电阻当前阻值(精度低)。
2.读\写动作
写一个字节
官方手册内的参考写时序图:
代码如下:
void write_M24C(uint8_t value)
{
MYIIC_Start();
MYIIC_SentByte(0x5E);
MYIIC_WaitAck();
MYIIC_SentByte(value);
MYIIC_WaitAck();
MYIIC_Stop();
}
读一个字节
官方手册内的参考写时序图:
uint8_t read_M24C(void)
{
uint8_t data;
MYIIC_Start();
MYIIC_SentByte(0x5F);
MYIIC_WaitAck();
data = MYIIC_ReceiveByte();
MYIIC_SentAck(0);
MYIIC_Stop();
return value;
}
至此,MCP4017的应用程序逻辑就写好了 。代码中不包含iic的通信驱动,请自行添加。
修改电阻后会对应分压电路中电压的改变,即下图
这部分线路被PB14引脚监测,此时我们就需要打开该引脚的ADC功能。
该引脚涉及ADC1外设的其中一个通道,如果此时已经开启了一个通道,并且需要根据比赛进行对应的通通道调整,你可以参考这篇文章,进行ADC指定通道的读取: