[原创] 【国民技术车规MCU N32A455开发板】OPA+ADC初试

lugl4313820   2024-4-13 09:35 楼主

【国民技术车规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来配置就行了。

在这个寄存器中,数据手册有如下说明:

image.png   通过配置这个寄存器来选择OPA的输入引脚。

再有就是通过如下两个来配置选择如何配置为比较器的何种功能:

image.png

最后是使能位:

  image.png   在官方提供的例程中,有简单的配置,就可以实现PGA的功能。

在库函数中使用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屏上:

368928c27d466df8837491b60b28d49.jpg  

通道1、2是正确的,但是3与4是不对的

【原因排查】

AD3的输入通道为PB11,ADC4的输入通道为PB12。经查开发板的原理图,PB11是有接入到音频放大模块的,默认就有电压,所以这一路不能用。PB12我用万用表量了一下,是对地短路了。所以也不能工作,所以也只能用PGA1,PGA2来做下一步的测试。

回复评论 (2)

OPAMP_Initial.Gain = OPAMP_CS_PGA_GAIN_2;可以配置为2倍放大。

它最大可以放大多少倍呀?放大后,会不会失真呢?

点赞  2024-4-13 15:49
引用: Mcu_MMU 发表于 2024-4-13 15:49 OPAMP_Initial.Gain = OPAMP_CS_PGA_GAIN_2;可以配置为2倍放大。 它最大可以放大多少倍呀?放大后,会不 ...

根据数据手册,最大可以放大32倍。会不会失真,我还没有测试到这一步呢。

点赞  2024-4-13 15:59
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复