AD8226+AD5293

本文介绍了通过STM32F103R6微控制器和SPI接口控制AD5293数字电位器,调节AD8226仪表放大器的增益。电路设计包括SPI初始化、AD5293的配置和操作,以及结果验证,显示了1.47V的输出,实现了4.9倍的放大效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将介绍一款差分放大电路,通过使用数字电位器来调节电路的放大倍数。

1 芯片知识

AD8226 是一款低成本、宽电源电压范围的仪表放大器,仅需一个外部电阻器即可设置 1 至 1000 之间任何增益。AD8226 可支持多种信号电压。宽输入范围和轨到轨输出允许信号充分利用电源轨。由于输入范围还包括低于负电源电压的能力,因此无需双电源即可放大接近地电压的小信号。AD8226 可采用 ±1.35 V 至 ±18 V 的双电源供电,或采用 2.2 V 至 36 V 的单电源供电。

 AD5293是一款单通道、1024位数字电位计1 ,端到端电阻容差<1%。该器件可实现与机械电位计相同的电子调整功能,而且具有增强的分辨率、固态可靠性和出色的低温度系数性能。它可在高电压下工作,既可采用±10.5 V至±15 V双电源供电,也可采用21 V至33 V单电源供电。MCU通过SPI方式与其通信。

2. 电路连接

 

本项目使用的MCU芯片为STM32F103R6(用于proteus仿真),MCU通过spi方式与AD5293连接,使用了PA3,PA4,PA5,PA6,PA7引脚,其中PA3用于片选,PA4引脚设为模拟输入,连接到AD5293的RDY引脚,用于监测数据写入是否完成(此功能可不使用)。

电路连接如下图所示:

 3. 代码部分

本项目的代码开发使用Keil 5软件,生成kex文件后,拷入到Proteus中。

首先是SPI的初始化代码,使用的是SPI1,代码参考正点原子。

void SPI1_Init(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能 
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_SPI1,  ENABLE );//SPI1时钟使能 	
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB5/6/7复用推挽输出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOB

 	GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);  //PB5/6/7上拉

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		//串行同步时钟的空闲状态为低电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
	SPI_Cmd(SPI1, ENABLE); //使能SPI外设
	
	SPI1_ReadWriteByte(0xff);//启动传输		 
 

}   

void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
	SPI1->CR1&=0XFFC7;
	SPI1->CR1|=SPI_BaudRatePrescaler;	//设置SPI1速度 
	SPI_Cmd(SPI1,ENABLE); 

} 

//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{		
	u8 retry=0;				 	
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
		{
		retry++;
		if(retry>200)return 0;
		}			  
	SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
	retry=0;

	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
		{
		retry++;
		if(retry>200)return 0;
		}	  						    
	return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据					    
}

其次是配置AD5293的头文件,将功能码宏定义,包括解锁,写入数据,写入控制指令等等,然后编写了AD5293的初始化函数,解锁函数,写入数据函数等等

#ifndef __AD5293_H
#define __AD5293_H
#include "sys.h"

#define AD5293_RDY PAin(4) 

#define unlock 0x1802
#define nop 0x00
#define write 0x01
#define reset 0x04
#define read_data 0x02
#define read_com 0x07


void AD5293_CS_HIGH(void);
void AD5293_CS_LOW(void);

void AD5293_Init(void);
void AD5293_Unlock(void);
void AD5293_Write(u8 com, u16 data);
u16 AD5293_Read_data(u8 com);

#endif

AD5293的初始化

void AD5293_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能 

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;  // PA3 推挽 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
 	GPIO_SetBits(GPIOA,GPIO_Pin_3);
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;  // PA4 推挽 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //模拟输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	AD5293_CS_HIGH();
	
	
	SPI1_Init();
	SPI1_SetSpeed(SPI_BaudRatePrescaler_2);
}

AD5293的片选函数以及写入数据函数

void AD5293_CS_HIGH(void)
{
  GPIO_SetBits(GPIOA, GPIO_Pin_3);
}

void AD5293_CS_LOW(void)
{
  GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}

void AD5293_Unlock(){
	
	
	AD5293_CS_LOW();

	SPI1_ReadWriteByte(unlock>>8);
	SPI1_ReadWriteByte(unlock&0xff);

	AD5293_CS_HIGH();
	
}
void AD5293_Write(u8 com, u16 data){
	
	AD5293_CS_LOW();
		
	SPI1_ReadWriteByte((com<<2)|((data>>8)&0x03));
	SPI1_ReadWriteByte((data&0xff));
	
	AD5293_CS_HIGH();
}

最后是主函数部分,向其发送写入指令,并配置阻值为0x100(1/4电阻)。

int main(void)
 {	 
	delay_init();
  //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 
	//uart_init(115200);
  AD5293_Init();
	AD5293_Unlock();
	AD5293_Write(write,0x0100);
	while(1)
	{
		
	}
}

4. 结果验证

将MCU单独接AD5293,在芯片的A端接入15V电压,W和B口接入电压表,将上述hex文件加载到MCU中,可观察到输出电压值为3.75V,因为此时阻值为总电阻的1/4,所以分压占总电压的1/4。

 接入AD8226再进行验证,输入为0.3V,输出为1.47V,放大了4.9倍,通过公式

G=\frac{49.4}{R}+1

 

24位、4通道模数转换、数据采集系统概述: 在过程控制和工业自动化应用中,±10 V满量程信号非常常见;然而,有些情况下,信号可能小到只有几mV。用现代低压ADC处理±10 V信号时,必须进行衰减和电平转换。但是,对小信号而言,需要放大才能利用ADC的动态范围。因此,在输入信号的变化范围较大时,需要使用带可编程增益功能的电路。 该电路设计是一种灵活的信号调理电路,用于处理宽动态范围(从几mV p-p到20 V p-p)的信号。该电路利用高分辨率模数转换器(ADC)的内部可编程增益放大器(PGA)来提供必要的调理和电平转换并实现动态范围。 该电路包含一个ADG1409多路复用器、一个AD8226仪表放大器、一个AD8475差动放大器、一个AD7192 Σ-Δ型ADC(使用ADR444基准电压源)以及 ADP1720稳压器。只需少量外部元件来提供保护、滤波和去耦,使得该电路具有高集成度,而且所需的电路板(印刷电路板[PCB])面积较小 适合宽工业范围信号调理的灵活模拟前端电路: 如上所示电路解决了所有这些难题,并提供了可编程增益、高CMR和高输入阻抗。输入信号经过4通道ADG1409 多路复用器进入 AD8226低成本、宽输入范围仪表放大器。AD8226低成本、宽输入范围仪表放大器。AD8226提供高达80dB的高共模抑制(CMR)和非常高的输入阻抗(差模800ΩM和共模400ΩM)。宽输入范围和轨到轨输出使得AD8226可以充分利用供电轨。 24位、4通道模数转换、数据采集系统附件内容截图:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值