项目需要,最近用到了一个IIC接口的数字电位器,型号:MCP4017T-502E。对应阻值5K,使用STM32G030F6的硬件IIC驱动,发现简单的不得了,这里记录一下。
一、芯片特性,
从数据手册截个图,主要特性如下:
捡重要的我说一下:
抽头数:128,就是说5K的电位器,分辨率为5K/128,实际值手册后面有说明。
可以看到,是39.37欧姆。
电刷电阻,最小100欧姆,实际根据供电电压不同,会有一些变化,如图:
5.5V供电时,100欧姆左右;2.7V供电时,155欧姆左右。本人使用时,3.3V供电,推算阻值在181欧姆左右。
上电后阻值固定为中间值,如果是5K的电阻,每次上电为2.5K,如果是10K的电阻,每次上电为5K。即电位器设定的阻值掉电后不保存,有特殊需要的童鞋,这一点要注意。
二、硬件电路
外围电路比较简单,电源、IIC接口、电阻管脚,共6个管脚,电路如下:
三、工程搭建
因为用的是STM32,所以这里使用STM32CUBEMX来搭建工程,主要配置如下:
就是一些基本配置,没啥特别的。
四、IIC硬件地址
每个IIC设备,都有一个7位的硬件地址,如下图:
7位的硬件地址+读写控制位(读:1;写:0),共8位。所以要进行读操作时,硬件地址为0x5f,写操作时,硬件地址0x5e。
但是对于STM32的HAL库来说,0x5f和0x5e其实没区别,只要你把‘0101111’写在高7位即可,最后一位,HAL库中的应用程序会自动根据当前的读操作或者写操作进行置一/清零。
五、驱动程序
直接调用HAL库中,IIC的读写函数即可,写操作如下:
#define MCP4017_ADDRESS 0x5e
//设置阻值
void set_res_val(float val)
{
uint8_t res_step = 0;
val = val - 181.0;
val = val / 39.37;
res_step = (uint8_t)val;
HAL_I2C_Master_Transmit(&hi2c2, MCP4017_ADDRESS, &res_step,1, 0xff);
}
如上所示,假设要设置一个4500欧姆的阻值,直接调用该函数:
set_res_val(4500.0);
首先要减掉电刷电阻,181欧姆;
然后除以单个抽头的阻值39.37欧姆,得到要设置的抽头数;
最后调用IIC发送函数,写入一个数据(抽头数)即可。
想要读取当前设置的抽头数的话,直接读就行:
HAL_I2C_Master_Receive(&hi2c2, MCP4017_ADDRESS ,&res_step,1, 0xff);
很简单吧!
我是单片机爱好者-MCU起航!