蓝桥杯——STM32 MCP4017可编程电阻原理与代码

1.MCP4017原理

这是一种可以通过I2C来设置接入电阻值的器件,可以作为滑动变阻器,也可以作为电位器(分压器)。

板子上的就是变阻器:

电路网络如下:

 结合两图,B直接接到了GND,W则连接电阻R17(10K)之后连接VCC,从B到W之间的就是串联的电阻。我们通过I2C发送数据字节(00h~7Fh)来选择闭合哪一个开关,闭合N号开关即串联接入N个电阻。

2. 计算

下图红框是板子上MCP4017的的Rs值和RAB总阻值:

 那么计算公式如下图:

那么PB14的电压如何计算?

 分压公式: 

 V_{PB14}=\frac{R_{WB}}{R_{WB}+10K}*3.3=\frac{\frac{R_{AB}*N}{127}}{\frac{R_{AB}*N}{127}+10K}*3.3=\frac{0.7874*N}{0.7874*N+10K}*3.3

 还有一种方法:使用ADC1进行测量,如果遇到ADC1有两个通道的话,用DMA,使用二维数组存储数据。

 3.代码

 

 时序你主要看上图的I2C总线那一行,对于写操作,两个应答都是来自于器件的应答,不同的是读操作在主器件收到数据后要回应不应答,然后结束。具体代码如下:

MCP4017代码:

void MCP4017_Write(uint8_t value)
{
	I2CStart();
	I2CSendByte(0X5E);//0101 1110  写
	while(I2CWaitAck());
	
	I2CSendByte(value);
	while(I2CWaitAck());
	I2CStop();
}

uint8_t MCP4017_Read()
{
	uint8_t val;
	I2CStart();
	I2CSendByte(0X5F);//0101 1111 READ
	while(I2CWaitAck());
	
	val=I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	return val;
		
	
}

 两个器件的测试函数以及相关变量:

//*LCD显示专用变量
unsigned char Lcd_Disp_String[21];//最多显示20个字符

//*EEPROM的相关变量
unsigned char EEPROM_Sendbuf[11]={1,2,3,4,5,4,3,2,1,9};
unsigned char EEPROM_Recbuf[11];
//MCP4017
uint8_t RES_4017;
 void EEPROM_Test()
 {
	EEPROM_Write(EEPROM_Sendbuf,0,10);
	 HAL_Delay(10);
	 EEPROM_Read(EEPROM_Recbuf,0,10);
	 
 }
 void MCP4017_Test()
 {
	 MCP4017_Write(0X3F);
	 RES_4017=MCP4017_Read();
 }

 另给出LCD的显示测试:

void Lcd_Proc(void)
{

	


	sprintf((char *)Lcd_Disp_String, "EE:%d%x%x%x%x%x%x%x%x%x",EEPROM_Recbuf[0],EEPROM_Recbuf[1],EEPROM_Recbuf[2],EEPROM_Recbuf[3],EEPROM_Recbuf[4],EEPROM_Recbuf[5],EEPROM_Recbuf[6],EEPROM_Recbuf[7],EEPROM_Recbuf[8],EEPROM_Recbuf[9]);
	LCD_DisplayStringLine(Line0, Lcd_Disp_String);
	sprintf((char *)Lcd_Disp_String, "RES_K:%5.2fK",0.7874*RES_4017);
	LCD_DisplayStringLine(Line1, Lcd_Disp_String);	
	sprintf((char *)Lcd_Disp_String, "PB14V:%6.3fV",3.3*((0.7874*RES_4017)/(0.7874*RES_4017+10)));
	LCD_DisplayStringLine(Line2, Lcd_Disp_String);	
	sprintf((char *)Lcd_Disp_String, "ADC_PB14V:%2.2fV",ADC1_Value());
	LCD_DisplayStringLine(Line3, Lcd_Disp_String);
	HAL_RTC_GetTime(&hrtc, &H_M_S_Time, RTC_FORMAT_BIN);//读取日期和时间必须同时使用
	HAL_RTC_GetDate(&hrtc, &Y_M_D_Date, RTC_FORMAT_BIN);
	sprintf((char *)Lcd_Disp_String, "Time:%02d-%02d-%02d",(unsigned int)H_M_S_Time.Hours,(unsigned int)H_M_S_Time.Minutes,(unsigned int)H_M_S_Time.Seconds);
	LCD_DisplayStringLine(Line4, Lcd_Disp_String);
	sprintf((char *)Lcd_Disp_String, "Date:%02d-%02d-%02d-%02d",(unsigned int)Y_M_D_Date.Year,(unsigned int)Y_M_D_Date.Month,(unsigned int)Y_M_D_Date.Date,(unsigned int)Y_M_D_Date.WeekDay);
	LCD_DisplayStringLine(Line5, Lcd_Disp_String);
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用C语言编写的STM32MCP4726进行通信的代码示例: ```c #include "stm32f4xx_hal.h" // MCP4726的I2C地址 #define MCP4726_ADDRESS 0x60 I2C_HandleTypeDef hi2c1; // 写入一个16位的值到MCP4726 void mcp4726_write(uint16_t value) { uint8_t high_byte, low_byte; uint8_t buffer[3]; // 分割16位值为高8位和低8位 high_byte = (value >> 8) & 0xFF; low_byte = value & 0xFF; // 将高字节、低字节和控制字节写入缓冲区 buffer[0] = 0x40; buffer[1] = high_byte; buffer[2] = low_byte; // 使用HAL库进行I2C传输 HAL_I2C_Master_Transmit(&hi2c1, MCP4726_ADDRESS, buffer, 3, HAL_MAX_DELAY); } int main(void) { // 初始化STM32芯片和I2C总线 HAL_Init(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1); // 向MCP4726写入一个值(例如:2048) mcp4726_write(2048); while (1) { // 程序循环 } } ``` 这个示例代码使用了HAL库来进行STM32芯片和MCP4726芯片之间的I2C通信。在主函数中,我们先进行了STM32的初始化和I2C总线的配置。然后调用`mcp4726_write`函数将一个16位的值(例如:2048)写入到MCP4726芯片中。 请注意,你需要根据你的具体硬件连接和I2C配置进行适当的修改。确保正确连接了STM32MCP4726芯片,并根据具体的引脚定义进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满城烟雨DLRY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值