打印
[国产单片机]

【东软载波ESF0654 PDS开发板活动】测试ADC功能

[复制链接]
650|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ES32F065板卡支持1 路模数转换器(ADC0)。ADC(Analog to Digital Convertor) 是 12 位分辨率的逐次逼近型模数转换器。它具有多达 19 个复用通道,可测量从管脚输入的16 个外部信号、3 个内部信号。这些通道的模数转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的16 位数据寄存器中。ADC 模块具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。ADC 支持触发DMA 数据传输的功能。
先看一下板卡的原理图,电位器R1 接到了PB0,对应着ADC0的通道14
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值如下:


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

257

主题

3643

帖子

73

粉丝