一、ADC按键电路
如下图所示,开发板的按键SW4和SW5采用的ADC方式判断的。接在ADC1的CH0通道,通过检测ADC1_CH0的ADC值来判断是否有按键按下,以及按下的哪个按键。
二、程序移植以及处理
官方的例程放在如下目录NiobeU4\vendor\openvalley\niobeu4\demo
参考其中的例程,复制一个新的副本,修改名称为301_user_app。修改当前目录下的Kconfig.liteos_m.applications文件,根据文件中的格式添加新的例程支持。
进入301_user_app文件夹,修改BUILD.gn和.application_config文件。注意修改BUILD.gn文件时,不要用tab来代替空格,否则编译会报如下错误:
如下为BUILD.gn修改后的内容
kernel_module(module_name){
sources = [
"main.c"
]
include_dirs = [
"//drivers/hdf_core/framework/include/platform/",
"//drivers/hdf_core/framework/include/utils/",
"//drivers/hdf_core/framework/support/platform/include/gpio",
"//drivers/hdf_core/adapter/khdf/liteos_m/osal/include/",
"//drivers/hdf_core/framework/include/core/",
"//device/soc/esp/esp32/components/esp_adc_cal/include/",
"//device/soc/esp/esp32/components/driver/esp32/include/"
]
}
在main.c中添加adc代码,使用官方的adc会报错,提示没有hdf驱动,所以这里采用esp32的原生api
#define ADC_CHANNEL ADC1_CHANNEL_0
void adc_init(void)
{
adc1_config_width(ADC_WIDTH_12Bit); //设置采样深度
adc1_config_channel_atten(ADC_CHANNEL, ADC_ATTEN_DB_11); //设置电压采样范围
HDF_LOGE("[adc] ADC init\n");
}
int get_adc_value(void)
{
return adc1_get_raw(ADC_CHANNEL);
}
static void user_app(void)
{
uint16_t key_state = 0;
int adc_value;
adc_init();
while (1)
{
adc_value = get_adc_value();
HDF_LOGE("[adc] adc value:%d\r\n", adc_value);
osDelay(SYS_DELAY_TICKS);
}
}
static void user_app_task(void)
{
HDF_LOGE("into user app!\n");
osThreadAttr_t attr;
attr.name = "user_app";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = TASK_STACK_SIZE;
attr.priority = TASK_PRIO;
g_taskID = osThreadNew((osThreadFunc_t)user_app, NULL, &attr);
if (g_taskID == NULL) {
HDF_LOGE("Failed to create user app thread!\n");
}
}
这里实现了adc打印,可以看到按键按下和不按以及按下哪个分别打印的adc值。
操作 | adc值 |
---|---|
不按 | 1072 |
按下SW4 | 0 |
按下SW5 | 281 |
三、修改程序判断按键
以上已经得到了按键的adc值,接下来就根据该值判断哪个按键按下
修改user_app函数
static void user_app(void)
{
uint16_t key_state = 0;
int adc_value;
adc_init();
while (1)
{
adc_value = get_adc_value();
if(adc_value < 80)
{
HDF_LOGE("[adc] sw4 pressed adc value:%d\r\n", adc_value);
}
else if(adc_value < 500)
{
HDF_LOGE("[adc] sw5 pressed adc value:%d\r\n", adc_value);
}
LOS_Msleep(SYS_DELAY_TICKS);
}
}