这一节内容比较简单,就是电压采样,在传统设计中应用还是比较多的。首先看下支持ADC采样的管脚,找到你手里模块的原理图,我的如下所示:

如上所示,U1的2脚为ADC管脚,而且整个模块有且仅有这一个电压采集管脚。CDS1是一个光敏电阻,它和R1组成一个分压电路。不同强度的光照在CDS1上时,会导致它的阻值变化,最终导致ADC管脚上的电压发生变化。

那么,关于ESP8266的ADC,相关的性能参数有哪些?

可以打开手册:2c-esp8266_sdk_api_guide_cn_v1.5.4,在第26页,有几个ADC相关的函数,我们截取其中一个,看一下:

首先是电压的输入范围,也就是ADC的量程:0~1.0V,相比传统单片机的0~3.3V小了很多。

然后是分辨率:1/1024V。从这个参数可以知道,这是个10位的AD,只是不知道为何,量程这么小。

接着是三点注意事项:

1、ADC读取管脚电压时,需确保管脚连接了外部电路,且没有超过量程。

这一点很好理解,根据输入电压设计相应的分压电路,接过来就行了。

2、读取电压之前,需要修改esp_init_data_default.bin文件中的第107byte的值,改为VDD3P3管脚3和4上的真实电源电压值。

先说修改esp_init_data_default.bin文件,这个其实很简单,因为这个文件是我们烧录到ESP8266里面的,所以只要找到文件位置,用修改flash的函数改一下就行。

接下来这句话可能理解起来有点绕,这个VDD3P3管脚3和4是啥?模块上没有这两个管脚啊~

还记得我在前言里面提到过的,ESP8266是乐鑫的芯片,安信可做的模组封装。所以本文上面的原理图截图其实是模块的管脚分布,并不是真实的芯片管脚。真实的模块内部的芯片原理图是什么样?我这里截取其中一部分,看一下:

懂?很简单。

3、第107byte的值的单位是0.1V,有效取值范围是18~38.

这个就很好理解了,第二点已经说了,第107byte写入的是VDD3P3管脚的电压。而我们常用的供电电压是3.3V,所以要写入的值是33。因为单位是0.1V,33*0.1V得到3.3V。

接下来看一下这三个函数,system_adc_read() 刚才已经看了,它的功能就是读取ADC电压值,很简单,直接调用读取就行。

然后是system_get_vdd33(),我们看一下截图:

简单来说,是用来测量VDD3P3管脚上的电压的,可以理解为获取当前的工作电压。工作前提必须要确保ADC管脚悬空,同时确保esp_init_data_default.bin的第127byte值为0xFF。

还有一个函数,快速高精度的AD采样,因为篇幅比较长,这里不截图了,我总结一下。先看函数结构:

system_adc_read_fast(uint16 *adc_addr, uint16 adc_num, uint8 adc_clk_div)

注意事项和函数system_get_vdd33()类似,要限制输入电压值、修改107byte的值为VDD3P3,不同的地方在于,使用快速采样函数的时候,要关闭wifi和所有中断。

参数1:uint16 *adc_addr,ADC连续采样输出的地址指针

参数2:uint16 adc_num,ADC连续采样的点数,范围1~65535

参数3:uint8 adc_clk_div,ADC工作时钟=80M/ adc_clk_div,输入范围8~32,建议值8.

假设我们要连续采样50次,那么可以定义一个50个元素的数组,把数组首地址给参数1,数组大小给参数2,参数3没有特殊情况的话默认输入8.

所以,用过带DMA功能的ADC的童鞋,会发现用法很相似。

接下来进入演示部分,以之前的串口程序为模版,增加AD采样功能,得到的AD值通过串口助手打印输出。代码比较简单,直接看一下主函数部分:

void ICACHE_FLASH_ATTRuser_init(void){    partition_item_t partition_item;    uint16 vdd33 = 33;    uint32 flash_r_w[1024];    uart_init(BIT_RATE_115200, BIT_RATE_115200);    spi_flash_read(0x1fc*4096, flash_r_w, 4096);    flash_r_w[107/4] = flash_r_w[107/4] & !(0xff<107%    flash_r_w[107/4] = flash_r_w[107/4] | 33;    spi_flash_erase_sector(0x1fc);    spi_flash_write(0x1fc*4096,flash_r_w,4096);    system_init_done_cb(system_done);}
>((107%4)*8));\n    flash_r_w[107/4] = flash_r_w[107/4] | 33;\n    spi_flash_erase_sector(0x1fc);\n    spi_flash_write(0x1fc*4096,flash_r_w,4096);\n\n    system_init_done_cb(system_done);\n}"}">

前几行比较简单,就是串口初始化。

接下来就到了修改esp_init_data_default.bin文件中的地方,该文件的地址为什么是0x1fc?

第二节讲程序烧录的时候,曾经说过每个文件的地址,如图:

我的模块是16Mbit的,esp_init_data_default.bin文件的起始地址是0x1fc000,0x1000等于10进制的4096,所以0x1fc000=0x1fc*4096。

而我们要修改的是该文件的第107byte,而读写flash必须要4字节对齐,所以后面对107做了一些换算。理解不了的建议看一下第八节。

VDD33是前面定义的变量,值为33,对应3.3V的供电电压。

很简单吧?

系统初始化完成的回调函数里,我定义了一个软件定时器,每隔3秒读取一次ADC的电压值,并通过串口打印出来:

void system_done(){       wifi_station_disconnect();       os_timer_disarm(&LED_timer);       os_timer_setfn(&LED_timer, (os_timer_func_t *)ADC_OUTPUT, NULL);       os_timer_arm(&LED_timer, 3000, 1); }void ADC_OUTPUT(){       static adc_value = 0;       adc_value = system_adc_read();       os_printf("adc_value is %d\n", adc_value);}

细心的人会发现定义定时器之前有一行代码:

       wifi_station_disconnect();

这是因为我的模块之前保存了某个环境下的wifi账号、密码。即便主函数里没有要求模块连接wifi,上电后它还是会自动连接,并打印相关信息。所以,加入这一行代码,让它不再连接。

这就完了?是的,so easy!

程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里借助串口助手来查看效果。设备上电之后,效果如下所示:

如图所示,上电后开始输出ADC采集到的电压值,前面两个是200多,后面我用手挡住光敏电阻,导致光敏电阻阻值变大,R1分压得到的电压变小,只有40多。

实验完成。

链接:

https://pan.baidu.com/s/1yueZQpULiDklHK22TPqsqA

提取码:tcfa

ESP8266_前言

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03 SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端ESP8266_15天气预报之TCP的GET操作ESP8266_16天气预报之JSON数据的生成与解析ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19 MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

esp8266原理图_ESP8266_22基于自身ADC的电压采样相关推荐

  1. 基于单片机波形发生器PCB原理图报告设计资料-基于单片机比赛计时计分电路仿真设计-基于单片机报警器与旋转灯设计-基于单片机八路数据电压采集报警控制系统-基于单片机病房呼叫系统控制系统设计【毕设课设资】

    1302基于单片机波形发生器PCB原理图报告设计资料-毕设课设原理图程序资料 设计一个信号发生器,能在单片机的基础上控制并产生三角波.方波.正弦波和矩形波,且频率幅度和波形可以通过按键改变. #inc ...

  2. 基于STM32F407使用ADC采集电压实验

    核心板:STM32F407 实验目的:使用ADC采集电压值将其打印在串口助手上 目录 ADC简介 STM32F407 ADC通道对应的引脚 STM32F407中的数据寄存器 ADC 规则数据寄存器 ( ...

  3. 蓝桥杯嵌入式模板的构建——STM32G431RB(LCD和ADC采集电压)

    基于LED和按键的模板来写的 下载工程的链接 蓝桥杯嵌入式模板的构建--STM32G431RB(LED和按键的配置)-其它文档类资源-CSDN下载这个模板亲测有效只写了按键三和按键4对LED进行点灯和 ...

  4. 单片机定时器一1ms12MHz_【51单片机】基于STC89C52RC的多路电压采集系统

    随着经济的飞速发展和科学技术水平的不断提高,智能数据采集系统在工业生产以及科学研究中得到了广泛的应用.在信息化时代,数据和信息无疑成为一种重要的资源,而数据采集系统的出现更是进一步促进了人机交互.对设 ...

  5. STM32L031 ADC管脚电压采样

    STM32L031 ADC管脚电压采样 为了更精确的体现ADC对管脚采样的电压值,需要对当前的供电电压的变化也进行参考计算,涉及到STM32 Internal voltage reference (V ...

  6. 基于单片机串口远程多路温湿度采集仿真-基于单片机ADC0809八路电压采集系统设计-基于单片机16x32点阵多模式显示仿真设计-基于单片机餐厅呼叫控制系统仿真设计-基于STM32单片机的智能水杯设计

    1220基于单片机ADC0809八路电压采集系统设计-毕设课设资料 数码管显示,测量八路电压表. #define addo (5.0/255.0) #define zero 0.005 //用于校准A ...

  7. 基于STM32F407 ADC双通道 PS2游戏机摇杆ADC采集

    基于STM32F407 ADC双通道 PS2游戏机摇杆ADC采集 一.PS2游戏机摇杆概述 1.1PS2游戏机摇杆概述 1.2PS2游戏机摇杆图解 二.硬件连接分析 三.代码实现 3.1 ADC代码 ...

  8. STM32----重温ADC测量电压值

    ADC测量电压值 实现目标使用两个按键控制串口的输出和ADC的转换.使用DMA将ADC数据存放在内存中,然后计算对应的电压值.然后由串口1发送至上位机. 主要讲一下对于按键和串口的配置与之前都一样只是 ...

  9. STC15内部ADC测电压

    STC15内部ADC测电压 当VCC(基准电压)等于5V的时候,我们输入的是4v,那么ADC将4V转换的结果就是4/5*1024=819.2.这是一种比例关系.一般开发板的的基准电压采用的是3.3V.

最新文章

  1. c语言链表找姓,急啊!!!求救了 C语言编一个链表,输出姓名和学号就好
  2. Leecode 1583.统计不开心的朋友
  3. python 第一行输入n表示一天中有多少人买水果_Python编程:从入门到实践——【作业】——第五章作业...
  4. 树莓派下的apache
  5. android—获取网络数据
  6. 杭电2019 数列有序!(STL解法)
  7. Java笔记学习2.2.2 常量与变量 - 常量
  8. javascript的阻止默认事件和阻止冒泡事件
  9. java long类型报错:error: integer number too large
  10. 习题8.16 (简单方法)输入一个字符串,内有数字和非数字字符
  11. 灭绝师太(女博士)、李莫愁(女硕士)、黄蓉(本科生)、小龙女(专科生)可爱
  12. MAC地址克隆是什么意思
  13. RabbitMq 消息中间件介绍初体验
  14. 10.2-控制单元CU的微程序设计
  15. (转载)QTableWidget详细用法总结(非常详细,基本所有常用函数都涉及了)
  16. 分享110个PHP源码,总有一款适合您
  17. Python数据分析实战之物流行业数据分析
  18. 谷歌浏览器恐龙游戏开挂秘诀
  19. VeryCD的名言集锦
  20. 读书笔记:《亿级流量网站架构核心技术 -- 跟开涛学搭建高可用高并发系统》

热门文章

  1. 架构设计-数据访问层简述
  2. spring.net 中配置文件分开储存的写法
  3. Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
  4. 前辈学习C语言的四种方法,实际上不管学什么语言,都行之有效!
  5. C++是什么?怎么学?学完了能得到什么?
  6. 第一次CODING附parentElement.insertBefore使用详解
  7. 程序员该如何合理安排时间呢?
  8. 根本无处可避的广东三游
  9. 分数诚可贵的飞鸽传书2012绿色版
  10. 趣味故事嘛的facebook中文网