【国民技术车规MCU N32A455开发板】2、驱动LCD屏
我的目的是测电流,所以先得把ADC摸出来。所以今天就分享ADC的基本数据采集。
【ADC输入源选择】
由于我的最终目标是测试PGA的功能,所以先选择PA6为ADC输入,进行测试。
【驱动步骤】
1、使能GPIOA的时钟、ADC的时钟,配置ADC1的分频。
//打开时钟
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC1, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, 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
2、配置PA6为模拟输入:
//adc1 PA6为输入通道
/* Configure PC0 PC1 as analog input -------------------------*/
GPIO_InitStructure.Pin = GPIO_PIN_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
3、配置ADC的参数,同时使能ADC1,具体代码如下:
/* 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(ADC1, &ADC_InitStructure);
/* Enable ADC */
ADC_Enable(ADC1, ENABLE);
/*Check ADC Ready*/
while(ADC_GetFlagStatusNew(ADC1,ADC_FLAG_RDY) == RESET)
;
/* Start ADC calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC calibration */
while (ADC_GetCalibrationStatus(ADC1));
4、实现一个读取ADC指定通道的函数,传入参数为ADC1-4,通道为相应的通道 。
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;
}
在选择对应的通道中,官方的库n32a455_adc.h文件给我们定义好的对应有通道的宏定义,方便我们了解如何配置对应的通道,就不用查数据手册这么麻烦了。
5、在主函数中,我添加代码,读取这一通道的数据,并展示到LCD屏上:
#include "main.h"
#include "log.h"
#include "lcd_init.h"
#include "lcd.h"
#include "adc.h"
#include "delay.h"
__IO uint16_t ADC1ConvertedValue[5];
int main(void)
{
log_init();
init_adc();
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);
while(1)
{
ADC1ConvertedValue[0]=ADC_GetData(ADC1,ADC1_Channel_03_PA6);
LCD_ShowIntNum(24,50,ADC1ConvertedValue[0],4,RED,WHITE, 16);
LCD_ShowFloatNum1(24,80,(float)ADC1ConvertedValue[0]*3.3/4095.0,4,RED,WHITE, 16);
delay_ms(500);
}
}
【测试】
通过PA6,使用数字电源输入电压值,就可以测量出对应的电压了。效果如下图所示:
【总结】
国民技术给了很丰富的例子,通过阅读数据手册与官方的示例,就可快速的入门他们的外设使用。同时ADC的测量值也非常准。