MAX22200例程,8通道电磁阀驱动芯片

1、简介

MAX22200是一个八路36V串行控制电磁阀驱动器。每个通道都具有低阻抗(200mΩ 典型)推挽输出级,具有源极和漏极驱动能力和高达1ARMS的驱动电流。串行接口 (SPI) 还支持菊花链配置,可单独控制每个通道。

器件半桥可配置为低压侧驱动器或高压侧驱动器。此外, 成对的半桥可以并联以加倍驱动电流,也可以配置为全桥 ,以驱动多达四个锁存阀(双稳阀)或四个有刷直流电机 。

支持两种控制方法:电压驱动调节 (VDR) 和电流驱动调节 (CDR)。在 VDR 模式下,设备输出 PWM 电压,其中的占 空比可通过 SPI 进行编程。对于给定的电源电压和电磁电 阻,输出电流与编程占空比成正比。在 CDR 中,内部集成 的无损电流检测 (ICS) 电路会检测输出电流,并将其与内部可编程参考电流进行比较。

为优化电磁线圈驱动应用中的电源管理,可为每个通道单独配置激励驱动电平 (IHIT)、保持驱动电平 (IHOLD) 和激励驱动时间 (tHIT)。
MAX22200 具有全套保护和诊断功能。其中包括过流保护(OCP)、热关断 (TSD)、欠压锁定 (UVLO)、开路负载检测(OL) 和柱塞移动检测 (DPM)。故障指示引脚 (FAULT) 信号故障事件,诊断信息存储在 FAULT 寄存器中。
由于使用的灵活性、串行接口控制、高效率和小封装,MAX22200特别适用于需要低功耗和高集成度的电磁驱动器应用(阀门控制、继电器控制等)。
需要完整例程,和对芯片样品,请联系深圳市智联微电子有限公司,网址 TRINAMIC,步进电机驱动,精密运动控制-深圳市智联微电子有限公司

2、MAX22200引脚

3、例程

3.1、SPI的读和写

/**
  * @brief  往寄存器值写入参数,并更新获取到的STATUS状态字节
  * @param  address:寄存器地址
  * @param  value  :写入的值
  * @return 无
  * @attention   这是SPI通信,写入的数据有32bit。其中 value 值,SPI先发送低8位。
  *
  */
void max22200_write_register_32bit(uint8_t address, int32_t value)
{
    uint8_t send_data[4] = {0,0,0,0};
    uint8_t datagram1[4] = {0,0,0,0};
           
    MAX22200_Registers.COMMAND.n8_32bits    = RESET;                // 0: SPI数据传输长度为32bit
    MAX22200_Registers.COMMAND.A_BNK        = address;              // 传输后面需要访问的寄存器地址
    MAX22200_Registers.COMMAND.RB_W         = SET;                  // 设置为写操作
    send_data[0] = MAX22200_Registers.COMMAND.Value;
    
    HAL_GPIO_WritePin(GPIOB,CMD_Pin,GPIO_PIN_SET);                      // CMD 引脚需先置高电平   
//    HAL_Delay(1);
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);   	//SPI_CS片选拉低
    HAL_SPI_TransmitReceive(&hspi1, send_data, datagram1, 1,100);
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);  	//SPI_CS片选拉高
    HAL_GPIO_WritePin(GPIOB,CMD_Pin,GPIO_PIN_RESET);                   // CMD 引脚需置低电平
    
    send_data[3] = (value >> 24) & 0xff;
    send_data[2] = (value >> 16) & 0xff;
    send_data[1] = (value >>  8) & 0xff;
    send_data[0] =  value  & 0xff;
    
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, send_data, datagram1, 4, 100);
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);  	//SPI_CS片选拉高
}


/**
  * @brief  获取寄存器值并返回,并更新获取到的STATUS[7...0]状态字节
  * @param  address:寄存器地址
  * @return 通过输入的结构体返,回获取到的STATUS[7...0]状态字节,和指定寄存器地址所获取到的值
  * @attention   这是SPI通信,获取寄存器的数据有32bit。其中 value 值,SPI先接受低8位。
  *
  */
void max22200_read_register_32bit(uint8_t address, max22200_TypeDef *Return_Value)
{
    uint8_t send_data[4] = {0,0,0,0};
	uint8_t receive_data[4] = {0,0,0,0};
    
    MAX22200_Registers.COMMAND.n8_32bits    = RESET;                // 0: SPI数据传输长度为32bit
    MAX22200_Registers.COMMAND.A_BNK        = address;              // 传输后面需要访问的寄存器地址
    MAX22200_Registers.COMMAND.RB_W         = RESET;                // 设置为读操作
    send_data[0] = MAX22200_Registers.COMMAND.Value;
    
    HAL_GPIO_WritePin(GPIOB,CMD_Pin,GPIO_PIN_SET);                      // CMD 引脚需先置高电平   
//    HAL_Delay(1);
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);    
    HAL_SPI_TransmitReceive(&hspi1, send_data, receive_data, 1, 100);		
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);     // SPI_CS片选拉高
    Return_Value -> Value_1 = receive_data[0];                         // 获取到的第一个值
    HAL_GPIO_WritePin(GPIOB,CMD_Pin,GPIO_PIN_RESET);                   // CMD 引脚需置低电平  
    
    send_data[0] = 0;
    
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);    
    HAL_SPI_TransmitReceive(&hspi1, send_data, receive_data, 4, 100);
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);  	//SPI_CS片选拉高

    Return_Value -> Value_2 = ((uint32_t)receive_data[3] << 24) | ((uint32_t)receive_data[2] << 16) | (receive_data[1] << 8) | receive_data[0];         //先返回的是低字节
}

3.2、对MAX22200初始化

// MAX22200的SPI初始化
void max22200_init(void)
{
    HAL_GPIO_WritePin(GPIOB, ENABLE_Pin, GPIO_PIN_SET);                 // 置高电平使能设备;置低电平进入低功耗睡眠模式。
    HAL_Delay(500);                                                     // ENABLE引脚置低再置高时,需延时500毫秒再进行SPI通信
    HAL_GPIO_WritePin(GPIOB, CMD_Pin,    GPIO_PIN_SET);                 // CMD引脚初始化前先置高电平
    
    // 清除max22200的 UVM 报警。配置 MAX22200_STATUS 寄存器。
    MAX22200_Registers.STATUS.ACTIVE    =   SET;                        // 把 MAX22200_STATUS 寄存器的bit0 置1,让芯片处于正常工作模式。这里是必要的。
    MAX22200_Registers.STATUS.M_COMF    =   RESET;                        // 把 MAX22200_STATUS 寄存器的bit18置1,让芯片屏蔽SPI通信错误故障。这里非必须。
    
    max22200_write_register_32bit(MAX22200_STATUS, MAX22200_Registers.STATUS.Value); 
    do{
        max22200_read_register_32bit(MAX22200_STATUS, &MAX22200_regValue);
    }while((MAX22200_regValue.Value_1 & 0x03) != b_ACTIVE_flag);                 // 确认 UVM 故障标志被清除。
}   

3.3、mian函数

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
    max22200_init();
    

    // 配置通道0的CFG寄存器
    MAX22200_Registers.CFG_CH[0].HHF_EN     =       SET;                // 关闭HIT电流打开诊断功能
    MAX22200_Registers.CFG_CH[0].DPM_EN     =       RESET;              // 关闭柱塞检测DPM功能
    MAX22200_Registers.CFG_CH[0].OL_EN      =       SET;                // 打开负载开路检测功能
    MAX22200_Registers.CFG_CH[0].SRC        =       RESET;              // 快速输出过度
    MAX22200_Registers.CFG_CH[0].FREQ_CFG   =       0;                  // 设置通道的分频系数,配置0为4分频
    MAX22200_Registers.CFG_CH[0].HSnLS      =       SET;                // 设置为高压侧模式
    MAX22200_Registers.CFG_CH[0].VDRnCDR    =       VDR_Mode;           // 设置为电压控制模式VDR
    MAX22200_Registers.CFG_CH[0].HIT_T      =       0;                  // 配置激励时间
    MAX22200_Registers.CFG_CH[0].HIT        =       31;                 // 配置激励电流大小
    MAX22200_Registers.CFG_CH[0].TRGnSPI    =       RESET;              // 选择由SPI配置STATUS的bit24...31控制通道的开和关
    MAX22200_Registers.CFG_CH[0].HOLD       =       15;                 // 配置保持电流大小
    MAX22200_Registers.CFG_CH[0].HFS        =       RESET;              // 满刻度
    
    
    max22200_write_register_32bit(MAX22200_CFG_CH( 0 ), MAX22200_Registers.CFG_CH[ 0 ].Value); 
    max22200_write_register_32bit(MAX22200_CFG_CH( 7 ), MAX22200_Registers.CFG_CH[ 0 ].Value); 
    

    max22200_Enable_chennal(Channel_0 | Channel_1 | Channel_2 | Channel_3, SET);            // 打开通道0、1、2、3
    HAL_Delay(50);
    max22200_Enable_chennal(Channel_0, RESET);                                              // 关闭通道0
    HAL_Delay(50);
    max22200_Enable_chennal(Channel_0, SET);  
    HAL_Delay(50);
    max22200_Enable_chennal(Channel_0, RESET); 
    HAL_Delay(50);   
    max22200_Enable_chennal(Channel_0, SET);  
    HAL_Delay(50);
    max22200_Enable_chennal(Channel_0, RESET); 
    HAL_Delay(50); 
    
    // 读故障寄存器 MAX22200_FAULT。
//    max22200_read_register_32bit(MAX22200_FAULT, &MAX22200_regValue);
    
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
//    max22200_Enable_chennal(Channel_0, SET);  
//    HAL_Delay(30);
//    max22200_Enable_chennal(Channel_0, RESET); 
//    HAL_Delay(30); 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3.4、一些定义

#include "stdint.h"


#define MAX22200_STATUS             0x00            // 状态寄存器
#define MAX22200_FAULT              0x09            // 故障诊断寄存器
#define MAX22200_CFG_DPM            0x0A            // 柱塞检测配置寄存器

                                                    //     ch = 0  ch = 1  ch = 2  ch = 3  ch = 4  ch = 5  ch = 6  ch = 7
#define MAX22200_CFG_CH(ch)         (0x1 + ch)      //      0x01    0x02    0x03    0x04    0x05    0x06    0x07    0x08

#pragma anon_unions
typedef union // 用来描述STATUS(0x00)的数据字
{
	uint32_t Value;
	struct // 用来描述控制寄存器的数据字
	{
		// 低位在前,高位在后
		uint8_t ACTIVE   		    : 1;    // 0: 低功耗模式,芯片关闭;1: 芯片正常运行
		uint8_t UVM     	        : 1;    // 1: 检测到 VM 欠压锁定事件           0: 没有此故障;          
        uint8_t COMER 	            : 1;    // 1: 检测到 SPI写入通信错误           0: 没有此故障           
		uint8_t DPM                 : 1;    // 1: 至少 1 个通道检测到柱塞移动故障   0: 没有此故障    
		uint8_t HHF                 : 1;    // 1: 至少 1 个通道检测到 HIT 电流故障(仅限CDR模式)
		uint8_t OLF 	            : 1;    // 1: 至少 1 个通道检测到负载开路故障
		uint8_t OCP 	            : 1;    // 1: 至少 1 个通道检测到过流故障
		uint8_t OVT                 : 1;    // 1: 芯片处于热保护状态
		uint8_t CM10    	        : 2;    // 0x0: 通道0和通道1由寄存器CFG0和GFG1独立控制。 
                                            // 0x1: 通道0和通道1处于并联模式,由寄存器CFG0和GFG1控制。 
                                            // 0x2: 通道0和通道1处于H桥模式,ONCH0 和 ONCH1 控制状态和方向(00 = 高阻,01= Fwd,10 = 保留,11 = 制动)。根据 CFG0 对 LS 进行 PWM 调节控制。
                                            // 0x3: 保留
        
        uint8_t CM32    	        : 2;    // 0x0: 通道2和通道3由寄存器CFG2和GFG3独立控制。 
                                            // 0x1: 通道2和通道3处于并联模式,由寄存器CFG2和GFG3控制。 
                                            // 0x2: 通道2和通道3处于H桥模式,ONCH2 和 ONCH3 控制状态和方向(00 = 高阻,01= Fwd,10 = 保留,11 = 制动)。根据 CFG2 对 LS 进行 PWM 调节控制。
                                            // 0x3: 保留
        
        uint8_t CM54    	        : 2;    //
        uint8_t CM76    	        : 2;    //
        
        uint8_t FREQM               : 1;    // 1: 100KHz;                      0: 80KHz。内部振荡器频率设置位。
        uint8_t M_UVM               : 1;    // 1: FAULT引脚上不发出 UVM 信号
        uint8_t M_COMF              : 1;    // 1: FAULT引脚上不发出 COMF信号
        uint8_t M_DPM               : 1;    // 1: FAULT引脚上不发出 DPM 信号
        uint8_t M_HHF               : 1;    // 1: FAULT引脚上不发出 HHF 信号
        uint8_t M_OLF               : 1;    // 1: FAULT引脚上不发出 OLF 信号
        uint8_t M_OCP               : 1;    // 1: FAULT引脚上不发出 OCP 信号
        uint8_t M_OVT               : 1;    // 1: FAULT引脚上不发出 OVT 信号
        uint8_t ONCH                : 8;    // 1: 半桥开启;                     0: 半桥关闭
	};
}__STATUS;



typedef union // 用来描述CFG_CH[ch]的数据字
{
	uint32_t Value;
	struct // 用来描述控制寄存器的数据字
	{
		// 低位在前,高位在后
		uint8_t HHF_EN   		    : 1;    // 0: 禁用 HIT 电流达到诊断功能;   1: 启用 HIT 电流达到诊断功能
        uint8_t DPM_EN              : 1;    // 0: 禁用 DPM 故障诊断            1: 启用DPM 故障诊断
        uint8_t OL_EN               : 1;    // 0: 禁用负载开路检测             1: 开启负载开路检测
        uint8_t SRC                 : 1;    // 0: 快速输出过渡                 1: 在低端模式下,输出转换由压摆率控制
        uint8_t FREQ_CFG            : 2;    // 0x0: 主斩波频率/4; 0x1: 主斩波频率/3; 0x2: 主斩波频率/2; 0x3: 主斩波频率;  
        uint8_t HSnLS               : 1;    // 0: 工作于低压侧模式             1: 工作于高压侧模式
        uint8_t VDRnCDR             : 1;    // 0: 受控于电流驱动模式           1: 受控于电压驱动模式
        uint8_t HIT_T               : 8;    // 0: HIT 时间配置位
        uint8_t HIT                 : 7;    // 0: HIT 电流配置位
        uint8_t TRGnSPI             : 1;    // 0: 通道由ONCH_ SPI 位控制       1:  TRIG_ 引脚控制
        uint8_t HOLD                : 7;    // 0: 保持电流配置位
        uint8_t HFS                 : 1;    // 0: 满刻度                       1: 半刻度。满刻度/半满刻度选择位
	};
}__CFG_CH;


typedef union // 用来描述FAULT(0x09)的数据字
{
	uint32_t Value;
	struct // 用来描述控制寄存器的数据字
	{
		// 低位在前,高位在后
		uint32_t DPM   		        : 8;    // OCP 保护标志。一共8bit对应8个通道
        uint32_t OLF                : 8;    // 空载检测标志。一共8bit对应8个通道
        uint32_t HHF                : 8;    // HIT 电流未达到标志。一共8bit对应8个通道
        uint32_t OCP                : 8;    //OCP 保护标志。一共8bit对应8个通道
	};
}__FAULT;


typedef union // 用来描述CFG_DPM[ch]的数据字
{
	uint32_t Value;
	struct // 用来描述控制寄存器的数据字
	{
		// 低位在前,高位在后
		uint8_t DPM_IPTH   		    : 4;    // 0: 
        uint8_t DPM_TDEB            : 4;    // 
        uint8_t DPM_ISTART          : 7;    // 
        uint8_t reserved_0          : 1;    //保留位,保持0
        uint8_t reserved_1          : 8;    //保留位,保持0
        uint8_t reserved_2          : 1;    //保留位,保持0
	};
}__CFG_DPM;


typedef union // 用来描述 COMMAND 的数据字
{
	uint8_t Value;
	struct // 用来描述控制寄存器的数据字
	{
		// 低位在前,高位在后
		uint8_t n8_32bits   		: 1;    // 0: SPI数据传输长度为32bit; 1: SPI数据传输长度为8bit
        uint8_t A_BNK               : 4;    // 后续 SPI 传输的 32 位寄存器组的地址
        uint8_t RFU                 : 2;    // 保留位,保持0
        uint8_t RB_W                : 1;    // 该位决定后续 SPI 传输是写操作还是读操作。(读 = 0,写 = 1)
	};
}__COMMAND;



typedef struct
{
    __STATUS        STATUS;
    __CFG_CH        CFG_CH[8];
    __FAULT         FAULT;
    __CFG_DPM       CFG_DPM;
    __COMMAND       COMMAND;
}__MAX22200;

extern __MAX22200 MAX22200_Registers;

4、写在最后

需要完整例程,和对芯片样品,请联系深圳市智联微电子有限公司,网址TRINAMIC,步进电机驱动,精密运动控制-深圳市智联微电子有限公司

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值