根据小熊派开发板介绍以及主芯片Hi3861手册, 这款芯片提供了7路ADC输入,其中1路ADC6(GPIO13)以E53方式引出,而例程中使用的1路ADC是ADC5,这2路ADC在芯片手册中表述如下:
从开发板的原理图上可以看出,ADC5(GPIO11)还和按键F1相连接:
例程中的B4就是基本功能ADC的演示,进入B4_basic_adc目录,打开主程序adc_example.c:
/***** 获取电压值函数 *****/
static float GetVoltage(void)
{
unsigned int ret;
unsigned short data;
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 Fail\n");
}
return (float)data * 1.8 * 4 / 4096.0;
}
static void ADCTask(void)
{
float voltage;
//上拉,让按键未按下时GPIO_11保持高电平状态
IoSetPull(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_PULL_UP);
while (1)
{
printf("=======================================\r\n");
printf("***************ADC_example*************\r\n");
printf("=======================================\r\n");
//获取电压值
voltage = GetVoltage();
printf("vlt:%.3fV\n", voltage);
//延时1s
usleep(1000000);
}
}
其中函数GetVoltage()是读取ADC5的电压值。主程序中先是将ADC5(GPIO11)设置为上拉,然后间隔1秒循环调用函数GetVoltage()读取ADC5的电压值并通过虚拟串口显示输出。
将 sample目录下的build.gn文件做如下修改:
#"B1_basic_led_blink:led_example",
#"B2_basic_button:button_example",
#"B3_basic_pwm_led:pwm_example",
"B4_basic_adc:adc_example",
#"B5_basic_i2c_nfc:i2c_example",
#"B6_basic_uart:uart_example",
也即注释掉其它例子程序,去掉B4的注释。
程序编译、烧写后运行结果如下:
初始状态是ADC通过上拉电阻接供电电压3.3V,实际测得的结果也比较接近。
按下F1键,此时GPIO11脚等同于接地,程序运行输出的结果如下:
输出接近0V,实际使用过程中会对ADC量程做校准。
再来看下ADC6通道的电压值采集情况。
将程序adc_example.c做如下修改:
通道5改为通道6,同时注释掉IoSetPull()函数。
编译、烧写后程序运行结果如下:
也即ADC6通道未接入任何外部输入,实测值接近0V。
3.3V电源电压串接一个4.7k欧电阻后接入ADC6通道,如图所示:
此时ADC6通道测得的电压值就是电源电压的数值。