MCP402x是可调电子电阻器件,主要应用在一些可调系统中
此驱动具有结构化的特点,可轻松实现面向对象编程,便于移植,如需移植到其他平台只需改变驱动IO即可;
驱动函数丰富,可实现存入eeprom或动态设置,
可根据等级设置阻值或直接写入阻值,方便用在不同的应用中
1,以下为C文件
#include "MCP4022.h"
//MCP4022成员配置信息,结构化封装对象
static Mcp402x_config_t mcp402x_res_config[] =
{
{
.CS_PORT =GPIOB,
.CS_PIN =GPIO_PIN_8,
.UD_PORT =GPIOB,
.UD_PIN =GPIO_PIN_9,
.Wiper_Level =0x1F,
.Mcp402x_Model =MCP402X_503E,
.Name ="U2_MCP4022T",
.Delay = 2,
.Res_Step =0,
},
{
.CS_PORT =GPIOB,
.CS_PIN =GPIO_PIN_12,
.UD_PORT =GPIOB,
.UD_PIN =GPIO_PIN_13,
.Wiper_Level =0x1F,
.Mcp402x_Model =MCP402X_503E,
.Name ="U4_MCP4022T",
.Delay = 50,
.Res_Step =0,
},
};
uint8_t g_mcp402x_number =sizeof(mcp402x_res_config)/sizeof(mcp402x_res_config[0]);
void Mcp402x_Delay_Uint(uint16_t delay)
{
while(delay--);
}
/*
* Function Name:Get_Mcp402x_Step
* Author:LGH
* Date:10/20/23 16:19:18
* Function:获取对应型号单位电阻值
* Input Parameter:
* Return:
* Others:
*/
float Get_Mcp402x_Step(uint8_t Model)
{
switch(Model)
{
case MCP402X_203E:
return 33.33f;
case MCP402X_503E:
return 79.37f;
case MCP402X_104E:
return 158.73f;
case MCP402X_504E:
return 793.65f;
}
return 33.33f;
}
/*
* Function Name:Mcp402x_Io_Init
* Author:LGH
* Date:10/20/23 15:29:49
* Function:mcp402x IO初始化
* Input Parameter:
* Return:
* Others:
*/
void Mcp402x_Io_Init(Mcp402x_config_t mcp402x)
{
uint8_t i;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = mcp402x.CS_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(mcp402x.CS_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = mcp402x.UD_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(mcp402x.UD_PORT, &GPIO_InitStruct);
for(i=0;i<g_mcp402x_number;i++)
{
MCP4022_CS(mcp402x_res_config[i],1);
MCP4022_UD(mcp402x_res_config[i],1);
}
}
/*
* Function Name:Mcp402x_Config_Init
* Author:LGH
* Date:10/20/23 15:30:20
* Function:mcp402x配置初始化
* Input Parameter:
* Return:
* Others:
*/
void Mcp402x_Config_Init(void)
{
uint8_t i;
for(i=0;i<g_mcp402x_number;i++)
{
Mcp402x_Io_Init(mcp402x_res_config[i]);
mcp402x_res_config[i].Res_Step = Get_Mcp402x_Step(mcp402x_res_config[i].Mcp402x_Model);
}
}
/*
* Function Name:Increment_Wiper_Without_Rom
* Author:LGH
* Date:10/20/23 16:47:28
* Function:Increment without Writing Wiper Setting to EEPROM
* Input Parameter:
* Return:
* Others:
CS:--- --------------------------
|_________________|
UD:------ --- --------- --- -------
|___| |___| |___| |___|
*/
void Increment_Wiper_Without_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level)
{
uint8_t i;
MCP4022_CS(mcp402x,1);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_CS(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
for(i=0;i<set_level;i++)
{
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_CS(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
for(i=0;i<2;i++)
{
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
}
/*
* Function Name:Increment_Wiper_With_Eeprom
* Author:LGH
* Date:10/20/23 16:47:28
* Function:Increment with Writing Wiper Setting to EEPROM
* Input Parameter:
* Return:
* Others:
CS:--- --------------------------
|_____________________|
UD:------ --- --- --- ---
|___| |___| |_____________| |___| |______
*/
void Increment_Wiper_With_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level)
{
uint8_t i;
MCP4022_CS(mcp402x,1);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_CS(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
for(i=0;i<set_level;i++)
{
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_CS(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay*2);
for(i=0;i<2;i++)
{
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
}
/*
* Function Name:Decrement_Wiper_Without_Eeprom
* Author:LGH
* Date:10/20/23 16:47:28
* Function:Decrement without Writing Wiper Setting to EEPROM
* Input Parameter:
* Return:
* Others:
CS:--- --------------------------
|___________________|
UD: --- --- --- ---
______| |___| |__________| |___| |_________
*/
void Decrement_Wiper_Without_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level)
{
uint8_t i;
MCP4022_CS(mcp402x,1);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_CS(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
for(i=0;i<set_level;i++)
{
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
MCP4022_CS(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay*2);
for(i=0;i<2;i++)
{
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
}
/*
* Function Name:Decrement_Wiper_With_Eeprom
* Author:LGH
* Date:10/20/23 16:47:28
* Function:Decrement with Writing Wiper Setting to EEPROM.
* Input Parameter:
* Return:
* Others:
CS:--- --------------------------
|______________________|
UD: --- --- ------------ --- -------
______| |___| |___| |___| |___|
*/
void Decrement_Wiper_With_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level)
{
uint8_t i;
MCP4022_CS(mcp402x,1);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_CS(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
set_level-=1;
for(i=0;i<set_level;i++)
{
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay); /*
*/
MCP4022_CS(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
for(i=0;i<2;i++)
{
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
}
/*
* Function Name:Decrement_Wiper_With_Eeprom
* Author:LGH
* Date:10/20/23 16:47:28
* Function:Write Wiper Setting to EEPROM
* Input Parameter:
* Return:
* Others:
CS:--- --------------------------
|________________________|
UD:------- --- ---
|_________________________| |___| |__________
*/
void Write_Wiper_To_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level)
{
uint8_t i;
MCP4022_CS(mcp402x,1);
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay*2);
MCP4022_CS(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
for(i=0;i<set_level;i++)
{
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
MCP4022_CS(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay*2);
for(i=0;i<2;i++)
{
MCP4022_UD(mcp402x,1);
Mcp402x_Delay_Uint(mcp402x.Delay);
MCP4022_UD(mcp402x,0);
Mcp402x_Delay_Uint(mcp402x.Delay);
}
}
/*
* Function Name:Set_Pot_Resistors
* Author:LGH
* Date:10/25/23 10:03:36
* Function:设置电位器梯度
* Input Parameter:
* mcp402x:设置对应的mcp402x
* res_value:设置阻值梯度
* Return:
* Others:
*/
uint8_t Set_Level_Resistors(Mcp402x_member_e mcp402x,uint8_t res_level)
{
uint8_t set_level;
assert_param(IS_MCP402X(mcp402x));
if(res_level > mcp402x_res_config[mcp402x].Wiper_Level)
{
set_level =res_level - mcp402x_res_config[mcp402x].Wiper_Level;
Increment_Wiper_Without_Eeprom(mcp402x_res_config[mcp402x],set_level);
}
else if(res_level < mcp402x_res_config[mcp402x].Wiper_Level)
{
set_level =mcp402x_res_config[mcp402x].Wiper_Level - res_level;
Decrement_Wiper_Without_Eeprom(mcp402x_res_config[mcp402x],set_level);
}
mcp402x_res_config[mcp402x].Wiper_Level =res_level;
return mcp402x_res_config[mcp402x].Wiper_Level;
}
/*
* Function Name:Set_Pot_Resistors
* Author:LGH
* Date:10/25/23 10:03:36
* Function:设置电位器阻值
* Input Parameter:
* mcp402x:设置对应的mcp402x
* res_value:设置阻值,要满足电位器最小阻值分辨率
* Return:
* Others:
*/
uint8_t Set_Pot_Resistors(Mcp402x_member_e mcp402x,float res_value)
{
uint8_t res_level;
assert_param(IS_MCP402X(mcp402x));
res_level =res_value/mcp402x_res_config[mcp402x].Res_Step;
if(res_level ==0)
return res_level;
Set_Level_Resistors(mcp402x,res_level);
return res_level;
}
2,头文件
#ifndef _MCP4022_H_
#define _MCP4022_H_
#include "stm32f1xx.h"
#define MCP402X_203E 0
#define MCP402X_503E 1
#define MCP402X_104E 2
#define MCP402X_504E 3
#define MCP4022_CS(MCP402x,x) (x ? HAL_GPIO_WritePin(MCP402x.CS_PORT,MCP402x.CS_PIN,GPIO_PIN_SET): HAL_GPIO_WritePin(MCP402x.CS_PORT,MCP402x.CS_PIN,GPIO_PIN_RESET))
#define MCP4022_UD(MCP402x,x) (x ? HAL_GPIO_WritePin(MCP402x.UD_PORT,MCP402x.UD_PIN,GPIO_PIN_SET): HAL_GPIO_WritePin(MCP402x.UD_PORT,MCP402x.UD_PIN,GPIO_PIN_RESET))
typedef enum
{
MCP4022_U2,
MCP4022_U4,
}Mcp402x_member_e;
#define IS_MCP402X(MEM) (((MEM) ==MCP4022_U2) |((MEM) ==MCP4022_U4))
typedef struct Mcp402x_config
{
GPIO_TypeDef* CS_PORT;
uint16_t CS_PIN;
GPIO_TypeDef* UD_PORT;
uint16_t UD_PIN;
uint8_t Wiper_Level;
uint8_t Mcp402x_Model;
char *Name;
uint16_t Delay;
float Res_Step;
}Mcp402x_config_t;
void Mcp402x_Config_Init(void);
void Increment_Wiper_Without_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level);
void Increment_Wiper_With_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level);
void Decrement_Wiper_Without_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level);
void Decrement_Wiper_With_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level);
void Write_Wiper_To_Eeprom(Mcp402x_config_t mcp402x,uint8_t set_level);
uint8_t Set_Pot_Resistors(Mcp402x_member_e mcp402x,float res_value);
uint8_t Set_Level_Resistors(Mcp402x_member_e mcp402x,uint8_t res_level);
#endif