一、OPA介绍
CW32L012 集成两路独立轨到轨运算放大器,支持 1.7~5.5V 宽电压供电,具备正常与低功耗两种工作模式,适配低功耗锂电产品设计。
运放支持多路内外输入切换,同相端可接入外部模拟信号或内部 DAC 电压,反相端可选外部引脚输入,输出可直连片内 ADC,省去外围缓冲电路。芯片自带失调电压自动校准功能,有效提升小信号采集精度。
电气性能优秀,正常模式带宽可达 2MHz,低功耗模式大幅降低静态功耗,输入输出接近电源轨。常应用于电流采样放大、电压信号缓冲、有源滤波、传感器信号调理等场景,精简外围电路,降低硬件成本,适配各类低功耗模拟采集控制系统,核心特性如下:
数量:2 个独立 OPA(OPA1、OPA2)
供电:1.7V–5.5V,轨到轨输入 / 输出(RRIO)
功耗:正常 / 低功耗双模式,可在 DeepSleep 下运行
输入
同相端(INP):3 路外部 + 1 路内部 DAC(DAC_OUT)
反相端(INN):2 路外部输入
输出:可映射到 GPIO 引脚,也可内部直连 ADC/VC
校准:内置失调电压校准,支持软件 / 事件触发
应用:信号放大、电流采样、电压跟随、有源滤波、比较器前置
二、OPA基本原理
运算放大器(OPA)是一种高增益、高输入阻抗、低输出阻抗的模拟集成电路,核心由多级差分放大电路构成,主要包含同相输入端(+)、反相输入端(-)和输出端三个关键引脚,广泛应用于信号放大、缓冲、滤波等场景。
OPA工作遵循两大理想特性:一是“虚短”,闭环工作时,正负输入端电压近似相等,差值趋近于零;二是“虚断”,两个输入端几乎无电流流入,输入阻抗极高,可避免影响被测信号源。其核心工作逻辑是放大正负输入端的电压差值,内部开环增益极高,输出电压受电源电压限制,无法无限放大,需通过外接反馈网络稳定工作。
实际应用中,OPA主要有两种常用接法:电压跟随器(输出直连反相端,增益为1,用于信号缓冲隔离)和比例放大器(外接电阻构成负反馈,精准设定放大倍数)。负反馈是OPA稳定工作的关键,可固定放大倍数、降低信号失真、稳定输出电压,适配各类模拟信号调理需求,是电子设备中模拟电路的核心器件。
三、配置流程
本实验使用OPA外设进行,需要开启OPA时钟,使用__SYSCTRL_OPA_CLK_ENABLE宏定义开启时钟;
配置引脚,设置 OPA 通道对应的 GPIO 引脚为模拟功能;
使用结构体OPA_InitTypeDef,对OPA进行配置,使能正端模拟输入信号 INPy,使能负端模拟输入信号 INNy;
选择外部放大模式,使能模拟输出OUT,使能OPA;
选择电平校准,使能校准功能,启动电平校准;
延时等待规定的校准时长,停止电平校准;
通过ADC采样OPA输出信号;
四、配置OPA
void OPA_Configuration(void){__SYSCTRL_GPIOA_CLK_ENABLE();__SYSCTRL_GPIOB_CLK_ENABLE();GPIO_InitTypeDef gpio_init_struct;gpio_init_struct.IT = GPIO_IT_NONE;gpio_init_struct.Mode = GPIO_MODE_ANALOG;gpio_init_struct.Pins = GPIO_PIN_7;GPIO_Init(CW_GPIOA, &gpio_init_struct);AFx_OPA1INN2_PA07();gpio_init_struct.Pins = GPIO_PIN_0;GPIO_Init(CW_GPIOB, &gpio_init_struct);AFx_OPA1OUT_PB00();__SYSCTRL_OPA_CLK_ENABLE();OPA_InitTypeDef opa_init_sturct;opa_init_sturct.InputP = OPA_INPUT_INP2;opa_init_sturct.InputN = OPA_INPUT_INN2;opa_init_sturct.Bias = OPA_BIAS_8UA_4US;opa_init_sturct.PgaGain = OPA_PGA_GAIN2;opa_init_sturct.WorkMode = OPA_WORKMODE_STANDALONE;OPA_Init(CW_OPA1, &opa_init_sturct);OPA_AutoZeroTrig_Config(CW_OPA1, OPA_AZCLOCK_PCLK_DIV4, OPA_AZPERIOD_AZCLK512, OPA_AZTRIGSRC_ADC1START);OPA_Start(CW_OPA1);}
五、数据采集
在main.c中采集数据,初始化外设,调用ADC_GetSqr0Result函数获取adc转换序列0中的adc原始数据,每延时500ms,调用UART1_SendBytes函数通过串口发送到上位机
int main(void){uint16_t adc_value = 0;SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV1);SYSCTRL_HCLKPRS_Config(SYSCTRL_HCLK_DIV1);SYSCTRL_PCLKPRS_Config(SYSCTRL_PCLK_DIV1);SYSCTRL_SystemCoreClockUpdate(96000000);InitTick(96000000);Int_Uart_Init();GPIO_Configuration();OPA_Configuration();ADC_Configuration();UART1_SendBytes("hello,world!", 12);while (1){ADC_GetSqr0Result(CW_ADC1, &adc_value);sprintf(convert_string, "%d", adc_value);UART1_SendBytes((uint8_t*)convert_string, 4);SysTickDelay(500);}}
六、实验现象
通过原始数据计算:2100 / 4096 * 5=2.563V,最后得到了2.563V的一个电压值,和在采集A相相电流的电路中有一个2.5V的偏置电压大致相等。
实验例程如下:
通过网盘分享的文件:OPA_and_ADC.zip
链接: https://pan.baidu.com/s/13Fe61RT6eYeT0NngDCzKig?pwd=L012 提取码: L012
扫码加入QQ群3群| 610403240
175