ADC 读取电位器旋钮,用回差消除临界值档位跳动

2023-10-29 02:59

本文主要是介绍ADC 读取电位器旋钮,用回差消除临界值档位跳动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

就是比如,用电位器当旋钮做风扇调速,划分出10 个速度档位,对应10 个ADC 转换结果的阈值。如果直接比较阈值,当旋钮拧到临近阈值的地方时,ADC 结果的微小跳动会导致风扇档位在两个级别之间不停左右横跳,因此想到了利用回差来消除抖动。

回差原理

原理很简单,类似拿运放正反馈当迟滞比较器。如果只有两个档位,阈值是500,超过500 是2 档,低于500 是1 档,回差数值是100。那么如果当前位于1 档,电位器往大拧,想要调到2 档,ADC 的值要大于500 + 100 = 600。而如果当前位于2 档,要降回1 档,ADC 的值要小于500 - 100 = 400。

也就是说,阈值是动态的,和当前的位置有关。如果ADC 的值刚好是601,跳到了2 档,然后跳回1 档的阈值就瞬间变成了400,ADC 必须下降200 以上才能跳回1 档。同理,如果下降到400 跳回了1 档,再要到2 档就得上升200。所以只要ADC 的微小抖动范围不超过两倍回差,档位就不会跳动。其实这就是用一个区间替代了单一的阈值,然后原先跟阈值做的比较就变成了和区间上下界的比较。

在这里插入图片描述

回差实现

那么如果有很多档位,又该如何实现回差呢?也很简单,就是先保存当前的档位,判断阈值的时候,大于等于当前档位的所有阈值加上回差,小于的则减去回差,用图来表示就是下面这样:

在这里插入图片描述
图中的意思是,假设ADC 的结果最大值是2000,从0 开始,把ADC 的取值划分为四个档位,进入四个档位的阈值分别是0、500、1000、1500,如果0 < ADC < 500,就代表第一个档位。实际程序中是只用上界来判断档位的,比如:

int 阈值[] = {500, 1000, 1500};// 根据ADC 的值计算出对应的档位
int 计算档位() {for(int i = 0; i < sizeof(阈值); ++i) {if(ADC < 阈值[i]){    // 只用上界,也就是只用小于判断return i;}}return 3;
}

如果ADC 小于500,则为第0 档,否则ADC 肯定大于等于500,后面不用重复判断下界,只用接着判断ADC 是否小于1000。如果表查完了,说明ADC 大于1500,所以返回第3 档。用这种查表法的好处是:

  1. 省去复杂的乘除法。如果单片机不支持硬件直接算乘法,用查表可以省下调用乘法库函数的开销;
  2. 区间划分更灵活,可以方便的按实际需求做修正,实现不均匀的区间;
  3. 可以直观的实现回差,和上面的图对应;

也可以用累加:

int 计算档位() {int 阈值 = 500;for(int i = 0; i < 3; ++i) {if(ADC < 阈值){return i;}阈值 += 500;}return 3;
}

缺点就是不方便实现不均匀的划分。实际应用经常遇到非线性的传感元件,比如光敏或热敏电阻,可以用非线性的阈值表负负得正,给它修正成近似线性的。

然后按上面说的思路,在函数里加上对回差的处理:

int 阈值[] = {500, 1000, 1500};
int 回差 = 100;// 计算ADC 的值对应的档位,需要输入当前的档位来计算回差
int 计算档位(int current) {for(int i = 0; i < sizeof(阈值); ++i) {int r = 阈值[i];if(i >= current) { // 如果是大于等于当前档位的阈值,就加上回差r += 回差;}else {  // 否则减去回差r -= 回差;}if(ADC < r){    // 再用叠加了回差的阈值判断档位return i;}}return 3;
}

用累加法的和这个差不多,就不重复写了。

档位惯性

要是加了回差还不行,比如可能存在一些幅度较大的干扰信号,那么可以考虑再加上惯性:如果要从当前档位跳到其他档位,ADC 必须连续多次采样都跳出了当前档位。也可以叫做弹性吧,一松手就回去了。这和按键消抖的算法差不多,就不写例子了。

这篇关于ADC 读取电位器旋钮,用回差消除临界值档位跳动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297820

相关文章

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

java读取resource/通过文件名获取文件类型

java读取resource java读取resource目录下文件的方法: 借助Guava库的Resource类 Resources.getResource("test.txt") 通过文件名获取文件类型 mongodb java