stm32驱动LTC6912程控放大器程序,PGA可编程增益放大器,可调增益运放电路

本文详述了PGA可编程增益放大器的选型过程,对比了MCP41010与TI、ADI的产品特性,最终选定ADI的LTC6912-2并介绍了其电路设计、SPI时序及驱动代码。

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

1. 放大器需求

项目需求:需要用到 PGA可编程增益放大器,放大递归规律要为指数

需求参数:输入信号为100KHz正弦波,程控增益倍数 Gain=1~256。于是带宽积GBP >= 30MHz,压摆率SR>=3.2V/us

 

2. 起初不成熟方案

起初方案:起初是用分立芯片搭的,MCP41010数字电位器 + 反相放大器,效果一般。

优劣:使用起来比较麻烦。主要原因是 MCP41010只能单电源供电,运放可以用双电源供电。但由于 MCP41010单电源的原因,输入信号 <-0.7V的波形会有损失。几乎没有什么优势可言。

 

3. 后期最优方案

后期更优的方案:寻求专用集成芯片

TI的PGA主要产品

TI的PGA主要产品和参数
 供电范围Vs电源方式增益带宽积GBP压摆率SR增益倍率Gain通道数内部放大器拓扑结构
PGA28010~36V单/双电源6MHz1V/us1/8~1284通道差分放大
PGA28110~36V单/双电源6MHz1V/us1/8~1281通道差分放大
PGA1122.2~5.5V单电源10MHz3V/us1~1282通道同相放大器
PGA1162.2~5.5V单电源10MHz3V/us1~12810通道同相放大器

TI的PGA芯片看了一圈就很尴尬,要不不能双电源供电,要不带宽不够,要不压摆率不够。寻求其他产品。

ADI的PGA主要产品

ADI的PGA主要产品和参数
 供电范围Vs电源方式增益带宽积GBP压摆率SR增益倍率Gain放大器数量内部放大器拓扑结构
LTC6910-22.7~10.5V单/双电源11MHz12V/us-1~-641运放反相放大器
LTC6911-22.7~10.5V单/双电源11MHz16V/us-1~-642运放反相放大器
LTC6912-22.7~10.5V单/双电源30MHz20V/us-1~-642运放反相放大器

ADI的PGA产品参数都很硬,果断 ADI YES,选型使用了 LTC6912CGN-2

由于LTC6912内部放大器拓扑为反相放大器,输入输出反相。于是我设计电路将 LTC6912 内部2个反相放大器串联使用,正好使输入输出变为同相。并且放大器串联可以让带宽积增大,增益范围也变大为0~4096,在我的需求环境中无带宽失真,爽歪歪。

从Bom商那里拿了几片,¥18/pcs。还能用得起,比起秃头搞电路来说很实在了。

 

4. LTC6912电路

 

5. LTC6912-2 - SPI 写时序

(CLK上升沿数据有效。黄色 - CLK。蓝色 - Din。CS没接示波器,有CLK的时候CS要为低电平。)

图中SPI时序的串联总增益 = 32倍,以此为例

channel-B:Gain = -1,  对应 SPI一个字节的高4位,编码为 0001。

channel-A:Gain = -32,对应 SPI一个字节的低4位,编码为 0110。

时序较为简单,三线SPI。每次设置增益需要发送1个字节(8Bits)。高四位为channel-B增益,低四位为channel-A增益。

注意:设置增益为0时,相当于关断输出。

 

6. 驱动代码

uint8_t OPx[50]={   0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
                    0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
                    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
                    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
                    0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
                    0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,};
//分别对应系统放大:1,2,4,8,16,32,64,
//                2,4,8,16,32,64,128
//                4,8,16,32,64,128,256
//                8,16,32,64,128,256,512
//                16,32,64,128,256,512,1024
//                32,64,128,256,512,1024,2048
//                64,128,256,512,1024,2048,4096

//LTC6912-2 PGA增益设置
void LTC6912_SetGain(uint16_t xGain)
{
	uint8_t gtemp=0;

	switch(xGain)
	{
		case 1:
			gtemp=0;
			break;
		case 2:
			gtemp=1;
			break;
		case 4:
			gtemp=2;
			break;
		case 8:
			gtemp=3;
			break;
		case 16:
			gtemp=4;
			break;
		case 32:
			gtemp=5;
			break;
		case 64:
			gtemp=6;
			break;
		case 128:
			gtemp=13;
			break;
		case 256:
			gtemp=20;
			break;
		case 512:
			gtemp=27;
			break;
		case 1024:
			gtemp=34;
			break;
		case 2048:
			gtemp=41;
			break;
		case 4096:
			gtemp=48;
			break;
        default:
            break;
	}
	
	LTC6912_SPI_SendOneByte(OPx[gtemp]);    //就是普通的SPI-WRITE,1个字节
}

 

7. 测试波形:

实际电路中 LTC6912-2 的供电为双电源 ±2.5V,输出电压轨约为 ±2V。

黄色CH1为输入信号,蓝色CH2为输出信号。

Gain = 1

Gain = 4

Gain = 16

Gain = 64

Gain = 64

Gain = 4096

Gain = 256:(输入输出依旧能保存很好的一致性)

 

测试仪器为泰克 TBS1202B示波器,电脑上位机截屏软件使用的是 OpenChoice。

官网下载方式太慢,附个人下载链接https://download.csdn.net/download/Mark_md/12556223

 

### 基于 STM32程控增益放大器实现 以下是基于 STM32 实现程控增益放大器的一个示例代码。该代码主要通过 SPI 接口控制 DAC 芯片 MCP41010 来调整增益,同时利用 ADC 进行信号采集并完成相应的数据处理。 #### 主要功能模块说明 - **SPI 配置**: 使用 STM32 的 SPI 外设与 MCP41010 通信。 - **ADC 数据读取**: 利用 ADS1256 或其他高精度 ADC 对输入信号进行采样。 - **补码扩展**: 将 24 位有符号数扩展为 32 位以便后续计算[^1]。 - **LCD 显示**: 展示当前设置的参数以及测量结果[^2]。 #### 示例代码 ```c #include "stm32f1xx_hal.h" #include "spi.h" #include "adc.h" #define CMD_WRITE (0b00 << 4) void SetDACValue(uint16_t value) { uint16_t cmd_data = CMD_WRITE | ((value >> 8) & 0xFF); HAL_GPIO_WritePin(SPI_CS_Port, SPI_CS_Pin, GPIO_PIN_RESET); // CS低电平 HAL_SPI_Transmit(&hspi1, (uint8_t*)&cmd_data, 1, HAL_MAX_DELAY); HAL_SPI_Transmit(&hspi1, (uint8_t*)&value, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(SPI_CS_Port, SPI_CS_Pin, GPIO_PIN_SET); // CS高电平 } int main(void) { HAL_Init(); SystemClock_Config(); MX_ADC_Init(); // 初始化 ADC MX_SPI1_Init(); // 初始化 SPI MX_LCD_Init(); // 初始化 LCD int32_t adc_value; uint16_t dac_value; while (1) { // 获取 ADC 测量值 adc_value = ReadADS1256(); // 自定义函数用于读取 ADS1256 数据 if (adc_value < 0) { // 如果是负数,则进行符号扩展 adc_value |= 0xFFFFFF00; // 扩展到 32 位 } // 计算目标 DAC 输出值 dac_value = (uint16_t)((adc_value * 1250 / 256) + 50); // 设置 DAC 输出 SetDACValue(dac_value); // 更新 LCD 显示 char lcd_buffer[50]; sprintf(lcd_buffer, "Level set:%03d/255", res); LCD_ShowString(30, 90, 300, 16, 24, "AD8403A1 Test Rab:1300R"); LCD_ShowString(30, 130, 300, 16, 24, lcd_buffer); sprintf(lcd_buffer, "Rwb:%04d", dac_value); LCD_ShowString(30, 170, 300, 16, 24, lcd_buffer); HAL_Delay(100); // 延时等待下一次更新 } } ``` 上述代码实现了以下功能: 1. 定义了一个 `SetDACValue` 函数来发送命令字节和数据字节至 MCP41010[^3]。 2. 在主循环中调用了自定义的 `ReadADS1256()` 函数获取 ADC 输入值,并对其进行必要的符号扩展操作。 3. 根据 ADC 输入值动态调整 DAC 输出电压,并实时显示在 LCD 上。 #### 注意事项 - 确保硬件连接正确无误,尤其是 SPI 和 ADC 的接口配置。 - 根据实际使用的芯片型号修改初始化函数中的寄存器配置部分。 - 若采用不同的 DAC 或者 ADC 设备,请查阅对应的数据手册以适配具体协议需求。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值