9.1. ADC - 按键检测电压¶
本 demo 主要介绍一个基于 ADC 的按键功能,使用 ADC 检测按键输入引脚的电压值,根据不同的分压值判断相应的按键是否按下
9.1.2. 软件实现¶
软件代码见
examples/adc/adc_key
1 2 | #define BSP_ADC_CLOCK_SOURCE ROOT_CLOCK_SOURCE_XCLK
#define BSP_ADC_CLOCK_DIV 0
|
配置
ADC
设备时钟源,见bsp/board/bl706_avb/clock_config.h
1 | #define CONFIG_GPIO18_FUNC GPIO_FUN_ADC
|
配置
ADC
设备复用引脚,见bsp/board/bl706_avb/pinmux_config.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #define BSP_USING_ADC0
#if defined(BSP_USING_ADC0)
#ifndef ADC0_CONFIG
#define ADC0_CONFIG \
{ \
.clk_div = ADC_CLOCK_DIV_32,\
.vref = ADC_VREF_3P2V,\
.continuous_conv_mode = DISABLE,\
.differential_mode = DISABLE,\
.data_width = ADC_DATA_WIDTH_16B_WITH_256_AVERAGE,\
.fifo_threshold = ADC_FIFO_THRESHOLD_1BYTE,\
.gain = ADC_GAIN_1\
}
#endif
#endif
|
使能
BSP_USING_ADC0
并配置ADC
设备配置,见bsp/board/bl706_avb/peripheral_config.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | adc_channel_cfg_t adc_channel_cfg;
adc_channel_cfg.pos_channel = posChList;
adc_channel_cfg.neg_channel = negChList;
adc_register(ADC0_INDEX, "adc_key");
adc_key = device_find("adc_key");
if(adc_key)
{
ADC_DEV(adc_key)->continuous_conv_mode = ENABLE;
device_open(adc_key, DEVICE_OFLAG_STREAM_RX);
device_control(adc_key,DEVICE_CTRL_ADC_CHANNEL_CONFIG,&adc_channel_cfg);
}else{
MSG("device open failed\r\n");
}
adc_channel_start(adc_key);
|
首先调用
adc_register
函数注册adc_key
设备,当前注册为 ADC0然后通过
find
函数找到设备对应的句柄,保存于adc_key
句柄中然后使用
device_open
以轮询模式来打开adc_key
设备,调用device_control
完成 ADC 相关的配置最后调用
adc_channel_start
启用ADC的转换
1 2 3 4 5 6 7 | device_read(adc_key,0,(void *)&result_val,1);
keyValue = get_adc_key_value(result_val.volt * 1000);
if( keyValue!=KEY_NO_VALUE){
MSG("key %d pressed\r\n",keyValue);
MSG("result_val.volt: %0.2f mv\n", (result_val.volt * 1000));
}
|
调用
device_read
读取adc_key
设备信息保存到result_val
结构体中调用
get_adc_key_value
函数获取当前的键值和电压值
9.1.3. 编译和烧录¶
CDK工具编译
打开项目中提供的工程文件:adc_key.cdkproj
参照 Windows 下使用 CDK (类 MDK Keil)开发指南 的步骤编译下载即可
命令行编译
1 2 | $ cd <sdk_path>/bl_mcu_sdk
$ make BOARD=bl706_avb APP=adc_key SUPPORT_FLOAT=y
|
烧录
9.1.4. 实验现象¶
本实验依次按下开发板上的 SW1 ~ SW5 会得到不同的电压值:
key 0: 0V 左右
key 1: 0.1V 左右
key 2: 0.2V 左右
key 3: 0.3V 左右
key 4: 0.43V 左右
实际运行结果如下图所示:
见视频展示: