ES-PDS32 ES32F654评测————第八步:测试ADC功能

ES32F065板卡支持 1 路模数转换器(ADC0)。 ADC(Analog to Digital Convertor) 是 12 位分辨率的逐次逼近型模数转换器。它具有多达 19 个复用通道,可测量从管脚输入的 16 个外部信号、 3 个内部信号。这些通道的模数转换可在单次、连续、扫描或不连续采样模式下进行。 ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。ADC 模块具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。ADC 支持触发 DMA 数据传输的功能。

先看一下板卡的原理图,电位器R1 接到了PB0,对应着ADC0的通道14

ES-PDS32 ES32F654评测————第八步:测试ADC功能_第1张图片

ES-PDS32 ES32F654评测————第八步:测试ADC功能_第2张图片

电位器旋钮

ES-PDS32 ES32F654评测————第八步:测试ADC功能_第3张图片

BSP库中两个重要函数:

1.ADC 模块初始化  这里我将其改为ADC0的通道14 对应着板子的旋钮。

oid adc_module_init(void)
{
    /* clear lpuart_handle_t structure */
    memset(&h_adc, 0x0, sizeof(adc_handle_t));
    /* clear adc_nch_conf_t structure */
    memset(®_config, 0x0, sizeof(adc_nch_conf_t));

    adc_pin_init();

    /* Initialize adc */
    h_adc.perh = ADC0;
    h_adc.init.data_align = ADC_DATAALIGN_RIGHT;
    h_adc.init.scan_mode  = DISABLE;
    h_adc.init.cont_mode  = DISABLE;
    h_adc.init.nch_len    = ADC_NCH_LEN_1;
    h_adc.init.disc_mode  = ADC_ALL_DISABLE;
    h_adc.init.disc_nbr   = ADC_DISC_NBR_1;
    h_adc.init.conv_res   = ADC_CONV_RES_10;
    h_adc.init.clk_div    = ADC_CKDIV_128;
    h_adc.init.neg_ref    = ADC_NEG_REF_VSS;
    h_adc.init.pos_ref    = ADC_POS_REF_VDD;
    ald_adc_init(&h_adc);
    /* Initialize regular convert channel */
    reg_config.channel       = ADC_CHANNEL_14;
    reg_config.rank          = ADC_NCH_RANK_1;
    reg_config.samp_time     = ADC_SAMPLETIME_4;
    ald_adc_normal_channel_config(&h_adc, ®_config);
    return;
}

2. ADC读数据函数,每20次取一个平均。

uint32_t adc_average(void)
{
    int32_t i;
    uint32_t adc_max, adc_min, adc_sum, adc_value;
    uint32_t reg_value;
    /* Start rejular convert */
    adc_max = 0,
    adc_min = 0xffffffff;
    adc_sum = 0;
    for (i = 0; i < 20; i++)
    {
        ald_adc_normal_start(&h_adc);
        /* Polling convert finish and read result */
        if (ald_adc_normal_poll_for_conversion(&h_adc, 5000) == OK)
            reg_value = ald_adc_normal_get_value(&h_adc);
        if (reg_value > adc_max)
            adc_max = reg_value;

        if (reg_value < adc_min)
            adc_min = reg_value;
        adc_sum = adc_sum + reg_value;
    }
    adc_sum = adc_sum - adc_max - adc_min;
    adc_sum = adc_sum / 18;
    adc_value = 3300 * 10 / 4096 * adc_sum / 10;
    return adc_value;
}

主函数代码 打印ADC的值

#include "main.h"
unsigned char Sendbuf[7] ;
uint32_t temper;
int main()
{
	ald_cmu_init();      // Initialize ALD 
	led_module_init();   //LED初始化
	bsp_key_init();      //按键初始化
	adc_module_init();   //ADC模块初始化
	uart_232_module_init(115200);	
	while (1) 
	{
    	ald_delay_ms(1000);
		  temper =  adc_average();
		  Sendbuf[0] =  temper /10000 + 0x30;
		  Sendbuf[1] =  temper %10000/1000 + 0x30;
		  Sendbuf[2] =  temper %1000/100 + 0x30;
		  Sendbuf[3] =  temper %100/10 + 0x30;
		  Sendbuf[4] =  temper %10 + 0x30;
		  Sendbuf[5] =  '\r';
		  Sendbuf[6] =  '\n';
		  bsp_uart_232_send(Sendbuf,7);
	}
}

旋转电位器 串口助手打印出的AD值如下:

ES-PDS32 ES32F654评测————第八步:测试ADC功能_第4张图片

你可能感兴趣的:(评测)