#include
#include
#include
#include
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"
#include "wifiiot_adc.h"
#define ADC_TASK_STACK_SIZE 1024 * 8
#define ADC_TASK_PRIO 24
/***** 获取电压值函数 *****/
static float GetVoltage(void)
{
unsigned int ret;
unsigned short data;
//第一个参数为打开的ADC通道号,第二个参数是获取后数据的存放地址,第三个参数是采样多少次后再求平均获取数值,第四个参数是电源模式,第五个参数是计数时间
ret = AdcRead(WIFI_IOT_ADC_CHANNEL_5, &data, WIFI_IOT_ADC_EQU_MODEL_8, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0xff);
if (ret != WIFI_IOT_SUCCESS)
{
printf("ADC Read Failn");
}
return (float)data * 1.8 * 4 / 4096.0;
}
static void ADCTask(void)
{
float voltage;
//上拉,让按键未按下时GPIO_11保持高电平状态;第一个参数是GPIO号,第二个参数是该GPIO是低电平还是高电平
IoSetPull(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_PULL_UP);
while (1)
{
printf("=======================================rn");
printf("***************ADC_example*************rn");
printf("=======================================rn");
//获取电压值
voltage = GetVoltage();
printf("vlt:%.3fVn", voltage);
//延时1s
usleep(1000000);
}
}
static void ADCExampleEntry(void)
{
//重命名了的结构体
osThreadAttr_t attr;
//结构体赋值
attr.name = "ADCTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = ADC_TASK_STACK_SIZE;
attr.priority = ADC_TASK_PRIO;
if (osThreadNew((osThreadFunc_t)ADCTask, NULL, &attr) == NULL)
{
printf("[ADCExample] Falied to create ADCTask!n");
}
}
//执行ADCExampleEntry这个函数
APP_FEATURE_INIT(ADCExampleEntry);
目前已知ADC的功能是获取电压值
具体流程
1.通过芯片手册获取要使用的ADC通道口和与之对应的GPIO口
2.创建获取电压值的float型函数
{
使用AdcRead函数
(设置ADC通道号,数据存储指针,采样次数,电压模式,计数时间这五个参数)
返回获取的电压值
}
3.创建对应GPIO口的工作状态函数
{
使用IoSetPull函数
(设置GPIO口,高低电平这两个参数)
使用之前创建的读取函数读取电压值并打印
}
4.创建主入口函数实现功能