【国民技术车规MCU N32A455开发板】3、简单测试ADC功能
【国民技术车规MCU N32A455开发板】2、驱动LCD屏 -
【实验目的】
使用开发板上的4个OPA作为OPA方式来工作,将放大结果注入到ADC的4个通道进行数据采集,采集后的结果通过LCD进行显示。
【实验步骤】
1、驱动LCD屏,这个已经在帖子中实现。
2、驱动ADC进行数据采集,也在上面的帖子中实现。
3、配置OPA
OPA的寄存器只有两个,就是OPAMP 控制状态寄存器(OPAMPx_CS)、OPAMP 锁寄存器(OPAMP_LOCK)。我只需要使用OPAMPx_CS来配置就行了。
在这个寄存器中,数据手册有如下说明:
再有就是通过如下两个来配置选择如何配置为比较器的何种功能:
最后是使能位:
在库函数中使用OPAMP_InitType OPAMP_Initial结构体来对PGA进行配置,他的主要参数如下:
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] OPAMP Init structure definition
*/
typedef struct
{
FunctionalState TimeAutoMuxEn; /*call ENABLE or DISABLE */
FunctionalState HighVolRangeEn; /*call ENABLE or DISABLE ,low range VDDA < 2.4V,high range VDDA >= 2.4V*/
OPAMP_CS_PGA_GAIN Gain; /*see @EM_PGA_GAIN */
OPAMP_CS_MOD Mod; /*see @EM_OPAMP_MOD*/
} OPAMP_InitType;
使用:OPAMP_Initial.Gain = OPAMP_CS_PGA_GAIN_2;可以配置为2倍放大。
使用:OPAMP_SetVpSel(OPAMP1, OPAMP1_CS_VPSEL_PA1);来选择输入源为PA1
使用:OPAMP_Enable(OPAMP1, ENABLE);来开启OPA
因此初始化与配置函数如下:
/**
* @brief Configures the Opa.
*/
void OPAMP_Configuration(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_COMP | RCC_APB1_PERIPH_OPAMP | RCC_APB1_PERIPH_COMP_FILT, ENABLE);
/* Enable GPIOA, GPIOB, GPIOC and GPIOD clocks */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_GPIOC,
ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_7;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_9 | GPIO_PIN_3;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
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);
/*configure opamp2*/
OPAMP_Init(OPAMP2, &OPAMP_Initial);
OPAMP_SetVpSel(OPAMP2, OPAMP2_CS_VPSEL_PA7);
OPAMP_Enable(OPAMP2, ENABLE);
/*configure opamp3*/
OPAMP_Init(OPAMP3, &OPAMP_Initial);
OPAMP_SetVpSel(OPAMP3, OPAMP3_CS_VPSEL_PC9);
OPAMP_Enable(OPAMP3, ENABLE);
/*configure opamp4*/
OPAMP_Init(OPAMP4, &OPAMP_Initial);
OPAMP_SetVpSel(OPAMP4, OPAMP4_CS_VPSEL_PC3);
OPAMP_Enable(OPAMP4, ENABLE);
// OPAMP output pin enable pix pin when OPAMPx En.not to remap or select output pin
}
在主函数中,我初始化好ADC1-4,并逐一读取,其代码如下:
__IO uint16_t ADC1ConvertedValue[4];
int main(void)
{
log_init();
OPAMP_Configuration();
ADC_Initial(ADC1);
ADC_Initial(ADC2);
ADC_Initial(ADC3);
ADC_Initial(ADC4);
LCD_Init();//LCD初始化
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
LCD_ShowChinese(10,0,"国民技术",RED,WHITE,24,0);
LCD_ShowString(24,30,"N32A455",RED,WHITE,16,0);
printf("start\n");
while(1)
{
ADC1ConvertedValue[0]=ADC_GetData(ADC1,ADC1_Channel_03_PA6);
ADC1ConvertedValue[1]=ADC_GetData(ADC2,ADC2_Channel_03_PB1);
ADC1ConvertedValue[2]=ADC_GetData(ADC3,ADC3_Channel_01_PB11);
ADC1ConvertedValue[3]=ADC_GetData(ADC4,ADC4_Channel_03_PB12);
LCD_ShowIntNum(0,50,ADC1ConvertedValue[0],4,RED,WHITE, 16);
LCD_ShowFloatNum1(60,50,(float)ADC1ConvertedValue[0]*3.3/4095.0,4,RED,WHITE, 16);
LCD_ShowIntNum(0,70,ADC1ConvertedValue[1],4,RED,WHITE, 16);
LCD_ShowFloatNum1(60,70,(float)ADC1ConvertedValue[1]*3.3/4095.0,4,RED,WHITE, 16);
LCD_ShowIntNum(0,90,ADC1ConvertedValue[2],4,RED,WHITE, 16);
LCD_ShowFloatNum1(60,90,(float)ADC1ConvertedValue[2]*3.3/4095.0,4,RED,WHITE, 16);
LCD_ShowIntNum(0,110,ADC1ConvertedValue[3],4,RED,WHITE, 16);
LCD_ShowFloatNum1(60,110,(float)ADC1ConvertedValue[3]*3.3/4095.0,4,RED,WHITE, 16);
delay_ms(500);
systick_delay_ms(10);
}
}
【实验现象】
我通过数字电源输入电压,可以实时读取数据并显示在LCD屏上:
通道1、2是正确的,但是3与4是不对的
【原因排查】
AD3的输入通道为PB11,ADC4的输入通道为PB12。经查开发板的原理图,PB11是有接入到音频放大模块的,默认就有电压,所以这一路不能用。PB12我用万用表量了一下,是对地短路了。所以也不能工作,所以也只能用PGA1,PGA2来做下一步的测试。
引用: Mcu_MMU 发表于 2024-4-13 15:49 OPAMP_Initial.Gain = OPAMP_CS_PGA_GAIN_2;可以配置为2倍放大。 它最大可以放大多少倍呀?放大后,会不 ...
根据数据手册,最大可以放大32倍。会不会失真,我还没有测试到这一步呢。