stm32F4驱动MCP41010程序-数字电位器-应用详解

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

STM32 MCP41010 数字电位器是一种基于单片机接口设计的电子元件,它将传统的机械电位器的功能转换成了数字信号控制的模式,适用于需要精确、稳定且可远程调整电阻值的应用场景。MCP41010 是由 Microchip Technology Inc. 制造的一款 I2C 接口的数字电位器,能够提供 16 级可编程电阻值。 ### 技术特点: 1. **I2C 接口**:MCP41010 使用标准的 I2C 单总线通信协议,便于集成到基于 STM32 的微控制器系统中,减少了外部硬件连接的需求。 2. **可编程电阻值**:通过发送特定的数据包到设备,可以调整 MCP41010 内部的电阻值。这使得用户可以在系统运行期间动态改变电位器的位置,满足对精密控制有需求的应用场景。 3. **低功耗**:作为数字电位器MCP41010 拥有较低的静态电流消耗,适合于电源管理严格的系统应用。 4. **高精度**:相比于传统的机械电位器,数字电位器能够在更宽的温度范围内保持更高的精度和稳定性。 5. **尺寸紧凑**:由于不需要像传统电位器那样包含物理旋转部分,MCP41010 在封装上通常比同等功能的机械电位器小得多。 ### 应用示例: STM32 微控制器与 MCP41010 数字电位器的结合广泛应用于各种场合,包括但不限于音频均衡、照明控制系统、音量调节等需要精确控制电平或电压的应用。例如,在 LED 明暗控制项目中,通过调整 MCP41010 中的电阻值,可以实现 LED 光照亮度的精细控制。 ### 实现步骤: 为了在 STM32 上使用 MCP41010 数字电位器,你需要完成以下几个基本步骤: 1. **硬件连接**:将 MCP41010 的数据线(SDA)、时钟线(SCL)以及电源和接地端子连接至 STM32 的相应引脚。 2. **软件初始化**:配置 STM32 的 I2C 接口模块,包括设置工作频率、中断处理等功能。 3. **发送命令**:编写程序MCP41010 发送命令以读取当前的电阻值,或者更新电阻值。这通常涉及到构建并发送包含寄存器地址和数据的 I2C 数据包。 4. **验证与调试**:通过测试程序确认数字电位器的响应是否如预期般准确,并对可能出现的问题进行调试。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值