ADN8810总结
1.简介
ADN8810是高精度12位电流源低噪声长期稳定电流输出从0ma到300ma输出故障指示低漂移可编程最大电流24引脚,4mm × 4mm LFCSP 3线串行接口。
2.引脚说明
ADN8810的SB引脚可以主动控制是否需要输出电流,在高电平的时候输出电流。
3.通讯格式与时序
需要注意的是A3必须是逻辑低电平,数据传输时RSET始终应保持逻辑高,只有需要复位时,将其拉低40ns以上再拉高即可复位数据寄存器输出0ma。
4.实例
由于时序比较简单,官方并未给出对应的驱动程序,本人使用STM32平台HAL库完成该芯片的驱动。
#ifndef __ADN8810_H
#define __ADN8810_H
/*
Io = Code*(Vref/4096)*(1/Rsn)*(Rsn/150000+0.1)
*/
#define CS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
#define CS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
//#define SCLK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
//#define SCLK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
//#define SDI_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)
//#define SDI_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define RESET_H HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET)
#define RESET_L HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET)
#define SB_H HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
#define SB_L HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);
#include "main.h"
#define VREF 4.096 //单位V
#define RSN 1.63 //单位Ω
#define KI RSN*61440/((RSN+1500)*VREF) // mA
//#define
extern SPI_HandleTypeDef hspi1;
void ADN8810_OUT_Current(uint8_t ADDR,double Current);
void delay100ns(void);
void ADN8810_Write(uint8_t ADDR, uint16_t DACdata);
typedef enum{
ADN8810_ADDR0 = 0x00,
}ADN8810_ADDR;
typedef struct{
char Info[20];
ADN8810_ADDR ADDR;
double Current_Target;
double Currenr_Measure;
}ADN8810;
#endif
#include "ADN8810.h"
void delay100ns(void)
{
__NOP();__NOP();__NOP();__NOP;__NOP();__NOP();__NOP();__NOP();
}
void ADN8810_Write(uint8_t ADDR, uint16_t DACdata)
{
uint16_t SendValue;
DACdata &=0x0fff;//高四位清0
SendValue = ADDR;
SendValue = SendValue <<12;//ADDR左移12位到SendValue的高四位
SendValue = SendValue + DACdata;
CS_L;
//开始传输数据
HAL_SPI_Transmit(&hspi1,(uint8_t *)&SendValue,1,10);
HAL_Delay(10);
//拉高CS
CS_H;
}
void ADN8810_OUT_Current(uint8_t ADDR,double Current)
{
uint32_t DATA0;
DATA0 = (Current*KI);
if(DATA0>=0x0fff)
{
DATA0 = 0x0fff;
}
ADN8810_Write(ADDR,DATA0);
}
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI1_Init();
/* USER CODE BEGIN 2 */
CS_H;
RESET_H;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
CACurren=(int)(100/300.0*4095);
ADN8810_Write(0x00,CACurren);
//SB_H; //SB在硬件设计上已经拉高了,所以这里不使用
HAL_Delay(1000);
}
/* USER CODE END 3 */
}