一、了解MCP4017数字电位器原理图
MCP4017是一款可编程的电阻,其内置了7位寄存器,共计127个档位的分辨率。本质是一个IC器件,在蓝桥杯嵌入式比赛中通过IIC总线使用STMG4向MCP4017发送数据。
在CT117E_M4开发板上,MCP4017还连接了PB14引脚,旨在让选手使用其上的ADC通道来检测MCP4017分得的电压,从而判读其阻值。
其中3、4引脚分别为时钟线与数据线,1、2分别为电源与地。
而5、6端从图中可以看到,5是内置可变电阻的一端,而6端则是滑片W。
从两个原理图中可以得到,6的另一端连接了10k的电阻与VDD相连,而内置可变电阻的A端则是悬空,5的另一端则接地。于此得出。
当滑片连接A端,电阻R(WB) = R(AB) 。
当滑片连接B端,电阻R(WB) = 0。
于此可以得出
V
=
R
W
B
R
W
B
+
R
17
∗
3.3
V
V = {R_{WB} \above{2pt} R_{WB}+R_{17}} * 3.3 V
V=RWB+R17RWB∗3.3V
记住这里之后可以用ADC来检测。并且由文档了解最大可达100kΩ。
相关内容上一篇已经讲过,有不懂的可以前往观看EEPROM(AT24C02)以及IIC协议。
二、MCP4017代码编写
1、数据地址
地址码为0101111以及读写位,即有0101 1110(0x5e)为写地址,0101 1111(0x5f)为读地址。
2、数据写入
相信对于学过上一篇的大家,已经很熟悉写的流程了。
void MCP4017_Write(u8 val)
{
I2CStart();
I2CSendByte(0x5e);
I2CWaitAck();
I2CSendByte(val);
I2CWaitAck();
I2CStop();
}
3、数据读取
u8 MCP4017_Read(void)
{
u8 val;
I2CStart();
I2CSendByte(0x5F);
I2CWaitAck();
val = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return val;
}
这里与上节不同点在于读取的时候不需要进行第二次启动I2C,注意区分。
三、利用ADC读取电压
在上面我们说到6端口连接着PB14引脚。这里我们在STM32cubemx中设置ADC1的5通道。
按照顺序依次进行,这里将ADC1的通道数改为2,然后在下方Rank设置两个通道的优先级和扫描周期,这里将对MCP4017电压读取的扫描周期设置为640.5个时钟周期,设置到最慢。当然你可以根据就需求进行设置,这里只演示这种。
MCP4017_Write (0x7f) ;
MCP_Val = MCP4017_Read();
这里我们设置MCP4017为最大电阻100kΩ。
HAL_ADC_Start(&hadc1) ;
MCP_Volt = HAL_ADC_GetValue(&hadc1) /4096.0f *3.3f ;
HAL_ADC_Start(&hadc1) ;
r38 = HAL_ADC_GetValue(&hadc1) /4096.0f *3.3f ;
HAL_ADC_Start(&hadc2) ;
r37 = HAL_ADC_GetValue(&hadc2) /4096.0f *3.3f ;
文中所用的工程我会贴在下面,如有需要可自行下载,如果有疑问或者有什么错误之处还望留言指正。
链接:https://pan.baidu.com/s/1l_ZYS3oETi3X1bdTDi062g?pwd=1111
提取码:1111