ESPIDF-ADC
ESPIDF-ADC概述ESP32 集成了 2 个 12-bit SAR(逐次逼近寄存器) ADC,共支持 18 个模拟通道输入。为了实现更低功耗,ESP32 的 ULP 协处理器也可以在睡眠方式下测量电压,此时,可通过设置阈值或其他触发方式唤醒 CPU。通过适当的设置,最多可配置 18 个管脚的 ADC,用于电压模数转换。
ADC通道
ADC1123456789101112/**** `adc1_channel_t` will be deprecated functions, combine into `adc_channel_t` ********/ typedef enum { ADC1_CHANNEL_0 = 0, /*!< ADC1 channel 0 is GPIO36 */ ADC1_CHANNEL_1, /*!< ADC1 channel 1 is GPIO37 */ ADC1_CHANNEL_2, /*!< ADC1 channel 2 is GPIO38 */ ADC1_CHANNEL_3, /*!< A ...
凸包
凸包前置知识凸多边形与凸包在了解凸包之前需要先了解凸多边形 (Convex Polygon)。直观的来看,一个凸多边形就是没有任何凹陷位的多边形,例如三角形、正方形、平行四边形、正五边形、正六边形等等。但是下面的这个“凸”字形却并非凸多边形,因为箭头所指之处实际是一个凹陷位。在数学上,凸多边形有另一个严格的定义。假设在一个多边形上(包括多边形的边界及边界围封的区域)任意取两点,并以一条线连接该两点,如果线段上的每一点,均在该多边形上,那么我们便认为这个多边形是凸多边形。根据上述定义,便可以判断“凸”字形并非凸多边形,下图连接 A、B 点的线段有一部分并不在该多边形上。
凸包概念在了解了凸多边形之后,便可深入凸包 (Convex Hull)了。给定平面上的一个有限点集,这个点集的凸包就是包含点集中所有点的最小面积的凸多边形。用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。例如下图的点集共包含了12个点,图中的五边形便是该点集的凸包,构成五边形的五个点称为“凸包上的点”,其余点并非“凸包上的点”。
向量叉乘定义$$\ve ...
自制 ESP32 开发板
自制 ESP32 开发板前言老早之前就想做一个 ESP32 开发板了,可由于种种原因总是没时间搞,在这大四的最后一学期,终于闲的有时间搞了,可算是千呼万唤始出来。也是废了老多时间了。想着单独画个 ESP32 东西太少了,有点浪费立创每月仅有两次的免费打样机会,于是又加了自动下载模块和电池管理模块。可以说是为了这一碟醋,又包了一碗饺子。
自动下载模块原本想着集成到 ESP32 板子上,但感觉有点浪费,于是给他独立出来了,详情见这篇博客。
电池管理模块电池管理芯片选的是 IP5306,主要优点就是集成了升压转换器、锂电池充电管理和电池电量指示,最重要的是内置电源路径管理,支持边充边放。根据数据手册提供的原理图,单独对该模块进行了打样验证。
原理图
PCB
实物图
ESP32 开发板开发板引出了 TX0、RX0、EN、IO0 接口进行下载,和自动下载模块是匹配的,可以直接进行连接。芯片的全部引脚都已引出可供使用。使用 MicroUSB 进行供电和充电。三个按键分别控制电源管理、RESET 和 BOOT。
BATTERY 按键:
按键持续时间长于 50ms,但小于 ...
ESP32 自动下载模块
ESP32 自动下载模块前言之前在这篇博客中分析了 ESP32 自动下载电路的具体细节,据此画了块板进行下测试,现已打样验证,开源链接见立创。
模块介绍描述使用 CH340C 芯片进行下载,采用 MicroUSB 主要是因为手头刚好有料,要不然就换成先进的 typeC 了。实物上的 TX 误画了一个电阻,用了一大坨锡给短上了,在原理图和 PCB 中都已经更正。
下载时序图通过逻辑分析仪,抓取下载时的电平如下图所示。EN 上升沿和 IO0 下降沿的局部放大图如下所示。
原理图模块原理图如下所示。
PCB模块 PCB 图如下所示。
实物图模块实物图如下所示。
链表多级菜单
链表多级菜单前言闲来无事,整理了一下智能车时期的相关文件,无意中看到了当时写的菜单,主要用来显示车速、陀螺仪角度、裁判系统发送数据以及最重要的调节参数。当时用的是索引法,修修改改的感觉比较麻烦,重新用链表写了一个多级菜单的框架,可以快速添加子目录和绑定功能函数和显示函数,便于以后使用。
介绍菜单结构在多级菜单中。不同级的目录有上下级关系,同级目录中也有上下级的关系,同级位号是为了确认该级目录的个数,在后面的显示和控制部分会用到,功能函数绑定和显示函数绑定则是为了有更大的自由度。
1234567891011typedef struct menu{ struct menu* last; // 父级菜单 struct menu* next; // 子级菜单 struct menu* equal_last; // 同级上一项 struct menu* equal_next; // 同级下一项 int number; // 同级位号 const char* name; // 名称 void (*function)(int); // 功能函数绑定 void (*Show ...
总和最大区间问题
总和最大区间问题前言最近在看从这位大佬借的 《计算之魂》这本书,感觉光看书也就图一乐,看完仍旧是脑袋空空,还是得敲敲代码才能记得牢。
问题描述给定一个实数序列,设计一个最有效的算法,找到一个总和最大的区间。
三重循环方法123456789101112131415161718192021222324252627result TripleLoop(double*p, int length){ double max = 0; int start = 0, end = 0; for (int i = 0; i < length; i++) { for (int j = i; j < length; j++) { double temp = 0; for (int k = i; k < j; k++) { temp = temp + *(p + k); } if (temp > max) { max = temp; start = i; end = j- ...
ESP32自动下载电路分析
ESP32自动下载电路分析前言最近画了块 ESP32 的板子,焊了两块,一块 RESET 有问题,一块 IO0 有问题,导致下载的时候得手动跳线,很是麻烦,于是想搞一下自动下载电路。
硬件原理图分析自动下载电路图(RST应为RTS)
串口流控机制
DTR: Data Terminal Ready,数据终端准备好,低有效
RTS:Request To Send,请求发送,低有效
逻辑关系
ESP32系统启动模式
管脚
默认
SPI Flash 启动模式
下载启动模式
GPIO0
上拉
1
0
GPIO2
下拉
无关项
0
EN
高有效
无关项
无关项
硬件电路逻辑
DTR
RTS
EN
IO0
0
0
1
1
0
1
1
0
1
0
0
1
1
1
1
1
总结当 DTR 和 RTS 同时为 0 或者同时为 1 时,三极管 Q1 和 Q2 均为截止状态,此时 EN 和 IO0 的状态由其他电路决定(内部/外部上拉电阻)。当 DTR 和 RTS 不同时,EN = RTS, IO0 = DTR。要进入下 ...
灰度投影法视频稳像
灰度投影法视频稳像前言做毕设时处理的视频有较大的抖动,影响数据分析,于是查了一下视频消抖的相关资料,准备简单实现一下。
原理视频发生抖动时的最显著特征就是帧与帧之间会发生整体的位移,检测出位移之后再通过进一步的逻辑判定视频是否产生抖动,因此基本上视频的抖动都是围绕着如何检测出这个位移进行的。
检测方案
光流法:光流是空间运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。由于变化的光线会被错误地识别为光流, 因此该方法对光线敏感, 从而会影响到识别效果。光流法比较耗费时间、计算复杂性大,并且抗噪声的能力很差, 在对实时性要求苛刻的情况下并不适用。
块匹配法: 基于块的运动估计,基本思想是将图像序列的每一帧分成许多互不重叠的块,并认为块内所有像素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的块匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。块匹配法的性能取决于:块尺寸的大小,匹配准则以及 ...
Failed to load OpenH264 library
Failed to load OpenH264 library在 OpenCV 中把图片合成视频时报错:Failed to load OpenH264 library: openh264-1.8.0-win64.dll Please check environment and/or download
解决方法去官网下载对应的包。官网地址找到安装路径,我的路径是 D:\OpenCV\opencv\build\x64\vc15\bin ,把下载的压缩包解压放到该目录下即可正常运行。
仿真演示导弹击落飞行目标
仿真演示导弹击落飞行目标参数限制条件
飞行器目标可设定高度5-20km,飞行速度400-800m/s,速度大小不变;但可在飞行水平面机动,机动转向最大速度为0.1rad/s;
导弹初速800m/s,风阻f=-bV, b=0.02m,m为导弹质量;重力加速度9.81m/s^2;
导弹点火提供前进方向推进力,单次推进可持续2s:f=ma, a=100m/s^2;最多可以提供3次点火推进;
导弹基地雷达感知范围40km,飞行器感知导弹范围为20km,导弹进入该范围即启动机动规避;
飞行目标可以在飞行平面转向,转向最大速度为0.1rad/s;不考虑飞行目标垂直方向机动。
导弹算法部分导引律导引律是用来引导飞行器到目的点或与目标相遇的算法。在本项目中,导弹的导引律使用了比例导引法,其核心思想是导弹飞行过程中,导弹速度向量的转动角速度与目标视线的转动角速度成比例。比例导引法导引关系式:$$\frac{d\sigma}{dt} - K\frac{dq}{dt} = 0$$核心实现代码如下: ...