MAX22216例程,4通道电磁阀驱动芯片
STM32的SPI控制MAX22216的例程
例程的获取,联系智联微官网。
TRINAMIC,步进电机驱动,精密运动控制-深圳市智联微电子有限公司
1、简介
MAX22216集成了四个可编程半桥,电压最大36V,每路半桥最高可提供1AFS电流,通道并联后电流最大3.2A。它主要用于驱动感应负载,如开关电磁阀、直流电机、比例阀、双稳态阀、继电器等。MAX22216的工作环境温度为-40°C至+125°C。
MAX22216支持支持高侧/低侧单端驱动操作,和桥接负载(BTL)配置。还支持通道并联。
MAX22216支持电压控制、电流控制和混合方案。在电压驱动调节模式(VDR 模式)下,半桥输出电压受控。电源变化会得到内部补偿。在电流驱动调节模式(CDR 模式)下,半桥输出电流受到控制。电流由内部感应并反馈至控制器,以实现精确的闭环调节。可对比例 P 和积分 I 进行配置,以优化稳态误差和动态性能。
MAX22216集成了旨在优化电磁线圈和直流电机驱动控制的功能。这些功能包括用于省电的两级定序器、用于降噪的驱动信号斜坡控制 (RAMP)、用于抵消静摩擦和磁滞影响的抖动功能 (DITH)、用于缩短通断周期的快速退磁功能 (DC_H2L) 以及用于限制浪涌和失速电流的直流电机电流限制器。
先进的诊断功能可提高系统可靠性并实现预测性维护。 这些功能包括柱塞运动检测 (DPM)、电感测量、行程时间测量、开负载检测 (OL) 以及通过串行接口进行实时电流监控。
2、芯片引脚

3、SPI时序
MAX22216支持SPI和芯片内部寄存器通信,SPI的时钟频率最大10MHz,CRC校验可选,要是 CRC_EN 引脚置为高电平可激活CRC校验。
“WnR”为在最高位,用这位区分SPI是写访问还是读访问。如果要写访问,这位要置“1”,如果要读访问,这位要置“0”。
下图是不带CRC校验的SPI通信时序。SPI 输入数据传输由一个 24 位字组成:8 位地址和一个 W/R 位,外加 16 位数据。
不带CRC校验的SPI通信时序
下图是带有 CRC 校验通信错误的SPI通信时序。SPI 输入数据传输由 32 位组成: 地址和 W/R 位为 8 位,数据为 16 位,CRC校验为 8 位。如果 CRC_EN 引脚为高电平,则启用 CRC 错误检测。
带CRC校验的SPI通信时序
SPI返回值
每次SPI通信,正常都有返回值,先返回8bit的SPI状态位,后面16bit数据。16bit的数据,和上一个指令是读访问还是写访问有关。
如果上一条命令是写访问,DATA_OUT 将包含上一条命令中发送的 D[15:0] 数据。
如果上一条命令是读访问,DATA_OUT 将包含上一条命令中发送的 A[6:0] 地址的寄存器映射数据。所以如果要对寄存器读访问,需要连续读两次,用后面那次的返回值。
4、编程指导
下面的例程是基于STM32F103C8T6开发,用STM32cubemx生成工程文件
4.1、SPI通信例程
#include "spi.h"
volatile uint16_t register_value; //一个临时变量
volatile uint8_t max22216_crc_en = 1; // 1:SPI启动 CRC校验;0:SPI不使用 CRC校验
__MAX22216 MAX22216_Registers;
// => CRC wrapper
//extern uint8_t max22216_CRC8(uint8_t *data, size_t length);
// <= CRC wrapper
// SPI通信的 CRC 计算
uint8_t max22216_CRC(uint8_t *data, size_t length)
{
volatile uint8_t crc = 0x1F; // 0b11111;
volatile uint8_t crc_old;
for(size_t i = 0; i < length; i++)
{
crc_old = crc;
crc = FIELD_SET(crc, (1 << 5), 5, FIELD_GET(crc_old, (1 << 4), 4));
crc = FIELD_SET(crc, (1 << 4), 4, FIELD_GET(crc_old, (1 << 3), 3) ^ FIELD_GET(crc_old, (1 << 4), 4) ^ FIELD_GET(data[i / 8], (1 << (7 - (i % 8))), 7 - (i % 8)));
crc = FIELD_SET(crc, (1 << 3), 3, FIELD_GET(crc_old, (1 << 2), 2));
crc = FIELD_SET(crc, (1 << 2), 2, FIELD_GET(crc_old, (1 << 1), 1) ^ FIELD_GET(crc_old, (1 << 4), 4) ^ FIELD_GET(data[i / 8], (1 << (7 - (i % 8))), 7 - (i % 8)));
crc = FIELD_SET(crc, (1 << 1), 1, FIELD_GET(crc_old, 1, 0));
crc = FIELD_SET(crc, 1, 0, FIELD_GET(crc_old, (1 << 4), 4) ^ FIELD_GET(data[i / 8], (1 << (7 - (i % 8))), 7 - (i % 8)));
}
return (crc & 0x1F);
}
/**
* @brief 往寄存器值写入参数,并更新获取到的SPI_STATUS状态字节
* @param address:寄存器地址
* @param value:写入的值
* @return 返回SPI状态字,如果通信成功的话
* @attention 有的寄存器仅读访问,也有寄存器可读可写,具体查 MAX22216 规格书确认
*
*/
void max22216_writeInt(uint8_t address, int16_t value)
{
uint8_t send_data[4] = {0,0,0,0};
uint8_t datagram1[4] = {0,0,0,0};
send_data[0] = address | TMC_WRITE_BIT;
send_data[1] = (value >> 8) & 0xff;
send_data[2] = value & 0xff;
if(max22216_crc_en)
send_data[3] = max22216_CRC(&send_data[0], 27);
HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET); //SPI_CS片选拉低
HAL_SPI_TransmitReceive(&hspi1, send_data, datagram1, ((max22216_crc_en) ? 4 : 3),100);
HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET); //SPI_CS片选拉高
MAX22216_Registers.SPI_STATUS.Value = datagram1[0]; //更新SPI状态字 SPI_STATUS
}
/**
* @brief 获取寄存器值并返回,并更新获取到的SPI_STATUS状态字节
* @param address:寄存器地址
* @return 返回获取到的寄存器的值
* @attention 有的寄存器仅写访问,也有寄存器可读可写,具体查 MAX22216 规格书确认
*
*/
int16_t max22216_readInt(uint8_t address)
{
uint8_t send_data[4] = {0,0,0,0};
uint8_t receive_data[4] = {0,0,0,0};
send_data[0] = address;
if(max22216_crc_en)
send_data[3] = max22216_CRC(&send_data[0], 27);
//SPI读,需要读两次。是因为每次SPI通信,返回的是前一次读或写访问返回的数据
HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, send_data, receive_data, ((max22216_crc_en) ? 4 : 3), 100);
HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET); //SPI_CS片选拉高
HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, send_data, receive_data, ((max22216_crc_en) ? 4 : 3), 100);
HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET); //SPI_CS片选拉高
MAX22216_Registers.SPI_STATUS.Value = receive_data[0]; //更新SPI状态字 SPI_STATUS
return (receive_data[1] << 8) | receive_data[2];
}
4.2、MAX22216的初始化例程
// MAX22216 的参数配置,初始化。
void max22216_init(void)
{
uint16_t current_I, current_P; // CDR 电流模式的 I 和 P 参数。电压模式不用设置。
HAL_GPIO_WritePin(GPIOB, CRC_EN_Pin, (max22216_crc_en) ? GPIO_PIN_SET : GPIO_PIN_RESET); // max22216_crc_en如果是1,则 CRC_EN引脚置高电平,否则低电平
HAL_GPIO_WritePin(GPIOB, ENABLE_Pin, GPIO_PIN_SET); // ENABLE 引脚从高电平,要延时0.8mS,芯片才能正常工作。ENABLE引脚低电平时,芯片处于休眠模式
HAL_Delay(1);
register_value = max22216_readInt(MAX22216_STATUS);
// 下面是写参数配置,参数说明看“MAX22216_Register.h”。如果有的参数只有1bit,那么可配置为“SET”或“RESET”。如果参数有2bit以上,可配置数字。
//配置 MAX22216的 GLOBAL_CFG(0x01)寄存器
MAX22216_Registers.GLOBAL_CFG.CHS = N2IFB; // 配置为2个独立全桥
MAX22216_Registers.GLOBAL_CFG.ACTIVE = SET; // 使能部件
MAX22216_Registers.GLOBAL_CFG.VDRnVDRDUTY = SET; // 不使能 VDR 模式下的VM补偿
MAX22216_Registers.GLOBAL_CFG.STAT_POL = RESET; // STAT0、STAT1 状态引脚活动时高电平
MAX22216_Registers.GLOBAL_CFG.CNTL_POL = RESET; // 引脚 CNTLx 高电平有效
MAX22216_Registers.GLOBAL_CFG.M_UVM = RESET; // 0: 开启 VM引脚的欠压锁定故障检测
MAX22216_Registers.GLOBAL_CFG.M_COMF = RESET; // 0: 开启 SPI 的通信失败故障检测
MAX22216_Registers.GLOBAL_CFG.M_DPM = RESET; // 0: 开启 DPM柱塞运动检测
MAX22216_Registers.GLOBAL_CFG.M_HHF = RESET; // 0: 开启 未达到激励电流检测
MAX22216_Registers.GLOBAL_CFG.M_OLF = RESET; // 0: 开启 负载开路检测
MAX22216_Registers.GLOBAL_CFG.M_OCP = SET; // 0: 开启 过电流保护检测
MAX22216_Registers.GLOBAL_CFG.M_OVT = RESET; // 0: 开启 过温故障检测
//配置 MAX22216的 GLOBAL_CTRL(0x00)寄存器
MAX22216_Registers.GLOBAL_CTRL.F_PWM_M = F_PWM_M_100KHz; // 设置主斩波器频率。
MAX22216_Registers.GLOBAL_CTRL.CNTL0 = RESET; // 初始化 22216前先关闭通道 0
MAX22216_Registers.GLOBAL_CTRL.CNTL1 = RESET; // 初始化 22216前先关闭通道 1
MAX22216_Registers.GLOBAL_CTRL.CNTL2 = RESET; // 初始化 22216前先关闭通道 2
MAX22216_Registers.GLOBAL_CTRL.CNTL3 = RESET; // 初始化 22216前先关闭通道 3
//配置 CFG_CTRL0 (0x0D,0x1B,0x29,0x37)寄存器
MAX22216_Registers.CFG_CTRL0[0].CTRL_MODE = Limiter_VDR; // 选择 直流电机控制模式, 可配置的参数看“CTRL_MODE”枚举变量。
MAX22216_Registers.CFG_CTRL0[0].RAMP = 0; // 设置斜坡扫描速率。可编程的电压/电流斜坡(RAMP)使阀门的启动/关闭更加平稳,从而降低了噪音。
MAX22216_Registers.CFG_CTRL0[0].RUPE = RESET; // 不启动斜坡上升阶段
MAX22216_Registers.CFG_CTRL0[0].RMDE = RESET;
MAX22216_Registers.CFG_CTRL0[0].RDWE = RESET;
MAX22216_Registers.CFG_CTRL0[0].H2L_EN = RESET;
MAX22216_Registers.CFG_CTRL0[0].OL_EN = SET;
MAX22216_Registers.CFG_CTRL0[0].HHF_EN = SET;
//配置 CFG_CTRL1 (0x0E,0x1C,0x2A,0x38)寄存器
MAX22216_Registers.CFG_CTRL1[0].HSnLS = RESET; // 0: 配置为低压侧驱动; 1: 配置为高压侧驱动
MAX22216_Registers.CFG_CTRL1[0].F_PWM = F_PWM_1; // 设置通道的时钟分频,这里设置 1 分频
MAX22216_Registers.CFG_CTRL1[0].SNSF = SNSF_1; // 改变会影响电流的计算。
MAX22216_Registers.CFG_CTRL1[0].GAIN = GAIN_1; // 改变会影响电流的计算。
MAX22216_Registers.CFG_CTRL1[0].SLEW_RATE = 0;
MAX22216_Registers.CFG_CTRL1[0].T_BLANKING = 0;
// CDR 电流模式的 I 和 P 参数。电压模式不用设置。
current_P = 100; // 数值范围 0...65535。
current_I = 40; // 数值范围 0...65535。
// 用 SPI 配置 22216 芯片的两个全局参数寄存器
max22216_writeInt(MAX22216_GLOBAL_CFG, MAX22216_Registers.GLOBAL_CFG.Value); //配置 MAX22216的 GLOBAL_CFG( 0x01)寄存器
MAX22216_FIELD_WRITE(MAX22216_FAULT1, MAX22216_UVM_FAULT1_MASK, MAX22216_UVM_FAULT1_SHIFT, SET); // 激活后,清除UVM标志,FAULT1(0x66)寄存器的bit4写 '1' 清除
register_value = max22216_readInt(MAX22216_STATUS); // 检查 MAX22216_STATUS 寄存器的 UVM 标志有没请0,也就是 bit1。
max22216_writeInt(MAX22216_GLOBAL_CTRL, MAX22216_Registers.GLOBAL_CTRL.Value); //配置 MAX22216的 GLOBAL_CTRL(0x00)寄存器
// 配置4个通道的 CFG_CTRL0(ch) 寄存器。这里把 4 个通道配置成一样
max22216_writeInt(MAX22216_CFG_CTRL0( Channel_0 ), MAX22216_Registers.CFG_CTRL0[0].Value); //配置 MAX22216的 CFG_CTRL0(0x0D)寄存器
max22216_writeInt(MAX22216_CFG_CTRL0( Channel_1 ), MAX22216_Registers.CFG_CTRL0[0].Value);
max22216_writeInt(MAX22216_CFG_CTRL0( Channel_2 ), MAX22216_Registers.CFG_CTRL0[0].Value);
max22216_writeInt(MAX22216_CFG_CTRL0( Channel_3 ), MAX22216_Registers.CFG_CTRL0[0].Value);
// 配置4个通道的 CFG_CTRL1(ch) 寄存器。这里把 4 个通道配置成一样
max22216_writeInt(MAX22216_CFG_CTRL1( Channel_0 ), MAX22216_Registers.CFG_CTRL1[0].Value); //配置 MAX22216的 CFG_CTRL1(0x0E)寄存器
max22216_writeInt(MAX22216_CFG_CTRL1( Channel_1 ), MAX22216_Registers.CFG_CTRL1[0].Value);
max22216_writeInt(MAX22216_CFG_CTRL1( Channel_2 ), MAX22216_Registers.CFG_CTRL1[0].Value);
max22216_writeInt(MAX22216_CFG_CTRL1( Channel_3 ), MAX22216_Registers.CFG_CTRL1[0].Value);
#if 0 // 如果是 CDR 电流模式,则需要配置 P 和 I 参数。 电流或电压控制模式的选择,是在 MAX22216_Registers.CFG_CTRL0[ch]寄存器的CTRL_MODE参数设置。
// 配置4个通道的 PI 参数中的 P 参数寄存器。这里把 4 个通道配置成一样。仅 CDR 电流模式有效
max22216_writeInt(MAX22216_CFG_I( Channel_0 ) , current_P);
max22216_writeInt(MAX22216_CFG_P( Channel_1 ), current_P);
max22216_writeInt(MAX22216_CFG_P( Channel_2 ), current_P);
max22216_writeInt(MAX22216_CFG_P( Channel_3 ), current_P);
// 配置4个通道的 PI 参数中的 I 参数寄存器。这里把 4 个通道配置成一样。仅 CDR 电流模式有效
max22216_writeInt(MAX22216_CFG_I( Channel_0 ) , current_I);
max22216_writeInt(MAX22216_CFG_I( Channel_1 ), current_I);
max22216_writeInt(MAX22216_CFG_I( Channel_2 ), current_I);
max22216_writeInt(MAX22216_CFG_I( Channel_3 ), current_I);
#endif
}
4.3、对通道的操作
/**
* @brief 配置单个通道的 激励水平(电压或电流),和保持水平(电压或电流)
* @param ch: 选择通道,Channel_0,,,3。
* @param DC_L2H:配置通道的激励水平(电压或电流)。数值范围 0...65535。
* @param DC_H: 配置通道的保持水平(电压或电流)。数值范围 0...65535。
* @return 无
* @attention 参数计算可看压缩包里的《MAX22216的相关计算》表格。分电压模式和电流模式
* 电压模式 DC_L2H 是电压(V), DC_H 是电压(V), DC_L 是电压(V), DC_H2L 是电压(V);
* 电流模式 DC_L2H 是电流(mA), DC_H 是电流(mA), DC_L 是电流(mA), DC_H2L 是电压(V);
* 直流电机控制模式 DC_L2H 是电流(mA), DC_H 是电压(V), DC_L 是电压(V), DC_H2L 是电压(V);
* 电压电流混合模式 DC_L2H 是电压(V), DC_H 是电流(mA), DC_L 是电流(mA), DC_H2L 是电压(V);
*
*/
void max22216_Single_Ended_Operation(uint8_t ch, uint16_t DC_L2H, uint16_t DC_H)
{
max22216_writeInt(MAX22216_CFG_DC_L2H( ch ) , DC_L2H); // 配置通道的 激励水平,影响通道刚打开时的扭矩和功率。
max22216_writeInt(MAX22216_CFG_DC_H( ch ) , DC_H); // 配置通道的 保持水平,影响通道 保持时的扭矩和功率。
max22216_writeInt(MAX22216_CFG_L2H_TIME( ch ), 10); // 配置通道的 激励时间。这里可以按照需求实际修改。
#if 0 // 如果需要通道的快速退磁,则把这里置 1。如果启动快速退磁,22216会在结束时打开一个方向电压。
max22216_writeInt(MAX22216_DC_H2L, 50);
MAX22216_FIELD_WRITE(MAX22216_CFG_CTRL0( ch ), MAX22216_H2L_EN_MASK, MAX22216_H2L_EN_SHIFT, SET);
#else
MAX22216_FIELD_WRITE(MAX22216_CFG_CTRL0( ch ), MAX22216_H2L_EN_MASK, MAX22216_H2L_EN_SHIFT, RESET);
#endif
// 通过 SPI 配置寄存器方式,控制通道[ch] 的开和关。
// 控制通道[ch] 的开和关,其实也可以用 22216 的 CNTL0...3几个引脚,本例程没使用这种方式。
// 可以在程序需要的地方,控制通道的开启和关闭,写在这里是做个例子。
// MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL, MAX22216_CNTL0_MASK, MAX22216_CNTL0_SHIFT, SET); // 控制通道 0 的开启
// MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL, MAX22216_CNTL0_MASK, MAX22216_CNTL0_SHIFT, RESET); // 控制通道 0 的关闭
// 又例如控制通道 1 的开启和关闭
// MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL, MAX22216_CNTL1_MASK, MAX22216_CNTL1_SHIFT, SET); // 控制通道 1 的开启
// MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL, MAX22216_CNTL1_MASK, MAX22216_CNTL1_SHIFT, RESET); // 控制通道 1 的关闭
}
4.4、一些定义
// Autogenerated C header for registers in MAX22216
// Generator version: 1.0
#ifndef MAX22216_REGISTERS
#define MAX22216_REGISTERS
#include "stdint.h"
#define Offset_ADDR(m) (0x0E * m)
#define Offset_ADDR_2(m) (0x09 * m)
#define MAX22216_GLOBAL_CTRL 0x00
#define MAX22216_GLOBAL_CFG 0x01
#define MAX22216_STATUS 0x02
#define MAX22216_STATUS_CFG 0x03
#define MAX22216_DC_H2L 0x04
#define MAX22216_ADC_VM_MEASUREMENT 0x05
#define MAX22216_VM_THRESHOLD 0x06
#define MAX22216_F_AC 0x07
#define MAX22216_U_AC_SCAN 0x08
// ch = 0 ch = 1 ch = 2 ch = 3
#define MAX22216_CFG_DC_L2H(ch) (0x09 + Offset_ADDR(ch)) // 0x09 0x17 0x25 0x33
#define MAX22216_CFG_DC_H(ch) (0x0A + Offset_ADDR(ch)) // 0x0A 0x18 0x26 0x34
#define MAX22216_CFG_DC_L(ch) (0x0B + Offset_ADDR(ch)) // 0x0B 0x19 0x27 0x35
#define MAX22216_CFG_L2H_TIME(ch) (0x0C + Offset_ADDR(ch)) // 0x0C 0x1A 0x28 0x36
#define MAX22216_CFG_CTRL0(ch) (0x0D + Offset_ADDR(ch)) // 0x0D 0x1B 0x29 0x37
#define MAX22216_CFG_CTRL1(ch) (0x0E + Offset_ADDR(ch)) // 0x0E 0x1C 0x2A 0x38
#define MAX22216_CFG_DPM0(ch) (0x0F + Offset_ADDR(ch)) // 0x0F 0x1D 0x2B 0x39
#define MAX22216_CFG_DPM1(ch) (0x10 + Offset_ADDR(ch)) // 0x10 0x1E 0x2C 0x3A
#define MAX22216_CFG_DC(ch) (0x11 + Offset_ADDR(ch)) // 0x11 0x1F 0x2D 0x3B
#define MAX22216_CFG_R_THLD(ch) (0x12 + Offset_ADDR(ch)) // 0x12 0x20 0x2E 0x3C
#define MAX22216_CFG_IND(ch) (0x13 + Offset_ADDR(ch)) // 0x13 0x21 0x2F 0x3D
#define MAX22216_CFG_IND_1(ch) (0x14 + Offset_ADDR(ch)) // 0x14 0x22 0x30 0x3E
#define MAX22216_CFG_P(ch) (0x15 + Offset_ADDR(ch)) // 0x15 0x23 0x31 0x3F
#define MAX22216_CFG_I(ch) (0x16 + Offset_ADDR(ch)) // 0x16 0x24 0x32 0x40
#define MAX22216_I_DPM_PEAK(ch) (0x41 + Offset_ADDR_2(ch)) // 0x41 0x4A 0x53 0x5C
#define MAX22216_I_DPM_VALLEY(ch) (0x42 + Offset_ADDR_2(ch)) // 0x42 0x4B 0x54 0x5D
#define MAX22216_TRAVEL_TIME(ch) (0x43 + Offset_ADDR_2(ch)) // 0x43 0x4C 0x55 0x5E
#define MAX22216_REACTION_TIME(ch) (0x44 + Offset_ADDR_2(ch)) // 0x44 0x4D 0x56 0x5F
#define MAX22216_I_MONITOR(ch) (0x45 + Offset_ADDR_2(ch)) // 0x45 0x4E 0x57 0x60
#define MAX22216_I_DC(ch) (0x46 + Offset_ADDR_2(ch)) // 0x46 0x4F 0x58 0x61
#define MAX22216_I_IND_AC(ch) (0x47 + Offset_ADDR_2(ch)) // 0x47 0x50 0x59 0x62
#define MAX22216_R(ch) (0x48 + Offset_ADDR_2(ch)) // 0x48 0x51 0x5A 0x63
#define MAX22216_PWM_DUTY(ch) (0x49 + Offset_ADDR_2(ch)) // 0x49 0x52 0x5B 0x64
#define MAX22216_FAULT0 0x65
#define MAX22216_FAULT1 0x66
#define MAX22216_OTP_CONTROL 0x68
#define MAX22216_OTP_STATUS 0x69
#define MAX22216_OTP_DATA0 0x7A
#define MAX22216_OTP_DATA1 0x7B
#define MAX22216_OTP_ADDR 0x7C
#pragma anon_unions
//SPI只要通信成功,都有数据返回,包括返回SPI_STATUS状态字节
typedef union // 用来描述SPI_STATUS的数据字
{
uint8_t Value;
struct // 用来描述控制寄存器的数据字
{
// 低位在前,高位在后
uint8_t STAT0 : 1; //
uint8_t STAT1 : 1; //
uint8_t DPM : 1; // 1: 柱塞移动故障
uint8_t UVM : 1; // 1: 说明 VM引脚欠电压锁定故障
uint8_t COMER : 1; // 1: CRC校检错误故障。 如果检测到 CRC错误,芯片不会更改配置。相反,MAX22216/MAX22217 会将下一次 SPI 传输的状态字节的 COMER 位设置为高电平。
uint8_t OLF : 1; // 1: 通道关闭期间开路负载 指示
uint8_t OCP : 1; // 1: 说明过电流保护
uint8_t OVT : 1; // 1: 说明过温保护
};
}__SPI_STATUS;
typedef union // 用来描述 GLOBAL_CTRL(0x00) 的数据字
{
uint16_t Value;
struct
{
// 低位在前,高位在后
uint8_t CNTL0 : 1; // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
uint8_t CNTL1 : 1; // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
uint8_t CNTL2 : 1; // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
uint8_t CNTL3 : 1; // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
uint8_t F_PWM_M : 4; // 配置主斩波器频率。
uint8_t reserved : 8; // 保留位,保持0
};
}__GLOBAL_CTRL;
typedef union // 用来描述 GLOBAL_CFG(0x01) 的数据字
{
uint16_t Value;
struct
{
// 低位在前,高位在后
uint8_t CHS : 4; // 选择半桥和全桥各多少个,详细看 CHS_type
uint8_t VDRnVDRDUTY : 1; // 1:VM补偿开启; 0: VM补偿关闭。只能在VDR模式设置,在CDR模式下无效。
uint8_t reserved : 1; // 保留位,保持0
uint8_t STAT_POL : 1; // 配置状态引脚的极性。 1:STAT0、STAT1 状态引脚活动时低电平; 0: STAT0、STAT1 状态引脚活动时高电平
uint8_t CNTL_POL : 1; // 控制引脚的极性。 1:引脚CNTLx低电平有效 0:引脚CNTLx高电平有效;
uint8_t M_UVM : 1; // 1: 屏蔽 VM引脚的欠压锁定故障检测; 0: 开启 VM引脚的欠压锁定故障检测
uint8_t M_COMF : 1; // 1: 屏蔽 SPI 的通信失败故障检测; 0: 开启 SPI 的通信失败故障检测
uint8_t M_DPM : 1; // 1: 屏蔽 DPM柱塞运动检测; 0: 开启 DPM柱塞运动检测
uint8_t M_HHF : 1; // 1: 屏蔽 未达到激励电流检测; 0: 开启 未达到激励电流检测
uint8_t M_OLF : 1; // 1: 屏蔽 负载开路检测; 0: 开启 负载开路检测
uint8_t M_OCP : 1; // 1: 屏蔽 过电流保护检测; 0: 开启 过电流保护检测
uint8_t M_OVT : 1; // 1: 屏蔽 过温故障检测; 0: 开启 过温故障检测
uint8_t ACTIVE : 1; // 激活位 1:使能器件; 0:禁用器件,启用低功耗模式;
};
}__GLOBAL_CFG;
typedef union // 用来描述 CFG_CTRL0 (0x0D,0x1B,0x29,0x37) 的数据字
{
uint16_t Value;
struct
{
// 低位在前,高位在后
uint8_t RAMP : 8; // 设置斜坡扫描速率。可编程的电压/电流斜坡(RAMP)使阀门的启动/关闭更加平稳,从而降低了噪音。
uint8_t RUPE : 1; // 启用斜坡上升
uint8_t RMDE : 1; // 斜坡中间使能位
uint8_t RDWE : 1; // 斜坡下降使能位
uint8_t H2L_EN : 1; // 1: H2L快速退磁使能位
uint8_t OL_EN : 1; // 1: 开路负载电路使能(使能上拉/下拉)
uint8_t HHF_EN : 1; // 1:启用电流未达故障检测
uint8_t CTRL_MODE : 2; // 0: 电压控制; 1: 电流控制; 2: 限制电压(驱动直流电机); 3: 电压和电流控制
};
}__CFG_CTRL0;
typedef union // 用来描述 CFG_CTRL1 (0x0E,0x1C,0x2A,0x38) 的数据字
{
uint16_t Value;
struct
{
// 低位在前,高位在后
uint8_t SNSF : 2; // 设置感应缩放因子。会影响电流的计算。
uint8_t GAIN : 2; // 为电流驱动器调节 (CDR) 设置数字增益。会影响电流的计算。
uint8_t SLEW_RATE : 2; // SRC[1:0]: 回转速率控制位。(当 F_PWM > 50kHz 时,"10"、"11 "被抑制)。
uint8_t T_BLANKING : 2; // 定义当前测量的额外消隐时间。
uint8_t F_PWM : 2; // 定义通道使用的 PWM 频率。
uint8_t HSnLS : 1; // 0: 配置为低压侧驱动; 1: 配置为高压侧驱动
};
}__CFG_CTRL1;
typedef union // 用来描述 CFG_DPM1(0x10,0x1E,0x2C,0x3A) 的数据字
{
uint16_t Value;
struct
{
// 低位在前,高位在后
uint8_t DPM_START : 8; // 一旦实际电流超过 DPM_START*8,检测即开始。
uint8_t DPM_MIN_NBR : 4; // 要检测到有效的 BEMF 跌落,必须至少在 DPM_MIN_NBR*2 个连续 PWM 周期内满足该条件。
uint8_t END_HIT_AUTO : 1; //
uint8_t END_HIT_TO_HIZ_AUTO : 1; //
uint8_t DPM_EN : 1; //
};
}__CFG_DPM1;
typedef struct
{
__SPI_STATUS SPI_STATUS;
__GLOBAL_CTRL GLOBAL_CTRL;
__GLOBAL_CFG GLOBAL_CFG;
__CFG_CTRL0 CFG_CTRL0[4];
__CFG_CTRL1 CFG_CTRL1[4];
__CFG_DPM1 CFG_DPM1[4];
}__MAX22216;
extern __MAX22216 MAX22216_Registers;
#endif
5、写在最后
如果需要完整工程,联系深圳市智联微电子有限公司获取,网址TRINAMIC,步进电机驱动,精密运动控制-深圳市智联微电子有限公司
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

带CRC校验的SPI通信时序
所有评论(0)