嵌入式之ADC
ADCADC - 模数转换器:以GD32DF330为例,MCU片上集成了12位逐次逼近式模数转换器模块(ADC),可以采样来自于16个外部通道、2个内部通道和电池电压(VBAT)通道的模拟信号。 分辨率假如ADC采样分辨率为12位,输入信号最大值为3.3V,那么这个转换器应能区分出输入信号的最小电压为 3.3 / (2 ^ 12) = 0.806mV 转换时间转换时间是指模数转换器从模拟信号到来开始,到输出端得到稳定的数字信号所经过的时间。假如ADC采样分辨率为12位,那么:总转换时间 = 采样时间 + 12.5个CK_ADC周期 通道采样时间由 ADC_SAMPTn 寄存器配置,共有8种选择(从 1.5采样周期 到 239.5采样周期)。例如: CK_ADC为6MHz ,采样时间配置为55.5个采样周期,那么总的转换时间为:”55.5 + 12.5”个 CK_ADC 周期,即(1 / 6000000) * (55.5 + 12.5) = 0.0113us =...
嵌入式之队列
队列顺序队列顺序队列存在假溢出的现象:假溢出是指在使用顺序存储队列时,队列作为存储区还没有满,但由于队列的操作规则(队首删除、队尾插入),导致队尾指针已经占满了所有空间,而队首仍有空闲单元的现象。 假溢出的原因:假溢出的原因在于顺序存储队列的操作规则。队列允许在队首进行删除操作,在队尾进行插入操作。当队尾指针达到数组的最大容量时,如果队首指针不指向数组的起始位置,队列中仍然有空闲单元,但再进行入队操作会导致假溢出。 解决:可采用循环队列 循环队列将队列看成首尾相连的循环队列,通过牺牲一个单元来判断队列是否满。具体实现可以通过以下方式:牺牲一个单元:当队尾指针加一等于队首指针时,判断为队列满,即 (tail + 1) % QUEUE_SIZE ==...
嵌入式之二分法
二分法代码实现以下是一个简单的例子:根据ADC值查找对应温度值 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152unsigned short ADC_Table[101] = { 3999, 3967, 3961, 3954, 3947, 3940, 3932, 3924, 3916, 3907, 3899, 3889, 3880, 3870, 3860, 3850, 3839, 3827, 3816, 3804, 3791, 3779, 3766, 3752, 3738, 3724, 3708, 3693, 3676, 3660, 3643, 3625, 3607, 3589, 3570, 3550, 3530, 3510, 3489, 3468, 3446, 3424, 3401, 3378, 3354, 3330, 3306, 3281, 3255, 3229, 3203, ...
嵌入式之IIC协议及其相关
IIC协议协议:协议简单来说就是主机与从机双方约定一组动作,只要一方做了特定的动作,另一方就可以知道你要干什么,然后就可以给出特定的回复动作,多次重复就可以实现通信。 以下是我总结的IIC读写的步骤,仅供参考:IIC 读数据:发送起始信号发送从机地址 - 发送(写入)发送寄存器地址起始信号发送从机地址 - 接收(读取)接收数据发送停止信号 IIC 写数据:发送起始信号发送从机地址 - 发送(写入)发送寄存器地址发送数据发送停止信号 软件模拟IIC实现与硬件IIC由于在IIC总线的通信过程中,时钟信号由主设备产生,从设备根据时钟信号进行数据传输(即同步通信)。故可通过代码方便地模拟该协议,也即所谓的模拟IIC协议。不过,对于异步通信来说,软件就没办法进行模拟了,比如常见的串口通信。 在软件模拟 IIC 时 GPIO...
OrangePi zero 3
OrangePi ZERO 3最近刷视频突然有了个买块开发板的念头,而且这个念头一形成就挥之不去;忍耐了几周,终于还是下手了! 由于是第一次买Orangepi,且网上关于Orangepi的资料也不如Raspberry pi,故记录一下使用过程,方便之后查阅。 刷 Ubuntu 系统参照网上教程,不多赘述 不过需注意一点:要找适合自己开发板内存的系统镜像 刷完使用串口线连接电脑与板子即可,我使用的工具是:MobaXterm 部署博客开发板架构刷完系统先看下镜像版本与开发板 CPU 架构 查看版本 1lsb_release -a 查看架构 1uname -m (或 arch) 返回参数说明: x86_64、x64、AMD64 是同一个东西,都为x86架构; aarch64 是 ARM 架构的 64 位版本 要根据架构选择对应的源!否则在 sudo apt update...
单片机while循环一次时间是多少
单片机while(t–)延时时间怎样获取先打开keil, 找到 魔法棒 -> Debug -> Use Simulator,将该选项选上, 然后进 Debug 模式 12345678910111213void My_Delay(void){ int i = 20; while(i--);}int main(void){ while(1) { My_Delay(); }} 在左侧栏选择 Register 有个 Sec 可计程序运行时间(单位为秒) 可精确到 us 级 单步运行,然后算出时间差值即可知道 while 的延时时间
嵌入式之红外通信
红外通信原理发送过程数据 -> 编码 -> 调制 -> 发送电路 数据:假设发送的数据为 0XA5,二进制为:10100101 编码:用脉冲宽度编码(Pulse Width Encoding)来表示二进制数据。每个数据位由一系列的脉冲组成,逻辑0和逻辑1分别由不同的脉冲宽度表示。现假设如下: 逻辑0为:0.5ms高 + 0.5ms低; 逻辑1为:1ms高 + 0.5ms低; 调制:就是把编码数据放到一定频率的载波上面,即使用数据调制载波,形成一串脉冲信号 发送电路:即:红外灯珠对脉冲信号的发送 + 脉冲信号的放大 接收过程接收电路 -> 解调 -> 解码 -> 数据 接收电路:接收发过来的红外信号 解调:当红外接收管接收到调制信号时,输出高电平,否则输出为低电平 解码:解调后将得到的一系列脉冲变为二进制 数据:解码后即可得到发来的数据,即 0XA5...
Ubuntu服务器部署FRP内网穿透
下载FRPFRP - Github下载地址 选择合适自己电脑及服务器的架构,然后下载解压即可,我这里用0.44.0版本 上传至服务器并进行配置赋予frps可执行权限: 1chmod +x frps 我的服务器端 frps.ini 配置如下,可参考一下: 1234567891011121314151617181920212223[common]bind_addr = # 你服务器的内网IPbind_port = 7000bind_udp_port = 7000kcp_bind_port = 7000vhost_https_port = 7001# 仪表盘的相关设置dashboard_addr = # 你服务器的内网IPdashboard_port = 7500dashboard_user = admindashboard_pwd = admin# 是否记录日志log_file = ./frps.loglog_level = infolog_max_days = 3authentication_timeout =...
Ubuntu下不使用各类面板建站
前言恰逢国庆中秋双节放假,闲来无事,想着搞点什么玩玩;思来想去,还是写个博客吧! 由于之前建站都是使用的宝塔或者直接docker部署,感觉对于Linux指令的掌握没什么进步;就想着不使用面板来建个站,虽然不便管理,但学习嘛,不怕困难。 准备 服务器及域名 爱折腾的心 过程1. Apache更新源 1sudo apt update 安装 1sudo apt install apache2 查看apache运行状态 1sudo systemctl status apache2 开机自启Apache 1sudo systemctl enable apache2 修改配置文件 1vim /etc/apache2/apache2.conf 12345<Directory /var/www> # 这里是自己的网站目录 Options Indexes FollowSymLinks AllowOverride None Require all granted</Directory> 修改端口文件 1vim...