
手册解析文章参考AD5422的使用(控制输出不同范围的电压电流值)-CSDN博客目录AD5422一、AD5422简介二、AD5422的使用1.写数据2.读数据3.AD5422操作流程1操作复位寄存器2操作控制寄存器进行初始化。3操作数据寄存器 控制输出电流值初始化配置的时候讲数据寄存器清零(4)读取寄存器写入值(5)总体代码调用AD5422一、AD5422简介AD5422是低成本、精密、完全集成、12/16位数模转换器(DAC)内置可编程电流源和可编程电压输出。输出电流范围可编程设置为4 mA至20 mA、0 mA至20 mA或者超量程的0 mA至24 mA。电压输出由一个独立引脚提供该引脚可配置成提供0 V至5 V、0 V至10 V、±5 V或±10 V输出范围所有范围均提供10%的超量程。含有一个异步清零引脚(CLEAR)它可将输出设置为零电平/中间电平电压输出或将输出设置为选定电流范围的低端。灵活的串行接口为SPI和MICROWIRE兼容型可以采用三线式模式工作从而极大地降低隔离应用的数字隔离要求。简言之就是可以控制输出不同的电流和电压以匹配我们的需求。可应用于在检测到不同信号时调整不同输出。二、AD5422的使用AD5422通过一个多功能三线式串行接口受控该接口以最高30 MHz的时钟速率工作与SPI、QSPI™、MICROW-IRE和DSP标准兼容。本文AD5422的使用主要通过SPI进行数据的读写传输。而后在不同寄存器中写值来完成不通的操作。也可通过读数据来获取寄存器中写入的值。书写代码时最重要的就是写数据和读数据的操作。1.写数据下图为写入数据的时序图输入移位寄存器为24位宽。数据在串行时钟输入SCLK的控 制下首先作为24位字载入器件MSB中。数据在SCLK的上升 沿逐个输入。输入寄存器包括8个地址位和16个数据位 如表7所示。该24位字在LATCH引脚的上升沿无条件锁存。 数据继续逐个输入与LATCH的状态无关。在LATCH的 上升沿锁存输入寄存器中存在的数据换言之要在 LATCH的上升沿之前逐个输入的最后24位是锁存的数据。写入时序图给出了这种操作的时序图。上述的话通俗来讲意思就是在 LATCH 引脚上升沿之前把完整 24 位数据移入 24 位输入移位寄存器LATCH 上升沿到来时会锁存此刻移位寄存器内的全部数据更新硬件输出端口并保持稳定。匹配上面时序图可以书写写数据的代码void Func_AD5422SpiTx(STR_GpioStruct *pCs, STR_SpiStruct *pSpi, uint8_t nRegister, uint16_t wData) // AD5422 { uint8_t nData[3] {0}; nData[0] nRegister; //寄存器地址 nData[1] wData 8;//高八位数据 nData[2] wData; //低八位数据 Gpio_setPinStatus(pCs, PIN_SET_LOW);//拉点LATCH引脚 while(pSpi-pxDriver-GetStatus().busy 1) {}//等待SPI通信开始 pSpi-pxDriver-Send(nData, 3);//提供24个SCLK 传输数据 while(pSpi-pxDriver-GetStatus().busy 1) {}//等待SPI通信结束 Gpio_setPinStatus(pCs, PIN_SET_HIGH);//锁存数据 osDelay(1); }写入操作Func_AD5422SpiTx(pCs, pSpi, 0x01, wRet);//wRet为需要SPI传输的码值0x01为数据寄存器说明0X01为数据寄存器wRet为SPI传输的码值。2.读数据下图为回读数据的时序图回读操作通过在写入输入寄存器时设置地址字节0x02和读取地址0x01(见表9 和表11)可调用回读模式。接下来写入AD5412/AD5422的应 该是一个NOP命令该命令从先前寻址的寄存器逐个输出 数据如图3所示。寻址AD5412/AD5422进行读取操作之后SDO引脚默认禁 用LATCH的上升沿使能SDO引脚预测逐个输出的数据。 数据在SDO上逐个输出后LATCH的上升沿禁用(三态) SDO引脚。例如要读回数据寄存器实施如下序列1.将0x020001写入输入寄存器。这采用选定数据寄存器配置用于读取模式的器件。2.然后进行第二次写入一个NOP条件即0x000000。在此写入期间来自寄存器的数据在SDO线路上逐个输出。匹配上面时序图可以书写写数据的代码uint16_t Func_AD5422Read(STR_GpioStruct *pCs, STR_SpiStruct *pSpi, uint8_t nRegister, uint16_t wData) // AD5422 { uint8_t nData[3] {0}; uint16_t nRback 0;; uint8_t nRead_Data[3] {0}; nData[0] nRegister;//0x02 nData[1] wData 8; nData[2] wData;//0x0001 Gpio_setPinStatus(pCs, PIN_SET_LOW); while(pSpi-pxDriver-GetStatus().busy 1) {} pSpi-pxDriver-Send(nData, 3);//发送0X020001指令 while(pSpi-pxDriver-GetStatus().busy 1) {} Gpio_setPinStatus(pCs, PIN_SET_HIGH); osDelay(1); Gpio_setPinStatus(pCs, PIN_SET_LOW); while(pSpi-pxDriver-GetStatus().busy 1) {} pSpi-pxDriver-Receive(nRead_Data, 3);//接收的时候底层会自己发送NOP哑数据 while(pSpi-pxDriver-GetStatus().busy 1) {} Gpio_setPinStatus(pCs, PIN_SET_HIGH); nRback (nRead_Data[1] 8) nRead_Data[2];//拼接回传的U16数据 return nRback; }回读操作Func_AD5422Read(pCs, pSpi, 0x02, 0x0001);0x02是回读寄存器0x0001是数据寄存器拼接起来即0x020001之后RECEIVE函数接收的时候回自己发送NOP哑指令。3.AD5422操作流程1.操作复位2.初始化配置控制寄存器3.在数据寄存器中写入值控制输出电流4.可以读取寄存器的值判断数据是否正确写入例如读取状态寄存器检测故障下图是操作流程图 1操作复位寄存器由图可知复位只需向复位寄存器的地址0x56中的D0位写入1即可完成复位操作直接调用我们的Func_AD5422SpiTx函数(函数原型在上文写操作)代码如下Func_AD5422SpiTx(pCs, pSpi, 0x56, 0x0001);2操作控制寄存器进行初始化。控制寄存器通过将输入移位寄存器的地址字设置为0x55寻址。要写入控制寄存器的数据输入D15至D0位置中如表14所示。控制寄存器功能如表15所示。这个要根据工程所使用的参数来填入相对应的数据这里我写的数据仅以我工程中的配置举例。Func_AD5422SpiTx(pCs, pSpi, 0x55, 0x31B1);参数解析0x31B1转成二进制数为0011 0001 1011 0001对应上图中置位了REXT OUTEN SR时钟 SR跳跃 SREN DCEN输出范围是0-10V电压3操作数据寄存器 控制输出电流值初始化配置的时候讲数据寄存器清零数据寄存器通过将输入移位寄存器的地址字设置为0x01寻址。对于AD5412要写入至数据寄存器的数据输入D15至D4位置中而对于AD5422输入D15至D0位置。数据寄存器写入的值匹配输出的电压或是电流存在一个计算公式如下电压输出对以下公式进行变换求出我们需要的D也就是我们给到数据寄存器的值。其中DAC分辨率为16。VREFIN一般要求输入5V。REFOUT输出5V一般直接连接到REFIN。电流输出电流输出同上计算出我们需要的D值。其中DAC分辨率为16。Func_AD5422SpiTx(pCs, pSpi, 0x01, 0);(4)读取寄存器写入值例如读状态寄存器读寄存器类似不再说明。直接调用上述回读函数Func_AD5422Read读0x02回读寄存器中的以下指令即可0x0000 状态寄存器0x0001 数据寄存器0x0010 控制寄存器(5)总体代码调用1.复位2.初始化配置例如电压、电流输出范围。3.根据要输出的电流值转换成给到AD5422的值,配置数据寄存器从而输出电流。4.根据需要选择读取寄存器检测故障等。初始化代码如下void Func_AD5422_RegisterInit(STR_GpioStruct *pCs, STR_SpiStruct *pSpi, uint8_t nMode) { Func_AD5422SpiTx(pCs, pSpi, 0x56, 0x0001); osDelay(1); Func_AD5422SpiTx(pCs, pSpi, 0x55, 0x31B1); osDelay(1); Func_AD5422SpiTx(pCs, pSpi, 0x01, 0); }手册部分大部分文字描述转载开头博客供个人理解学习参考