stm32cubeMX:基于stm32的高速DAC—AD5440

平台: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

stm32cubeMX:基于stm32的高速DAC—AD5440_第1张图片
供电电源: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 硬件电路

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

3 软件部分

3.1 计算

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

3.2 时序

stm32cubeMX:基于stm32的高速DAC—AD5440_第4张图片
  本例中只需要从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 操作

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

你可能感兴趣的:(stm32)