手册解析文章参考: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.写数据
下图为写入数据的时序图:
上述的话,通俗来讲,意思就是:在 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.读数据
下图为回读数据的时序图:
匹配上面时序图可以书写写数据的代码:
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); }手册部分大部分文字描述转载开头博客,供个人理解学习参考