格院EP Lab1(嵌入式处理器)-利用PWM控制LED的亮度变化(基于Mbed OS)

Linux PWM子系统 PWM:Pulse width modulation,脉冲宽度调制,在 IC 中,是使用定时器来实现。常见应用于显示器背光灯,马达等。 阅读详情
AI摘要

本文围绕格院EP Lab1,介绍利用PWM控制LED亮度变化(基于Mbed OS)。先解读要求,包括硬件定义、主程序逻辑和渐变亮度实现,考察轮询机制、PWM和循环语句等知识点;后进行代码实现,对重点操作如按钮上拉、占空比限制、消抖等作解释,还给出Lab1完整代码。

本文作者是为了提升自己的知识输出能力以及为同窗,学弟学妹提供思路,所以写了这个系列的栏目。

由于后续会涉及到代码的展示,希望大家谨慎参考,不要直接copy,我的文章最大的作用是分享思路。

话不多说,我们开始吧。

第一步:解读要求

硬件定义

  1. PWM输出:

    • 定义一个PWM输出用于控制LED1的亮度。

  2. 数字输入:

    • 定义两个数字输入用于检测两个按钮的状态(button和button2)。

主程序逻辑

  1. 循环监测按钮状态:

    • 实现一个循环,持续监测两个按钮的状态。

  2. 按钮按下处理:

    • 当第一个按钮被按下时,设置一个标志位,表示需要增加LED亮度。

    • 当第二个按钮被按下时,设置一个标志位,表示需要减少LED亮度。

  3. 亮度调整:

    • 根据按钮按下的状态,逐步调整LED的亮度:

      • 如果第一个按钮被按下,逐步增加亮度。

      • 如果第二个按钮被按下,逐步减少亮度。

      • 如果没有按钮被按下,切换LED的开关状态(开/关)。

渐变亮度实现

  1. 逐步调整亮度:

    • 使用一个循环来逐步增加或减少LED的亮度。

    • 在每次循环中,使用thread_sleep_for()引入延迟,以实现平滑的亮度过渡。

所以我们知道,本实验考察的主要知识点是:1.轮询机制(检测按钮是否被按下) 2.PWM 3. 循环语句(用于提升或者降低小灯的亮度)

 

 第二步:代码实现

我的代码中已经附了注释,但是对于重点知识和某些操作我会专门进行解释

第一块

#include "mbed.h"

#define delaytime 50ms



// 定义1:在A5引脚上为LED设置PWM输出

// 定义2:在D3引脚上为按钮1(增加)设置数字输入,带上拉电阻

// 定义3:在D4引脚上为按钮2(减少)设置数字输入,带上拉电阻

PwmOut LED(A5);

DigitalIn Button1_Increase(D3, PullUp);

DigitalIn Button2_Dncrease(D4, PullUp);



// 初始化占空比为0.5(50%)

float duty_cycle = 0.5f;

 

这里我将按钮进行了上拉操作,上拉以后,按钮的初始状态为高电平。当接地时候则为低电平。

第二块 

// 限制占空比在0.0到1.0之间的函数

void limitDutyCycle() {

    if (duty_cycle > 1.0f) {

        duty_cycle = 1.0f;

    } else if (duty_cycle < 0.0f) {

        duty_cycle = 0.0f;

    }

}

本函数将占空比限制在0-1之间,因为占空比需要是0到1之间的某个小数。

第三块 

        if (Button1_Increase.read() == 0) {

            // 消抖延时

            ThisThread::sleep_for(20);

            // 确认按钮按下

            if (Button1_Increase.read() == 0) {

                // 逐渐增加占空比

                for (int i = 0; i < 20; i++) {

                    duty_cycle = duty_cycle + 0.005f;

                    // 限制占空比

                    limitDutyCycle();

                    // 更新LED亮度

                    LED.write(duty_cycle);

                    // 更新之间的延时

                    ThisThread::sleep_for(50);

                }

            }

        } 

 

        if (Button1_Increase.read() == 0) {

            // 消抖延时

            ThisThread::sleep_for(20);

            // 确认按钮按下

            if (Button1_Increase.read() == 0)

这三个操作是为了消除按键抖动,确保可以真实的感应到按钮被按下。

第五块

 else {

            // 以当前占空比打开LED

            LED.write(duty_cycle);

            // 延时

            ThisThread::sleep_for(300);

            // 关闭LED

            LED.write(0.0f);

            // 延时

            ThisThread::sleep_for(300);

        }

这一模块的用处是在没有按钮被按下的时候,让LEDs闪烁 

以下是Lab1的完整代码

#include "mbed.h"
#define delaytime 50ms

// 定义1:在A5引脚上为LED设置PWM输出
// 定义2:在D3引脚上为按钮1(增加)设置数字输入,带上拉电阻
// 定义3:在D4引脚上为按钮2(减少)设置数字输入,带上拉电阻
PwmOut LED(A5);
DigitalIn Button1_Increase(D3, PullUp);
DigitalIn Button2_Dncrease(D4, PullUp);

// 初始化占空比为0.5(50%)
float duty_cycle = 0.5f;

// 限制占空比在0.0到1.0之间的函数
void limitDutyCycle() {
    if (duty_cycle > 1.0f) {
        duty_cycle = 1.0f;
    } else if (duty_cycle < 0.0f) {
        duty_cycle = 0.0f;
    }
}

int main() {
    // 设置PWM周期为1毫秒
    LED.period_ms(1);

    while (true) {
        // 检查按钮1(增加)是否被按下
        if (Button1_Increase.read() == 0) {
            // 消抖延时
            ThisThread::sleep_for(20);
            // 确认按钮按下
            if (Button1_Increase.read() == 0) {
                // 逐渐增加占空比
                for (int i = 0; i < 20; i++) {
                    duty_cycle = duty_cycle + 0.005f;
                    // 限制占空比
                    limitDutyCycle();
                    // 更新LED亮度
                    LED.write(duty_cycle);
                    // 更新之间的延时
                    ThisThread::sleep_for(50);
                }
            }
        }

        // 检查按钮2(减少)是否被按下
        else if (Button2_Dncrease.read() == 0) {
            // 消抖延时
            ThisThread::sleep_for(20);
            // 确认按钮按下
            if (Button2_Dncrease.read() == 0) {
                // 逐渐减少占空比
                for (int i = 0; i < 20; i++) {
                    // 限制占空比
                    limitDutyCycle();
                    duty_cycle = duty_cycle - 0.005f;
                    // 更新之间的延时
                    ThisThread::sleep_for(50);
                }
            }
        }

        // 如果没有按钮被按下,使LED闪烁
        else {
            // 以当前占空比打开LED
            LED.write(duty_cycle);
            // 延时
            ThisThread::sleep_for(300);
            // 关闭LED
            LED.write(0.0f);
            // 延时
            ThisThread::sleep_for(300);
        }
    }
}

 

嵌入式硬件工程师成长之路·2026(2):电阻与电容选型实战清单——常温能过、高温就漂的 6 个参数 常温测试全绿,45℃ 老化 8 小时就有 3 台采样点漂了 300mV?先别换料。本文按排查顺序拆解:热风枪定位、TCR 误差预算算出温漂只占 22mV,真凶是 X5R 电容的直流偏压衰减。附电阻封装、电容介质、降额系数三张对照表和 5 条避坑清单,单台 9 分钱修完。 阅读详情

相关推荐

HEC-HMS水文建模从入门到精通:手把手教你安装与配置(附常见问题解决)

本文详细指导HEC-HMS水文建模软件的安装与配置,重点解析了基于InstallShield Wizard的安装流程,并提供了针对常见错误代码(如-6003)的解决方案。旨在帮助水文、水利领域从业者快速搭建稳定的建模环境,为后续流域模拟与洪水预报奠定基础。

weixin_29213827的博客 496

Mbed OS 输出 PWM信号

   PWM 脉宽调制是通过改变脉冲信号的波形来控制模拟量的方法。PWM可以用来控制灯光亮度,电机速度,电源电压等等。 PWM 信号是一种脉冲信号,具有下面几个特点: PWM 频率    PWM信号的周期是不变的,而高电平的宽度是变化的。 PWM 占空比   PWM 的占空比=100%*(高电平时间)/(脉冲周期)。PWM 的占空比决定了输出信号的电压平均值,占空比高,输出的平均值就高。...

姚家湾博客 2696

tiktok算法协议研究

经过上述分析,可以确定目标字符串来源于一段 JSON 数据,而这段 JSON 数据来自于一个经过加密的本地文件。对字符串 "sdi_v2" 进行 SHA-1 计算,得到 20 字节的结果;将第一步得到的数据进行MD5计算,生成16字节的结果;将第二步的结果转换为十六进制字符串,从而得到 32 字节的密钥。写这种算法分析的帖子真的是太无聊了,就先分析到这里吧,后续有机会再来谈下被加密的本地文件是怎么来的!!自我感觉TT的算法并不难,就是量太大了,所以我想问问有没有感兴趣的朋友来一起分析,欢迎联系。

2503_90751938的博客 2580

pwm led

pwm led

xiaozhi 2189

基础篇.ARM架构介绍(1)

ARM公司主要向客户提供处理器IP。ARM体系结构是一种硬件规范,主要用来约定指令集、芯片内部体系结构等。以指令集为例,ARM体系结构并没规定每一条指令在硬件IP中如何实现,只是约定了每条指令的格式、行为规范、参数等。

heshuangzong的博客 7805

android mtk camera如何自定义默认拍照与录像分辨率

本文详细解析了在Android MTK平台上自定义相机默认拍照与录像分辨率的方法。通过分析Camera2应用默认选择逻辑,定位并修改PictureSize.java与VideoQualityCaptureRequestConfig.java中的关键代码,实现绕过系统智能选择,强制指定最高或特定分辨率。文章还提供了进阶的可配置化方案与验证避坑指南,帮助开发者精准控制相机行为。

weixin_29194817的博客 433

(done) 嵌入式硬件电路图 (1) 看图的脉络依据

TODO: here。

shimly123456的博客 38

解密HDMI热插拔检测电路:从HPD引脚到EDID读取的全流程避坑

本文深入解析HDMI热插拔检测与EDID读取的全流程,从HPD引脚信号特性、DDC通道I2C协议到EDID数据结构,系统剖析了硬件电路设计、信号完整性和软件协议中的常见陷阱与解决方案,为消费电子设备开发者提供了一套完整的实战避坑指南。

weixin_29291069的博客 647

嵌入式硬件知识-电阻串联、并联核心特性

本章详细讲解电阻串联、并联核心特性

李永奉的博客 346

巨某量引擎后台登录实战笔记 | Playwright自动化框架

自动化框架、Playwright、滑块、巨某量引擎、抖某音系

什么都会一点。 2080

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7283

(done) 嵌入式硬件电路图 (2) 熟悉常用元器件

常见电阻分为 贴片电阻 和 色环电阻。

shimly123456的博客 30

基于STM32L4XX、HAL库的BQ25713RSNR充电芯片驱动程序设计

define BQ25713_I2C_ADDR (0x6B << 1) // 7位地址为 0x6B,HAL库需要左移一位。// 示例:配置 CHARGE_OPTION_0 寄存器:使能充电,使能 ICO(输入电流优化)reg_data |= (EN_CHG_MASK | EN_ICO_MASK);

zhusl6688的博客 406

嵌入式硬件选型|EY406-2131D1 双路互补脉冲长按复位 IC 方案解析

在锂电供电的嵌入式项目开发中,带无线模组的复合系统经常遇到复位不同步问题。主控完成复位,蓝牙、WiFi 射频模块未同步复位,模块状态不一致,出现配网失败、链路锁死等现象。软件长按复位方案在主控跑飞后直接失效,RC 延时电路受温漂、器件离散性影响,量产时序一致性较差。EY406-2131D1 是 SOT23-6 封装纯硬件逻辑复位芯片,依靠硬件计时实现长按识别与双路脉冲输出,可以作为这类场景的备选方案。

ELITECHIPLJW的博客 146

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【STM32】 ADC 完全指南:从模拟信号采样量化到五大架构原理

本文系统介绍ADC核心概念与五大主流架构。模拟信号具时间与幅值连续性,需经采样(满足奈奎斯特准则防混叠)、量化(引入±1/2LSB误差,SNR≈6.02N+1.76dB)、编码三步转为数字信号。重点解析Flash(并行高速但受限于比较器数量)、SAR(逐次逼近,低功耗适合MCU如STM32)、双积分(高精度抗工频,用于万用表)、流水线(高速吞吐)及Σ-Δ(高分辨率,靠过采样与噪声整形)五类架构原理、优缺点与应用场景。强调分辨率≠精度,选型本质是速度、精度、功耗与面积的权衡。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 501

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 329

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

嵌入式:2.STM32底层基础(存储、寄存器、时钟、总线、GPIO、寄存器点灯)

存储系统用来存放程序、数据、设备状态,核心三大作用:存放程序代码、保存运行时数据(全局、局部、栈、堆)、数据持久化(比如W25Q64 Flash,可以搭配文件系统)。

2401_86731574的博客 365

从寄存器层面重学STM32(7)——定时器

本文系统梳理了STM32定时器的架构与工作原理,以时基单元为核心,涵盖计数模式、预分频、影子寄存器及定时周期计算。重点解析输出比较(PWM生成)与输入捕获(脉冲测量)机制,阐明CCR与CNT比较逻辑及波形生成流程。深入探讨通用定时器的从模式(如编码器、触发、门控等)与主模式(TRGO同步),明确主从定时器间信号传递关系。结合寄存器配置(CR1、SMCR、CCMR、CCER等),总结定时器在中断、DMA、PWM输出、信号捕获中的应用,实现精准定时与事件控制。

2403_88517351的博客 310

K210+STM32+LVGL:手搓边缘AI智能安防监控网关

在传统的物联网或嵌入式毕设中,“智能安防”往往沦为“温湿度+蜂鸣器”的简单堆砌。由于单片机(如STM32)算力有限,无法在本地运行复杂的视觉AI模型,导致很多项目只能在云端处理图像,带来高延迟和隐私风险。本文将分享一个真正的边缘计算安防网关项目。我们采用“K210视觉协处理 + STM32F407主控 + LVGL高颜值UI”的分布式架构,完美解决了单芯片算力不足的痛点。项目不仅实现了明火与陌生人脸识别,还加入了多源传感器融合、5秒智能防抖、以及硬件与UI的双向闭环控制,是一套工业级标准的开源方案。

201

STM32 等精度频率计实测:测频法测周法中界频率、双定时器同步闸门与±1误差消除落地

频率测量是电子测量中最基础也最容易做糙的功能:直接数脉冲的测频法在低频段误差爆炸,测周期的测周法在高频段被标准时钟精度拖垮,两者误差曲线存在一个交叉点——中界频率。本文基于STM32F103C8T6,先用TIM3输入捕获分别实现测频法与测周法并实测出各自误差曲线,推导出中界频率约632Hz的分界点;随后针对闸门与被测信号不同步引入的±1误差,升级为TIM3作门控计数器、TIM2作标准时钟的双定时器同步闸门方案,把1kHz~1MHz全频段相对误差从最大0.5%压到0.02%以内;最后落地工程界通用

LCG米的博客 482

【官方原创】LAT1721 使用STM32CubeIDE 调试STM32N6 XIP应用的一种方法

本文我们以STM32Cube_FW_N6_V1.3.0包中Template_FSBL_XIP为例,介绍一种使用STM32CubeIDE在DEV模式下直接调试应用的方法,不需要切换Boot模式。

2501_92678806的博客 562

水深水位传感器(STM32)

本文介绍基于STM32F103C8T6的水深水位传感器实验,采用HS-S37A模块通过导电原理实现水位检测。传感器输出模拟电压,经ADC采集后在OLED显示实时数据。程序通过多次采样求平均值,提升测量稳定性。适用于花盆积水、漏水报警等场景,适合教学与物联网开发。项目代码完整,含初始化、读取与显示功能,资料可于文末获取。

qq_44016222的博客 138

【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置

【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置

ResumeProject的博客 408

STM32移植FreeRTOS(Cmake+CubeMX)

说明:基于STM32F103C8T6最小系统开发板。

2402_84642203的博客 166

STM32 电流采样为什么在开关沿抖:低边电阻、PWM 触发与 ADC 窗口

给 F103 驱动板加电流环时,采样值总在开关沿乱跳,改 PID 和加滤波都没用。这篇从示波器波形讲起,说明低边采样电阻、运放、PWM 触发与 ADC 注入组怎样对齐,以及采样窗口和 RC 滤波为什么不能互相替代。

Sakura_j_h_的博客 148

STM32智能窗户防控系统 云平台

本系统基于STM32F103C8T6,集成温湿度、光照、烟雾、雨滴、人体红外传感器,通过OLED显示数据,支持手动与自动模式。自动模式下依优先级控制步进电机开窗(三档)、风扇通风及蜂鸣器报警;支持阈值调节、ESP8266接入机智云平台,实现远程监控与控制。配备按键与APP双端操作,具备云端数据同步与高清演示视频,功能完整,适用于智能安防场景。

送外卖的工程师 352
下一篇: 【格院】MS Lab代码:exercise 1-9
pickoranges
博客等级 码龄3年 180粉丝 9原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值