stm32cubeMX:基于stm32的高速DAC—AD5440

it2022-05-05  300

平台:stm32f103rct6,stm32cubemx,keil5


1.概述

AD5428/AD5440/AD54471分别是CMOS、8/10/12位、双通道、电流输出数模转换器(DAC),这些器件均采用2.5 V至5.5 V电源供电。带宽最高可达10M,且具有回读功能,即用户可以通过DB引脚读取DAC寄存器的内容。满量程输出电流由所施加的外部基准输入电压(VREF)决定,与外部电流至电压精密放大器(本例使用的是AD8065)配合使用时,集成的反馈电阻(RFB)可提供温度跟踪和满量程电压输出。

1.1 AD5440

供电电源:2.5—5.5V 参考电压:±10V (本例给的是10V)

AD5440是一个10位的ADC, R_FB B与R_FB A接反馈电阻,DACA/B端口则根据接入电平的高低来进行A/B两个通道的选择,CS是控制端口,低电平有效,R/W是写入和回读的控制线。

利用控制线CS和R/W,可以写入或读取DAC寄存器。拉低CS和R/W时,发生写事件,数据线上的数据填入移位寄存器,CS上升沿锁存数据,并将锁存的数据字传输到DAC寄存器。DAC锁存器不是透明的,因此写序列必须包含CS的下降沿和上升沿,确保数据载入DAC寄存器,且其模拟等效内容反映在DAC输出端。

R/W为高电平而CS为低电平时,发生回读事件。数据从DAC寄存器加载,返回输入寄存器,输出到数据线上,控制器可回读以用于验证或诊断目的。这些器件的输入和DAC寄存器不是透明的,因此,加载各数据字需要CS的下降沿和上升沿。

2 硬件电路

根据数据手册上的参考电路,本例选择的是单极性模式   其中,电流至电压放大器使用的是AD8065,C1和C2选择容值在1pF到2pF之间的电容,R1,R2,R3,R4用来调节增益的,本例中直接将电阻短接,即只进行电流—电压转换,不进行放大。

3 软件部分

3.1 计算

单极性模式输出电压的换算公式:                 其中,Vout为10V,n为10,D则是输入的10位二进制数。   例如:DB输入:1111111111,则Vout即为-10V

3.2 时序

  本例中只需要从stm32中向AD5440写入数据,无需回读,因此只使用了写模式,即R/W置低,CS置低。传输完成则将CS置高,时序图中,时间间隔为纳秒级别的,在stm32F1的环境中,基本忽略。 下面是关键代码:

void DataOutStage_2(uint16_t value) { value=value&0X03FF; //value is data of 10bit if(value&0X0001) HAL_GPIO_WritePin(DB0_2_GPIO_Port, DB0_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB0_2_GPIO_Port, DB0_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0002) HAL_GPIO_WritePin(DB1_2_GPIO_Port, DB1_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB1_2_GPIO_Port, DB1_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0004) HAL_GPIO_WritePin(DB2_2_GPIO_Port, DB2_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB2_2_GPIO_Port, DB2_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0008) HAL_GPIO_WritePin(DB3_2_GPIO_Port, DB3_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB3_2_GPIO_Port, DB3_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0010) HAL_GPIO_WritePin(DB4_2_GPIO_Port, DB4_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB4_2_GPIO_Port, DB4_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0020) HAL_GPIO_WritePin(DB5_2_GPIO_Port, DB5_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB5_2_GPIO_Port, DB5_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0040) HAL_GPIO_WritePin(DB6_2_GPIO_Port, DB6_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB6_2_GPIO_Port, DB6_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0080) HAL_GPIO_WritePin(DB7_2_GPIO_Port, DB7_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB7_2_GPIO_Port, DB7_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0100) HAL_GPIO_WritePin(DB8_2_GPIO_Port, DB8_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB8_2_GPIO_Port, DB8_2_Pin, GPIO_PIN_RESET); //DATA_LOW; if(value&0X0200) HAL_GPIO_WritePin(DB9_2_GPIO_Port, DB9_2_Pin, GPIO_PIN_SET); // DATA_HIGH; else HAL_GPIO_WritePin(DB9_2_GPIO_Port, DB9_2_Pin, GPIO_PIN_RESET); //DATA_LOW; } void WriteValuestage_2(uint8_t channel ,uint16_t data) { HAL_GPIO_WritePin(R_W_2_GPIO_Port, R_W_2_Pin, GPIO_PIN_RESET); // R_W_HIGH Read data; R_W_HIGH Write data HAL_Delay(1); HAL_GPIO_WritePin(CS_2_GPIO_Port, CS_2_Pin, GPIO_PIN_RESET); // CS_LOW Start transmiting data; CS_high stop; HAL_Delay(1); DataOutStage_2(data); if(channel==1) HAL_GPIO_WritePin(A_B_2_GPIO_Port, A_B_2_Pin, GPIO_PIN_RESET); //start A_channel ,LOW_A, High_B else HAL_GPIO_WritePin(A_B_2_GPIO_Port, A_B_2_Pin, GPIO_PIN_SET); // start B_channel ,LOW_A, High_B HAL_Delay(1); //delay 1us HAL_GPIO_WritePin(CS_2_GPIO_Port, CS_2_Pin, GPIO_PIN_SET); //finish; }

4 操作

  除了开启STM32的时钟等一些基本功能之外,对于AD5440的配置,只需要配置芯片所需要的GPIO为输出模式就行,如上图所示。 附上代码链接:基于stm32的高速DAC—AD5440


最新回复(0)