【micropython】滑动平均滤波

本文介绍了在微控制器中如何运用滑动平均滤波和加权滑动平均滤波算法,通过Python代码实例展示。通过比较,加权平均滤波对实时数据变化更敏感,适用于需要快速响应的应用。实验结果显示加权平均能提供更平滑的数据输出。

滤波原理:
采用队列方式,当来一个新数据时,将队列里面的最老的数据替换掉。计算队列里面数据的平局值或加权平均值。

例如采样数据为 1,2,3,4,5,6,7,8
滑动窗口为4时:
在这里插入图片描述

1、滑动平均滤波算法

python 程序代码:

from microbit import *

a = [0, 0, 0, 0]
i = 0
while True:
    data = pin0.read_analog()
    a[i % 4] = data
    i 
<think>我们参考用户提供的引用资料,特别是引用[3]中的代码,它展示了如何使用电位器控制LED亮度。用户的需求是使用MicroPython通过电位器控制LED的亮度或状态。 步骤: 1. 硬件连接:将电位器的两端分别连接到3.3V和GND,中间引脚连接到ADC引脚(如GP26)。LED通过一个限流电阻连接到PWM引脚(如GP15),然后接地。 2. 使用ADC读取电位器的电压(0-3.3V),并将其转换为0-65535的数字(因为MicroPython的ADC读取返回16位无符号整数,0-65535)。 3. 使用PWM控制LED的亮度,PWM的占空比设置为电位器读取的,这样LED的亮度就会随电位器的旋转而变化。 根据引用[3]的代码,我们可以写出如下示例代码: ```python import machine import utime # 初始化电位器(连接到GP26,ADC0) potentiometer = machine.ADC(26) # 初始化PWM引脚(连接到GP15) pwm = machine.PWM(machine.Pin(15)) # 设置PWM频率(1000Hz) pwm.freq(1000) while True: # 读取电位器(0-65535) pot_value = potentiometer.read_u16() # 设置PWM占空比(0-65535) pwm.duty_u16(pot_value) # 延时0.1秒 utime.sleep(0.1) ``` 注意:不同开发板的ADC和PWM引脚可能不同,请根据实际使用的板子调整引脚号。 另外,用户可能还想控制LED的状态(如开关),但这里主要是控制亮度。如果要同时控制状态,可以考虑在亮度为0时关闭LED,但PWM占空比为0时LED就是熄灭状态,所以实际上已经包含了开关状态(最低亮度就是熄灭)。 如果用户想要的是状态切换(比如旋转到某个位置时LED亮,另一个位置灭),那么需要设置一个阈,然后控制数字输出。但根据问题,用户要求的是调节亮度,所以使用PWM控制即可。 下面我们按照要求生成相关问题。</think>### MicroPython 电位器调节LED亮度教程 #### 硬件准备 1. **开发板**:支持MicroPython的开发板(如ESP32/ESP8266/RP2040) 2. **电位器**:10kΩ旋转电位器 3. **LED**:普通LED灯(带限流电阻)或PWM兼容LED 4. **接线**: - 电位器两端接3.3V和GND - 电位器中点接开发板ADC引脚(如GP26/GP27) - LED正极接PWM引脚(如GP15/GP16),负极接GND #### 核心原理 1. **ADC读取**:电位器输出$0 \sim 3.3V$模拟电压,ADC转换为$0 \sim 65535$数字 $$ \text{ADC} = \frac{V_{in}}{3.3} \times 65535 $$ 2. **PWM控制**:将ADC直接映射到PWM占空比 $$ \text{亮度} \propto \text{占空比} = \frac{\text{ADC}}{65535} $$ #### 完整代码示例 ```python import machine import utime # 初始化硬件 pot = machine.ADC(26) # 电位器接GP26 (ADC0) led = machine.PWM(machine.Pin(15)) # LED接GP15 (PWM) led.freq(1000) # 设置PWM频率1kHz while True: adc_value = pot.read_u16() # 读取电位器(0-65535) led.duty_u16(adc_value) # 设置LED亮度 utime.sleep_ms(20) # 延时20ms ``` #### 关键参数说明 | 参数 | 推荐 | 作用 | |---------------|-------------|--------------------------| | `PWM.freq()` | 500-1000 Hz | 避免LED闪烁 | | `duty_u16()` | 0-65535 | 16位精度亮度控制 | | 采样延时 | 10-50 ms | 平衡响应速度与CPU占用 | #### 扩展功能 1. **亮度范围限制**: ```python min_brightness = 20000 # 最低亮度阈 max_brightness = 50000 # 最高亮度阈 brightness = min(max(adc_value, min_brightness), max_brightness) ``` 2. **非线性响应曲线**(适合人眼感知): ```python import math gamma = 2.2 # Gamma校正 normalized = adc_value / 65535 corrected = math.pow(normalized, gamma) * 65535 ``` 3. **多LED控制**(如RGB灯带): ```python r_pwm = PWM(Pin(13)); g_pwm = PWM(Pin(14)); b_pwm = PWM(Pin(15)) while True: val = pot.read_u16() r_pwm.duty_u16(val) # 红 g_pwm.duty_u16(65535-val) # 绿(反向) b_pwm.duty_u16(val//2) # 蓝(半亮) ``` #### 常见问题解决 1. **LED闪烁**: - 提高PWM频率至`led.freq(2000)` - 检查电源稳定性 2. **响应不线性**: - 添加`try-except`处理ADC错误 - 使用滑动平均滤波: ```python readings = [0]*5 # 5点滑动窗口 while True: readings.pop(0) readings.append(pot.read_u16()) avg = sum(readings) // len(readings) ``` 3. **低亮度不熄灭**: ```python if adc_value < 1000: # 设置死区阈 led.duty_u16(0) else: led.duty_u16(adc_value) ``` > 提示:实际引脚编号需根据开发板型号调整,ESP32系列GPIO32-39为ADC引脚,RP2040支持所有GPIO的PWM[^3][^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值