MCP402x驱动文件,C语言版本

本文详细介绍了MCP402x可调电阻驱动的结构、编程接口、初始化过程以及如何设置电阻值和利用EEPROM。内容包括C代码片段,展示了如何通过C语言操作MCP402x以实现不同功能,如无写入EEPROM的增减滑动和写入滑动值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值