我们将PA0和PB0看成电位器的两端(哪一端为高电压端都行),而PW0则看作电位器的抽头(抽头有256个档位),由数据手册我们可以知道,抽头电流应该小于1mA;同时电位器三端PA0、PB0、PW0之间的电压范围应该在0-VDD之间,而VDD电压范围为2.7V-5.5V之间。电位器阻值典型值为10K欧姆,最小为8K欧姆,最大12K欧姆。上电时,抽头复位到中间刻度位置(80h)
两个数字电位器之间电阻差值有30%,而一个数字电位器256个档位中两个相邻档位电阻差值为1%
数字电位器工作在两种模式下:
一、滑动电阻器模式
在变阻器模式下,电阻具有正温度系数。随温度变化最大的在数据字节的的前 6%(数据字节为 00h 至 0Fh)中变化最大,原因是刮环电阻系数会影响总电阻。通常为 800 ppm/°C。
二、电位器模式
在电位器模式中,内阻比决定了器件的温度系数。RWB 电阻器与 RAB 电阻器的匹配电阻器的典型温度系数为1 ppm/°C(在数字字节为 80h 时测量)。在代码较低时,刮片电阻温度系数将占主导地位。
电位器电阻的计算公式如下:
控制器与MCP41XXX/42XXX 数字电位计之间的通信是通过 SPI 串行接口完成的。该接口
可发出三条指令:
1. 向电位计数据寄存器写入新值。
2. 使通道进入低功耗关机模式。
3. NOP(无操作)命令。
执行任何命令都需要将CS 低电平,然后将一个命令字节和一个数据字节时钟输入 16 位移位寄存器。然后将一个命令字节和一个数据字节时钟输入 16 位移位寄存器。CS 升高时执行命令。数据在时钟上升沿输入,在时钟下降沿从 SO 引脚(该引脚只有MCP42XXX有,功能是多个电位器级联)输出。设备将在 CS为低电平时,设备将跟踪时钟数(上升沿),如果时钟数不是 16 的倍数,则将终止所有命令。
对于MCP41XXX来说,我们只需要保证C1=0,C0=1, P0 = 1即可写入数据,其他的都为无关位。因此写入指令为0x11或者0x13。
设备可以在 SPI 模式 0,0和 1,1 模式下运行设备。在这两种模式下,数据在 SCK 上升沿时进入设备,而在 SCK 下降沿时从 SO 引脚输出数据。(上升沿采样,下降沿输出),Date Size = 16bit ,MSB first;
示例代码:
这里设置为单线仅主机传输模式,传输位数为8位(传输两次即16bit数据),SPI 0,0模式
MCP41010.c
/* 功能:改变MCP41010的阻值 */
/* TxDat: 设置阻值大小,我们以BW阻值为参考阻值 */
//计算公式: RBW = 10K*TXData/256 +52欧姆
//00时,W抽头处于抽头B的位置,BW阻值等于抽头电阻,典型值为52Ω
//FF时,W抽头处于抽头A的位置,BW阻值等为9985.94Ω,抽头始终不会与A端相连
/* 返回值:无 */
void MCP41010_WR_Byte(uint8_t TxData)
{
uint8_t RES[2];
RES[0] = 0x13; //控制命令,表示要写数据了
RES[1] = TxData;
MCP41010_Enable();
HAL_SPI_Transmit_DMA(&hspi2, RES, 2);
MCP41010_Disable();
}
MCP41010.h: 头文件
#ifndef __MCP41010_H__
#define __MCP41010_H__
#include "stm32g0xx_hal.h"
#include "main.h"
#define MCP41010_Enable() HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET)
#define MCP41010_Disable() HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET)
void MCP41010_WR_Byte(uint8_t TxData);
#endif
电位器模式下亲测有效,通过输入不同数据可以改变W抽头的分压。