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值如下:
|