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>
- {
- 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>
- 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 000/1000 + 0x30;
- Sendbuf[2] = temper 00/100 + 0x30;
- Sendbuf[3] = temper 0/10 + 0x30;
- Sendbuf[4] = temper + 0x30;
- Sendbuf[5] = '
';
- Sendbuf[6] = '
';
- bsp_uart_232_send(Sendbuf,7);
- }
- }
旋转电位器串口助手打印出的AD值如下:
一周热门 更多>