
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
前言:
有朋友问Neptune开发板ADC如何使用,所以我去查看一下openHarmong-IoT API发现openHarmong-1.1版本中IoT取消了ADC 的API,所以只能使用W800 SDK中ADC API去操作ADC使用获取电压。
本文参考:W800 ADC采集电压值
1、环境准备
1.1 开发环境、编译环境搭建,参考官方文档,参考链接如下:
Neptune开发板的环境搭建及使用
2、材料准备
2.1、Neptune HarmonyOS物联网 IOT模组
3、相关知识介绍:引用自参考文章
W800芯片14 脚(PA1)及15 脚(PA4)脚可以作为普通ADC 使用,输入电压范围0~2.4V。
高于2.4V 外部需做分压处理后才可进入ADC 接口。为提高精度,R1 和R2 需使用高精度电阻。
根据Sensor 输出值选择合适的R1,R2 电阻值分压。(这里是理论上ADC 获取值,我使用2个1k电阻分压)
4、编写代码:
adc_sample.c
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wm_adc.h"
#include "wm_gpio_afsel.h"
static void ADC_Demo_Entry(void)
{
int voltage=0;
wm_adc_config(0);//ADC->PA1
while (1)
{
voltage=adc_get_inputVolt(0);//获取ADC值
osDelay(500);
if(voltage<0)
{
voltage=0-voltage;
printf("%d(mV)--%d.%03d(V)\r\n\n",voltage,voltage/1000,voltage%1000);
}
else
{
printf("%d(mV)--%d.%03d(V)\r\n\n",voltage,voltage/1000,voltage%1000);
}
}
}
static void ADC_Demo(void)
{
osThreadAttr_t attr;
attr.name = "ADC_Demo_Entry";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 4096;
attr.priority = 24;
if (osThreadNew(ADC_Demo_Entry, NULL, &attr) == NULL) {
printf("[ADCDemo] Falied to create ADC_Demo_Entry!\n");
}
}
APP_FEATURE_INIT(ADC_Demo);
static_library("adc_sample") {
sources = [
"adc_sample.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/kal/cmsis",
"//device/winnermicro/neptune/sdk_liteos/platform/inc",
]
}
6、编译,烧录,测试
5、总结
通过对ADC操作发现W800的接口的复用功能对开发者有些不友好,PA1与PA4既是唯一I2C接口(PB19/PB20要用作串口0输出)同时又是两个唯一ADC接口,这样会使ADC的功能非常的鸡肋,因为我们不可能放弃I2C功能不用。