1. MCP41010简介
256抽头,数字电位器。
有三种总电阻阻值型号,10kΩ、50kΩ、100kΩ。tb上买到的绝大多数都是10kΩ。
三线SPI通信。
2. 应用领域
音响、功放
使用数字电位器和运算放大器,搭建PGA
3. 数据手册时序
4. 通信波形
黄 - SCK; 蓝 - SI
黄 - SCK; 蓝 - CS
5.stm32F407程序
程序使用的模拟SPI。
程序为stm32F4驱动MCP41010,使用F1稍加修改GPIO配置即可。
MCP41010每次重新上电后,滑动抽头寄存器都默认为0x80。
PA0、PW0、PB0间的阻值需要根据自己器件的总阻值、和滑动抽头位置计算。
设置MCP41010的滑动变阻器抽头位置,使用:void MCP41010_SetRes(uint8_t xRes);
#include "MCP41010.h"
#define DP_SI PBout(14) // PB14 - SI
#define DP_SCK PBout(15) // PB15 - SCK
#define DP_CS PCout(8) // PC8 - CS
/*此处定义DP_SCK模拟时序的延时,可更改其延时时间来更改电平保持时间,从而影响通信速率 */
//如果外部信号线过长,需要降低通信速率,可将该值改大
#define MCP_SCK_delay delay_us(1)
//MCP41010芯片初始化,控制放大倍数:PB14-SI, PB15-SCK, PC8-CS
void MCP41010_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOB,GPIOC时钟
//GPIOB初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; //SI, SCK对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
//GPIOC初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //CS对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO
GPIO_ResetBits(GPIOB,GPIO_Pin_14 | GPIO_Pin_15); //GPIOB14,15置低
GPIO_ResetBits(GPIOC,GPIO_Pin_8); //GPIOC8置低
}
//SPI发送单字节
//xtemp:发送的字节
void MCP41010_SPI_SendOneByte(uint8_t xtemp)
{
uint8_t xnum = 0;
/* DP_SCK发送8个脉冲,在上升沿时送入数据 */
for(xnum=0; xnum<8; xnum++)
{
//DP_SI写数据
DP_SI = (xtemp & 0x80) >>7;
xtemp = xtemp << 1;
//延时待数据稳定后,在DP_SCK产生上升沿脉冲,数据送入MCP41010
MCP_SCK_delay;
DP_SCK = 1;
//DP_SCK产生下降沿脉冲
MCP_SCK_delay;
DP_SCK = 0;
}
}
//设置MCP41010的滑动变阻器抽头位置
//xRes:电阻编码值
//注:00时,W抽头处于抽头B的位置,阻值等于抽头电阻,典型值为52Ω
//注:FF时,W抽头处于抽头A的位置,阻值等为9985.94Ω,抽头始终不会与A端相连
//注:对于10KΩ的器件来说,LSB为39.0625Ω
//注:每次芯片上电后,抽头寄存器的值为0x80
void MCP41010_SetRes(uint8_t xRes)
{
//MCP41010芯片使能
DP_CS = 0;
//发送第一字节,控制方式位
//0x13。写数据,对电位器0,1操作
MCP41010_SPI_SendOneByte(0x13);
//发送第二字节,滑动变阻器抽头位
MCP41010_SPI_SendOneByte(xRes);
//MCP41010芯片失能
DP_CS = 1;
}
6. 注意事项
- MCP41010每次重新上电后,滑动抽头寄存器都默认为0x80。
- MCP41010和其他运放搭建PGA使用很不方便。一开始我使用MCP41010就这么用的,后来换为了专用PGA集成芯片。见我的另一篇博客:https://blog.csdn.net/Mark_md/article/details/106998973