HAL库STM32硬件IIC驱动数字电位器MCP4017

项目需要,最近用到了一个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起航!

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据