国民技术N32A455内部有4个OPAMP,OPAMP 模块可以灵活配置,适用于独立运算放大器、可编程增益放大器(PGA),和跟随器等模式应用。
支持轨到轨输入,输入范围是 0V 到 VDDA,输出范围是 0.1V 到 VDDA-0.1V 可编程增益
可编程增益设置为 2X、4X、8X、16X、32X
增益带宽:4MHz
内部运放使得单片机能够直接处理模拟信号,例如采集传感器信号、进行信号调理或控制电路,常需要适当的电源电压供应,开发者需要确保单片机提供了足够的电源支持内部运放的正常工作,但在某些应用中,可能还需要外部连接独立的运放器件以满足特定的性能要求。
内部运放可以用于各种应用,包括:
- 传感器信号放大:
用于从传感器中采集的微弱信号。
- 信号调理:
用于调整信号的增益、滤波或其他特性。
- 比较器:
用于比较两个信号的大小。
- 反馈电路:
用于控制系统的稳定性和性能。
OPAMP 工作模式
OPAMP 独立运算放大器模式
可做为同相比例放大电路 ,外部放大模式即放大倍数由连接的电阻电容决定。
该电路的特征为:Uo=(1 + Rf/R1)Ui,电路的闭环增益为Av=(1+ Rf/R1)
电压跟随器
由运算放大器组成的电压跟随器具有输入阻抗高,输出阻抗低的特点。一般来说,输入电阻要达到几兆欧姆是很容易做到的,输出阻抗可低至几欧姆。电压跟随器可起到缓冲、隔离、提高带载能力的作用。
PGA
内部放大模式,即 PGA 模式,通过内置的电阻反馈网络对输入电压进行放大
软件代码
#include "main.h"
#include "stdio.h"
#include "uart_printf.h"
#include "dwt_delay.h"
/** @addtogroup ADC_ADC1_DMA
* @{
*/
ADC_InitType ADC_InitStructure;
DMA_InitType DMA_InitStructure;
__IO uint16_t ADC4ConvertedValue[5];
void RCC_Configuration(void);
void GPIO_Configuration(void);
uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel);
void ADC_Initial(ADC_Module* ADCx);
void OPAMP_Configuration(void);
void ADC_Initial(ADC_Module* ADCx)
{
/* ADC configuration ------------------------------------------------------*/
ADC_InitStructure.WorkMode = ADC_WORKMODE_INDEPENDENT;
ADC_InitStructure.MultiChEn = DISABLE;
ADC_InitStructure.ContinueConvEn = DISABLE;
ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE;
ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R;
ADC_InitStructure.ChsNumber = 1;
ADC_Init(ADCx, &ADC_InitStructure);
/* Enable ADC */
ADC_Enable(ADCx, ENABLE);
/*Check ADC Ready*/
while(ADC_GetFlagStatusNew(ADCx,ADC_FLAG_RDY) == RESET)
;
/* Start ADC calibration */
ADC_StartCalibration(ADCx);
/* Check the end of ADC calibration */
while (ADC_GetCalibrationStatus(ADCx))
;
}
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] Main program
*/
int main(void)
{
/* System clocks configuration ---------------------------------------------*/
RCC_Configuration();
/* GPIO configuration ------------------------------------------------------*/
GPIO_Configuration();
Delaylnit();
uart_print_init();
ADC_Initial(ADC4);
ADC_Initial(ADC1);
OPAMP_Configuration();
while (1)
{
DelayNms(500);
ADC4ConvertedValue[0]=ADC_GetData(ADC4,ADC4_Channel_05_PB15);
printf("ADC4 P15 = %d \r\n",ADC4ConvertedValue[0]);
ADC4ConvertedValue[1]=ADC_GetData(ADC1,ADC1_Channel_03_PA6);
printf("ADC1 PA6 = %d \r\n",ADC4ConvertedValue[1]);
}
}
/**
* @brief Configures the different system clocks.
*/
void RCC_Configuration(void)
{
/* Enable peripheral clocks ------------------------------------------------*/
/* Enable GPIOC clocks */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA|RCC_APB2_PERIPH_GPIOB, ENABLE);
/* Enable COMPE clocks */
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_OPAMP, ENABLE);
/* Enable ADC4 clocks */
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC4, ENABLE);
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC1, ENABLE);
/* RCC_ADCHCLK_DIV16*/
ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB,RCC_ADCHCLK_DIV16);
RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSE, RCC_ADC1MCLK_DIV8); //selsect HSE as RCC ADC1M CLK Source
}
/**
* @brief Configures the different GPIO ports.
*/
void GPIO_Configuration(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
//OPA IN
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
//OPA OUT
GPIO_InitStructure.Pin = GPIO_PIN_6;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
}
uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel)
{
uint16_t dat;
ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_239CYCLES5);
/* Start ADC Software Conversion */
ADC_EnableSoftwareStartConv(ADCx, ENABLE);
while(ADC_GetFlagStatus(ADCx, ADC_FLAG_ENDC)==0){
}
ADC_ClearFlag(ADCx, ADC_FLAG_ENDC);
ADC_ClearFlag(ADCx, ADC_FLAG_STR);
dat=ADC_GetDat(ADCx);
return dat;
}
/**
* @brief Configures the Opa.
*/
void OPAMP_Configuration(void)
{
OPAMP_InitType OPAMP_Initial;
OPAMP_StructInit(&OPAMP_Initial);
OPAMP_Initial.Gain = OPAMP_CS_PGA_GAIN_2;
/*configure opamp1*/
OPAMP_Init(OPAMP1, &OPAMP_Initial);
OPAMP_SetVpSel(OPAMP1, OPAMP1_CS_VPSEL_PA1);
OPAMP_Enable(OPAMP1, ENABLE);
}
实验现象
PA1 电压 0.829
PA1 电压 1.659