• 发文章

  • 发资料

  • 发帖

  • 提问

  • 发视频

创作活动
0
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
返回

电子发烧友 电子发烧友

  • 全文搜索
    • 全文搜索
    • 标题搜索
  • 全部时间
    • 全部时间
    • 1小时内
    • 1天内
    • 1周内
    • 1个月内
  • 默认排序
    • 默认排序
    • 按时间排序
  • 全部板块
    • 全部板块
大家还在搜
  • FPC排线金手指封装模版

    FPC排线金手指一般没有现成封装,LAYOUT比较耗时间,嘉立创FPC画了几个封装模版,有单排手指,和双排手指的,可以参考,需要的自行下载

    2025-12-27 11:38

  • LED灯珠寿命如何提升50%

    \"不是宣传说LED灯珠能用5万小时吗?怎么我家的电饭煲的指示灯一年就坏了?\"\"同样是LED灯,为什么别人家的三年不坏,我家的三个月就坏了?\" 在电子设备的显示与信号指示系统中,LED 灯珠的损坏往往直接导致功能失效,“LED 灯珠容易坏吗” 成为从业者与采购方的核心关切。实则 LED 灯珠本身属于长寿命元器件,理论上不易损坏,但实际应用中受品质、电路、环境等多重因素影响,损坏概率差异显著 —— 优质 LED 灯珠在合理使用下可稳定工作5万小时,劣质产品则可能短期内失效。如果按每天使用6小时计算,理论上可以使用20多年。 但现实却很骨感——很多电子设备的LED灯珠却是在一两年内就损坏了。问题出在哪里?今天我们就来一探究竟。 ​ LED灯珠,究竟有多\"长寿\"? 在理想条件下,LED灯珠是当之无愧的\"寿星\"。其寿命远超过传统照明产品,这主要得益于它的发光原理:直接将电能转换为光能,没有灯丝等易损件。 但这里必须澄清一个关键概念:LED的寿命通常不是指\"死灯\"(完全不亮),而是指光衰——当光通量降至初始值的50%时,即认为寿命终止。也就是说,很多\"坏掉\"的LED灯其实只是变暗了,而非完全不亮。 为什么你的LED灯珠\"短命\"?五大元凶浮出水面 1. 散热不良:寿命的\"头号杀手\" 温度对LED寿命的影响是决定性的。实验表明,LED灯珠理想工作温度在-5℃到0℃之间,虽然这在实际应用中难以实现,但控制工作温度至关重要。 为什么会这样?因为LED在工作时只有部分电能转化为光能,其余转化为热能。如果散热不良,热量积聚导致结温升高,会加速光衰,显著缩短寿命。 在实际案例中,当100颗LED白灯密集排列(间隔仅11.4mm)同时工作时,中间部位灯珠温度可能高达65℃,大大加速光衰过程。 2. 驱动电源:最薄弱的环节 LED灯珠理论寿命可达5万小时以上,而劣质驱动电源的寿命可能只有0.5-3万小时。没有优质的驱动电源,再好的灯珠也难以发挥其长寿潜力。 市面上常见的驱动电源主要有两种: 阻容驱动:成本低,但可靠性差,故障率高。灯珠工作电流会随市电电压波动,严重影响寿命 恒流驱动:能提供稳定电流,避免电流波动导致的过热和损坏,是延长LED寿命的关键 有厂家曾对一批驱动电源进行老化测试,整批1000个样品中,不良率高达30%以上,问题多发生在老化30-80分钟时。 3. 材料质量:从根源决定寿命 芯片质量是灯珠的\"心脏\",直接决定产品的寿命和光衰速度。不同品质的LED芯片关键差异在于光衰速度——高品质芯片光衰小,寿命更长。 封装材料同样至关重要。普通环氧树脂封装LED白灯在30度环境下点亮1000小时后,光衰可能高达70%;而采用优质胶水封装的产品,在同等条件下光衰可控制在6%以内。 支架材料也是重要因素。铜支架导热系数(398W/m·K)远超铁支架(约50W/m·K),散热性能相差近8倍。 4. 机械结构与工艺缺陷 LED制造过程中的工艺问题也会严重影响可靠性: 键合工艺不当:键合力过大会压伤芯片,过小则导致键合强度不足 封装缺陷:封装体内气泡会导致水汽积聚,引线腐蚀 机械应力:在SMT工艺流转、运输中外部撞击可能导致内部绑定线断裂 5. 使用环境与方式 环境温度:在相同散热条件下,环境温度越高,灯珠寿命越短 频繁开关:导致LED灯珠经历反复的热胀冷缩,加速材料老化 驱动电流:研究表明,将驱动电流从标准的20mA降低到14mA,可大幅延缓光衰 如何延长LED灯珠寿命?五大实用建议 重视散热设计:确保灯具散热面积足够大,避免将灯具安装在密闭空间。对于大功率LED,考虑增加散热片或风扇 选择优质驱动电源:优先选择恒流驱动而非阻容驱动。查看产品是否有3C认证,确保内置保险丝等安全设计 合理安装与使用:避免不必要的频繁开关。注意安装方向——例如LED射灯应向下安装,便于热量散发 定期清洁维护:灯珠表面灰尘和污垢会降低散热效果,导致工作温度升高。定期清洁可有效延长寿命 选择可靠品牌:购买时优先选择知名品牌,如洲创LED灯珠、欧司朗等品牌 LED灯珠本身是一种长寿命、高可靠性的光源,但其潜力的发挥需要优质的配套元件、合理的设计和正确的使用方式作为支撑。为帮助客户降低LED灯珠损坏率,东莞市洲创实业有限公司提供样品支持与技术对接服务:客户可申请LED灯珠样品进行极限环境与参数测试;FAE团队会协助排查电路设计、焊接工艺、环境适配等问题,提供限流保护、防潮散热的优化方案。总之,LED 灯珠本身不易坏,损坏多由电流过载、电压冲击、环境恶劣、操作不当及品质缺陷导致。东莞市洲创实业有限公司 15 年专注LED灯珠定制生产厂家,所产 LED 灯珠抗损性与稳定性优异,结合丰富产品线与强大客户背书,是电子企业采购耐用LED 灯珠的可靠合作伙伴。

    2025-12-27 10:12

  • 【瑞萨RA6E2地奇星开发板试用】点亮 WS2812 全彩点阵屏

    WS2812 是彩色灯珠控制芯片,可以控制 RGB 三色灯珠混合呈现出 16M 种颜色,WS2812 有单颗芯片形式,需要外接 RGB 灯珠,也有集成 WS2812 的 RGB 灯珠。 WS2812 通过单总线方式控制,只需一个 IO 口,就可以点亮数千个灯珠。 这里使用 RA6E2 点亮 WS2812 灯珠,效果如下: WS2812 可以使用 IO 模拟时序控制,也可以使用 PWM 和 SPI 方式控制,IO 口模拟时序会占用较多 CPU 时间 这里使用 SPI 控制方式,接口定义如下: 引脚 功能 P207 MOSI(DIN) 通过 SPI 的 MOSI 引脚,可以模拟出 WS2812 所需的时序 使能硬件 SPI0 功能,在 RASC 上配置如下: 引脚配置: SPI 外设配置: 配置 SPI0 速率 4Mbps,使能后即可使用以下函数初始化 SPI0 接口: fsp_err_t err = R_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg); 使用以下函数发送数据: fsp_err_t err = R_SPI_Write(&g_spi0_ctrl, &dat, 1, SPI_BIT_WIDTH_8_BITS); WS2812 的控制时序一般是 800Kbps 左右,这里使用 1Mbps,SPI 配置为 4Mbps, 使用 4bit SPI 数据模拟 1 bit 单总线数据 ,1 像素图像数据需要占用 12 字节内存 设置好 SPI 接口后,就可以进行初始化寄存器配置和图像显示了,SPI 发送 0x0E 代表发送 bit1,发送 0x08 表示发送 bit0,先发 G 再发 R 最后发 B,高位在前 最后进行 HSV 转 RGB 的色域转换过程,HSV 会使颜色过渡更为自然 for (j=0; j<8; j++) { for (i=0; i<8; i++) { Canvas_SetPenColor(canvas, Color_HSV_RGB888(360/8*((i+x)%8), 1, 0.01)); Canvas_Point(canvas, i, j); } } WS2812_Draw(Image_DataPtr(image), 64); 绘制效果见视频

    2025-12-27 03:28

  • 【瑞萨RA6E2地奇星开发板试用】PWM 驱动舵机

      本篇使用 RA6E2 的 PWM 输出,来驱动舵机转动,使用 RA6E2 驱动舵机非常方便,只要配置好 GPT PWM 模块,就能轻松实现角度控制。 硬件准备 1、RA6E2 开发板 2、舵机 3、杜邦线若干 接线方式 舵机: 开发板引脚 舵机引脚 3V3 VCC GND GND P206 SIGN 软件说明 舵机: • 舵机接受 50 Hz(周期 20 ms)PWM,脉宽 0.5–2.5 ms 对应角度 0–180° 占空比对应角度: • 0.5 ms → 0° • 1.5 ms → 90° • 2.5 ms → 180° 在 RASC 软件里进行 PWM 配置: 时钟配置: GPT 外设使用 PCLKD 时钟,默认设置为 2 分频 100MHz 由于 RA6E2 只有 16 位定时器,100MHz / 50Hz = 2000000 > 65535,100MHz 时钟无法产生 50Hz 的低频,要使 PCLKD 时钟低于 3.2768MHz 才能产生 50Hz PWM 将 PCLKD 时钟设置为最低,64 分频 3.125MHz,RA6M4 等有 32 位定时器,这里可以设置 100MHz 调低 PCLKD 后, PCLKA 和 PCLKB 也需要调低才能使用,会影响到 UART/SPI 等最大速率,需要确认 引脚配置: 这里使用 GPT5 GTIOC5B 通道,对应引脚 P206 PWM 外设配置: 使能引脚输出 配置完成后,编写代码输出波形,使用逻辑分析仪测量脉冲信号如下: 由于是 3.125M 的时钟,设置 50Hz 即 20ms 的值如下: (3125000 / 50 = 62500) R_GPT_PeriodSet(&g_timer5_ctrl, 62500); 设置 1.5ms 脉宽的值如下:R_GPT_DutyCycleSet(&g_timer5_ctrl, 4688, GPT_IO_PIN_GTIOCB); 代码如下: void PWM_Demo(void) { fsp_err_t err = R_GPT_Open(&g_timer5_ctrl, &g_timer5_cfg); assert(FSP_SUCCESS == err); (void) R_GPT_Start(&g_timer5_ctrl); R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS); err = R_GPT_PeriodSet(&g_timer5_ctrl, 62500); assert(FSP_SUCCESS == err); R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS); while (1) { R_GPT_DutyCycleSet(&g_timer5_ctrl, 1563, GPT_IO_PIN_GTIOCB); Delay_Ms(1000); R_GPT_DutyCycleSet(&g_timer5_ctrl, 4688, GPT_IO_PIN_GTIOCB); Delay_Ms(1000); R_GPT_DutyCycleSet(&g_timer5_ctrl, 7813, GPT_IO_PIN_GTIOCB); Delay_Ms(1000); R_GPT_DutyCycleSet(&g_timer5_ctrl, 4688, GPT_IO_PIN_GTIOCB); Delay_Ms(1000); } }

    2025-12-27 03:27

  • 【EASY EAI Nano-TB(RV1126B)开发板试用】+桌面系统安装及测试

    EASY-EAI-NANO-TB固件是不带桌面系统的,对于使用桌面系统的用户需自行安装。完成一定要使用系统具备下载程序的能力,前面以介绍了建立网络通信的方法,以此为基础即可进行桌面系统的安装。 1)执行指令安装xfce、lightdm等桌面系统所需软件 2)执行指令创建override.conf 其中,override.conf的内容为: 3)手动选择lightdm 在连接显示屏的情况下,重启板卡即可在屏幕上显示桌面系统,见图1所示。 图1 进入桌面系统 此时,需要输入密码:123456进行登录,见图2所示。 值得指出的是,桌面系统是支持键盘和鼠标的,为此在上电前应连接好键盘和鼠标,见图3所示。 图3 连接键鼠 完成登录后,呈现的桌面形式如图4所示。 图4 桌面形式 系统所提供的相应功能可使用左上角的功能菜单来选取,见图5所示。 图5 功能下拉菜单 使用桌面的文件夹图标可进行相应的文件操作,见图6所示。 图6 文件操作 打开指令窗口可以指令方式进行操作,见图7所示。 图7 指令操作 使用系统所提供的绘图工具可进行绘画操作,见图8所示。 图8 绘制工具 此外,在安装网页浏览器的情况下还可进行网页浏览,见图9所示。 图9 网页浏览

    2025-12-26 23:53

  • 【EASY EAI Nano-TB(RV1126B)开发板试用】+网络通信及测试

    要进行桌面的安装,必须建立相应的程序下载通道,不是通过网络,就是通过WIFI或蓝牙。 这里是选取网络的方式,开发板上网口的位置及连接方式如图1和图2所示。 图1 网口位置 图2 网络连接 通过相应的指令,可查看开发板网络配置的存放路径,其指令为: ls /etc/netplan 所得到的结果如图3所示,其中存在4个配置文件。其中,50-eth0-init.yaml是与NET0相关的netplan配置,51-eth1-init.yaml是与NET1相关的netplan配置。 图3 测试结果 通过PING指令可测试网络的状态,其测试结果如图4所示,说明网络处于连接状态可以进行使用。 图4 网络测试

    2025-12-26 22:44

  • 【EASY EAI Nano-TB(RV1126B)开发板试用】+固件烧录与更新

    在网盘中,提供了3个版本的的固件,见图1所示。 图1 固件资源 既然是3个版本,那就选取版本最新的来安装啦,就入其目录有4个文件及文件夹,其用途见图2所示。 图2 内容说明 由tools文件夹,依靠路径tools/windows/RKDevTool/RKDevTool_Release就会找到烧录工具RKDevTool.exe,见图3所示。 图3 烧录工具 当双击该文件,即可启动它,其界面如图4所示。 图4 软件界面 在烧录前,必须按图5所示进行连接和设置。 图5 准备条件 随后,按图6所示的按键位置,来进入Loader模式,其步骤为先按下LOAD键,再单击RESET按键,等待3~4秒后再松开LOAD按键即可。 图6 按键位置 在进入Loader模式后,烧录软件的状态如图7所示。 图7 进入烧录状态 此时,点击执行按钮,即可进行烧录。在完成烧录后,其状态如图8所示。 图8 完成烧录 后续,就可进行桌面的安装及验证。

    2025-12-26 21:58

  • DLP4500无法投影且有轻微声音,黄灯闪烁

    DLP4500开机后观察到黄灯闪烁,连接GUI没问题,进入Seq. Running之后没有投影,且有轻微声音,可能是什么问题

    2025-12-26 21:29

  • 基于米尔核心板的V2G通信开发:MSE102x GreenPHY实战

    一、引言:V2G革命的技术核心随着电动汽车融入电网进行双向能量交换(V2G)成为趋势,构建可靠的桩-车通信链路是实现智慧能源调控的基础。在此体系中,充电桩通信控制器(SECC)扮演着核心枢纽角色,其与电力线载波通信(PLC)芯片的协同设计与调试,直接关系到整个交互系统的稳定与效率。本文以米尔核心板为硬件平台,结合联芯通MSE102x GreenPHY芯片,详解一套可落地的V2G通信开发与调试方案,旨在为相关开发提供实践参考。 二、联芯通MSE102x芯片介绍联芯通MSE102x系列芯片是一款面向智能电网与电动汽车充电场景的高集成度电力线载波通信(PLC)芯片。它严格遵循国际GreenPHY通信标准,专为高可靠、低功耗的能源互联网应用而设计。该芯片的核心优势在于其灵活的双主机接口架构:既支持RMII(精简介质独立接口),可实现与处理器MAC层的高速、稳定对接,满足数据密集型通信需求;也支持SPI(串行外设接口),为布线受限或系统集成度要求高的场景提供了简洁、灵活的连接方案。这种设计允许开发者根据具体的硬件布局、性能要求和成本预算,在两种主流的通信接口中灵活选择,从而优化整体系统设计。此外,MSE102x芯片内部高度集成了PLC调制解调器、模拟前端(AFE)以及必要的控制单元,大幅减少了外围元件数量,有助于简化PCB设计、提升系统可靠性并降低整体方案成本,是构建新一代V2G通信系统的理想选择。核心特性:l 双接口支持:兼容RMII(用于高速MAC层通信)和SPI(用于灵活从设备连接)。l GreenPHY标准:专为智能电网和电动汽车充电优化,实现低功耗、高可靠性的电力线通信。l 高集成度:集成了PLC调制解调器、模拟前端和主机接口,简化系统设计。 MSE102x系统框图 三、方案一:RMII接口调试实战硬件连接:MSE102x通过RMII接口与米尔核心板MYC-YF13X的ETH1控制器连接,实现MAC层直接通信。软件配置关键步骤:1. 设备树(DTS)修改 修改文件:arch/arm/boot/dts/myb-stm32mp135x-base.dtsicð1 { status = \"okay\"; pinctrl-0 = <ð1_rmii_pins_a>; pinctrl-1 = <ð1_rmii_sleep_pins_a>; pinctrl-names = \"default\", \"sleep\"; phy-mode = \"rmii\"; max-speed = <100>; st,ext-phyclk; fixed-link {speed = <100>;full-duplex; };}; 2. 引脚复用(Pinmux)配置 修改文件:arch/arm/boot/dts/myb-stm32mp13-pinctrl.dtsiceth1_rmii_pins_a: eth1-rmii-1 { pins1 {pinmux = , /* ETH_RMII_TXD0 */, /* ETH_RMII_TXD1 */, /* ETH_RMII_TX_EN */, /* ETH_MDIO */; /* ETH_MDC */bias-disable;drive-push-pull;slew-rate = <1>; }; pins2 {pinmux = , /* ETH_RMII_RXD0 */, /* ETH_RMII_RXD1 */; /* ETH_RMII_CRS_DV */bias-disable; };}; 测试结果:系统成功识别eth1网络设备,可通过ifconfig eth1 up启用并测试通信。此方案为V2G应用提供了稳定、高速(100Mbps)的网络通信基础。 RMII接口测试效果 四、方案二:SPI接口调试详解硬件连接:MSE102x作为SPI从设备连接到米尔核心板MYC-YF13X的SPI1接口,适用于布线受限或硬件设计需要简化的场景。软件配置关键步骤:1. SPI设备树配置 修改文件:arch/arm/boot/dts/myb-stm32mp135x-base.dtsic&spi1 { pinctrl-names = \"default\", \"sleep\"; pinctrl-0 = <&spi1_pins_a>; pinctrl-1 = <&spi1_sleep_pins_a>; cs-gpios = <&gpioa 4 0>; status = \"okay\"; mse102x@0 {compatible = \"vertexcom,mse1021\";reg = <0>;interrupt-parent = <&gpioi>;interrupts = <1 IRQ_TYPE_EDGE_RISING>;spi-cpha;spi-cpol;spi-max-frequency = <7142857>; /* 约7.14MHz */ };}; 2. SPI引脚配置 修改文件:arch/arm/boot/dts/myb-stm32mp13-pinctrl.dtsicspi1_pins_a: spi1-0 { pins1 {pinmux = , /* SPI1_SCK */; /* SPI1_MOSI */bias-disable;drive-push-pull;slew-rate = <1>; }; pins2 {pinmux = ; /* SPI1_MISO */bias-disable; };}; 测试结果:系统启动后,通过dmesg | grep spi或dmesg | grep mse102x可确认设备识别成功,并生成相应的网络接口(如plc0),可通过PLC链路建立V2G通信。 SPI接口测试效果 五、方案对比与选型建议对比维度RMII接口方案SPI接口方案 通信速率高(100Mbps)中(取决于SPI时钟,通常<10MHz) 硬件复杂度较高,引脚数多,需严格遵循布线时序较低,连接线少(SCK, MOSI, MISO, CS) 软件驱动使用标准Linux网络子系统,配置相对简单需特定的SPI驱动和协议栈 适用场景对通信速率和实时性要求高的核心V2G通信对布线空间有限、成本敏感或作为辅助通信通道的应用 优势带宽高、延迟低、吞吐量大硬件设计灵活、占用引脚少、成本低 劣势PCB布线要求高,引脚占用多通信速率相对较低,协议开销可能较大选型建议:l 选择RMII方案:若您的V2G应用需要频繁传输大量数据(如实时能源数据、高清认证信息),且硬件PCB有足够的空间进行差分走线设计。l 选择SPI方案:若项目对成本敏感,硬件尺寸受限,或通信数据量不大,主要用于传输控制命令和状态信息。 六、常见调试问题与解决方案1. 问题:设备树修改后系统无法启动l 排查:使用dtc工具检查设备树语法:dtc -I dtb -O dts -o my-check.dts my-board.dtb。l 解决:确保引脚复用(pinmux)配置与硬件原理图完全一致,特别是“AF”功能编号。2. 问题:RMII接口链路无法UP(ifconfig eth1 up失败)l 排查:检查时钟。RMII需要稳定的50MHz参考时钟(由核心板或外部晶振提供)。l 解决:确认设备树中st,ext-phyclk或phy-mode设置正确,并用示波器测量时钟引脚。 3. 问题:SPI通信时数据出错或中断无法触发l 排查:检查SPI模式(CPHA/CPOL)是否与MSE102x芯片要求匹配。l 解决:调整设备树中的spi-cpha和spi-cpol属性;确认中断引脚配置和电平触发方式正确。4. 问题:PLC通信链路不稳定l 排查:排除电网噪声干扰。电力线环境复杂,噪声大。l 解决:确保MSE102x的模拟前端(AFE)电路设计符合推荐布局,耦合电路参数正确,必要时在软件端启用重传和纠错机制。 七、结语通过米尔MYC-YF13X核心板与联芯通MSE102x GreenPHY芯片的成功适配,我们验证了RMII和SPI两种通信接口方案的可行性。该实战方案为开发高可靠性、高效率的V2G通信系统提供了清晰路径,有助于加速电动汽车与智能电网的融合进程。开发者可根据具体的项目需求(性能、成本、布板空间),灵活选择接口方案,并参考本文提供的设备树配置与调试要点,快速完成SECC通信部分的原型开发与产品集成。

    2025-12-26 19:48

  • 【瑞萨RA6E2地奇星开发板试用】串口通信+DHT11测量温湿度

    实现效果如上视频。 首先先要了解DHT11温湿度传感器的原理。 DHT11温湿度传感器DHT11包括一个电阻式感湿元件和一个NTC测温元件。这两个获取温湿度数据的方式都差不多,利用湿(温)敏元件的电气特 性(如电阻值),随湿(温)度的变化而变化的原理进行湿(温)度测量。 DHT11使用的是单总线通信,即发送数据与接收数据都在一根数据线上,通过规定的时序进行控制。此完成一次数据读取需要进行起始信号、响应信号、数据接收、结束信号。 DHT11模块一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和,湿度小数部分数据一直为0。 像文档中的示例: 示例一:接收的40位数据分别为: 校验和为 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001,与接收的数据一致 湿度为 0011 0101 + 0000 0000 = 35 + 0 = 35%RH 温度为 0001 1000 0000 0100 = 24 + 4 = 24.4℃ (第一次用这个模块,我在看的时候其实不理解,为啥湿度的高八位读法是4位一读,但是温度的高八位读法是2进制读法,两者不一样,哈哈就是不一样,因为湿度用 BCD 拆分法,温度直接用二进制直转法) 直接导入官方给的模块移植部分关于DHT11的项目,使用GNU,特别一定注意配置,GPIO引脚和软链接之类(因为我总卡在这儿) DHT11和地奇星连线: 模块 开发板 VCC 5V DAT P407 GND GND 地奇星和USB TO TTL连线: 模块 开发板 VCC 3.3V TXD P100 GND GND RXD P101 dht11.c: /* * 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源 * 开发板官网:www.lckfb.com * 文档网站:wiki.lckfb.com * 技术支持常驻论坛,任何技术问题欢迎随时交流学习 * 嘉立创社区问答:https://www.jlc-bbs.com/lckfb * 关注bilibili账号:【立创开发板】,掌握我们的最新动态! * 不靠卖板赚钱,以培养中国工程师为己任 */ #include\"bsp_dht11.h\" #define DHT11_DEBUG0 // 调试信息 1:开启 0:关闭 #define DHT11_TIMEOUT1000 // 超时阈值 /****************************************************************** * 函 数 名 称:DHT11_Init * 函 数 说 明:配置DHT11的初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ voidDHT11_Init(void) { //调用 R_IOPORT_Open 函数来初始化 IOPORT 模块 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); /* 设置DHT11数据引脚输出高电平 */ DATA_GPIO_OUT(1); delay_1ms(100); // 等待DHT11稳定 } /****************************************************************** * 函 数 名 称:DHT11_GPIO_Mode_OUT * 函 数 说 明:配置DHT11的数据引脚为输出模式 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ #define DHT11_DAT_GPIO_PIN BSP_IO_PORT_04_PIN_07// DHT11数据引脚 staticvoidDHT11_GPIO_Mode_OUT(void) { // 在运行过程中配置DHT11数据引脚为输出模式 // 这里使用R_IOPORT_PinCfg函数配置引脚 fsp_err_t err = R_IOPORT_PinCfg(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_HIGH)); if(err != FSP_SUCCESS) { printf(\"DHT11_GPIO_Mode_OUT Failed!!\\\\r\\\\n\"); } } /****************************************************************** * 函 数 名 称:DHT11_GPIO_Mode_IN * 函 数 说 明:配置DHT11的数据引脚为输入模式 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ staticvoidDHT11_GPIO_Mode_IN(void) { // 在运行过程中配置DHT11数据引脚为输入模式 // 这里使用R_IOPORT_PinCfg函数配置引脚 fsp_err_t err = R_IOPORT_PinCfg(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT); if(err != FSP_SUCCESS) { printf(\"DHT11_GPIO_Mode_IN Failed!!\\\\r\\\\n\"); } } /****************************************************************** * 函 数 名 称:DHT11_Start * 函 数 说 明:开始DHT11测量 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ voidDHT11_Start(void) { DHT11_GPIO_Mode_OUT(); // 输出模式 DATA_GPIO_OUT(1); DATA_GPIO_OUT(0); delay_ms(25);// 保持18+ms低电平 DATA_GPIO_OUT(1); delay_us(25);// 主机释放总线 DHT11_GPIO_Mode_IN(); // 切换输入模式 } /****************************************************************** * 函 数 名 称:DHT11_CheckResponse * 函 数 说 明:检查DHT11从机的相应是否正确 * 函 数 形 参:无 * 函 数 返 回:1:正确 0:错误 * 作 者:LC * 备 注:无 ******************************************************************/ uint8_tDHT11_CheckResponse(void) { uint32_t timeout = 0; // 等待从机响应发送电平响应(低电平)(80µs) timeout = DHT11_TIMEOUT; while(DATA_GPIO_IN() && timeout--) { if(timeout == 0) { printf(\"DHT11_CheckResponse Failed[1]!!\\\\r\\\\n\"); return 0; // 失败 } } // 等待从机响应发送电平响应(高电平)(80µs) timeout = DHT11_TIMEOUT; while((!DATA_GPIO_IN()) && timeout--) { if(timeout == 0) { printf(\"DHT11_CheckResponse Failed[2]!!\\\\r\\\\n\"); return 0; // 失败 } } // 进入前导低电平 timeout = DHT11_TIMEOUT; while(DATA_GPIO_IN() && timeout--) { if(timeout == 0) { printf(\"DHT11_CheckResponse Failed[3]!!\\\\r\\\\n\"); return 0; // 失败 } } return 1; } /****************************************************************** * 函 数 名 称:DHT11_ReadBit * 函 数 说 明:读取一位数据位 * 函 数 形 参:无 * 函 数 返 回:0 或 1 * 作 者:LC * 备 注:无 ******************************************************************/ uint8_tDHT11_ReadBit(void) { uint8_t bit = 0; uint8_t timeCount = 0; uint32_t timeout; // 等待前导低电平过去 // 等待信号线由低变高 timeout = DHT11_TIMEOUT; while((!DATA_GPIO_IN()) && timeout--) { if(timeout == 0) { printf(\"DHT11_ReadBit Failed[1]!!\\\\r\\\\n\"); return 0; } } // 判断是0还是1? timeout = DHT11_TIMEOUT; while(DATA_GPIO_IN() && timeout--) { timeCount++; delay_us(1); // 等待1us if(timeout == 0) { printf(\"DHT11_ReadBit Failed[2]!!\\\\r\\\\n\"); return 0; // 失败 } } // 只要大于30us的高电平即可判断为数据1 if(timeCount >= 30) bit = 1; // 数据1 else bit = 0; // 数据0 return bit; } /****************************************************************** * 函 数 名 称:DHT11_Read_Data * 函 数 说 明:根据时序读取温湿度数据 * 函 数 形 参: * 函 数 返 回:0=数据校验失败其他=错误 * 作 者:LC * 备 注:无 ******************************************************************/ uint8_tDHT11_Read_Data(float *temperature, float *humidity) { int i; uint8_t data[5] = {0}; uint64_t val = 0; // 开始起始信号 DHT11_Start(); // 检查响应是否合规 if(0 == DHT11_CheckResponse()) { printf(\"DHT11_CheckResponse Failed!!\\\\r\\\\n\"); return 0; } // 数据读取核心(40-bit) for(i = 0; i < 40; i++) { val <<= 1; val |= DHT11_ReadBit(); } // 校验与数据提取 data[0] = (val >> 32) & 0xFF; // 湿度整数 data[1] = (val >> 24) & 0xFF; // 湿度小数 data[2] = (val >> 16) & 0xFF; // 温度整数 data[3] = (val >> 8)& 0xFF; // 温度小数 data[4] = val & 0xFF;// 校验和 #if DHT11_DEBUG printf(\"data[0] = %d\\\\r\\\\n\",data[0]); printf(\"data[1] = %d\\\\r\\\\n\",data[1]); printf(\"data[2] = %d\\\\r\\\\n\",data[2]); printf(\"data[3] = %d\\\\r\\\\n\",data[3]); printf(\"data[4] = %d\\\\r\\\\n\",data[4]); #endif // 校验计算:前4字节和 = 第5字节 if ((data[4] != (data[0] + data[1] + data[2] + data[3])) || (data[4] == 0)) { printf(\"CheckSum Failed!!!\\\\r\\\\n\"); return 0; // 校验失败 } // 保存温湿度 *humidity = data[0] + (data[1] * 0.1f);// 湿度(%) *temperature = data[2] + (data[3] * 0.1f);// 温度(℃) #if DHT11_DEBUG printf(\"T: %d\\\\r\\\\n\",(int)*temperature); printf(\"H: %d\\\\r\\\\n\",(int)*humidity); #endif return 1; } dht11.h: /* * 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源 * 开发板官网:www.lckfb.com * 文档网站:wiki.lckfb.com * 技术支持常驻论坛,任何技术问题欢迎随时交流学习 * 嘉立创社区问答:https://www.jlc-bbs.com/lckfb * 关注bilibili账号:【立创开发板】,掌握我们的最新动态! * 不靠卖板赚钱,以培养中国工程师为己任 */ #ifndef BSP_CODE_BSP_DHT11_H_ #define BSP_CODE_BSP_DHT11_H_ #include\"hal_data.h\" #include<stdio.h> #ifndef delay_ms #define delay_ms(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MILLISECONDS) #endif #ifndef delay_1ms #define delay_1ms(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MILLISECONDS) #endif #ifndef delay_us #define delay_us(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MICROSECONDS) #endif #ifndef delay_1us #define delay_1us(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MICROSECONDS) #endif #ifndef u8 #define u8uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef u32 #define u32 uint32_t #endif #define DHT11_DAT_GPIO_PIN BSP_IO_PORT_04_PIN_07// DHT11数据引脚 // 设置DHT11输出高或低电平 #define DATA_GPIO_OUT(x) R_IOPORT_PinWrite(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, x) // 获取DHT11数据引脚高低电平状态 staticinlinebsp_io_level_tDATA_GPIO_IN(void) { bsp_io_level_t p_pin_value; fsp_err_t err = R_IOPORT_PinRead(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, &p_pin_value); if(err != FSP_SUCCESS) { printf(\"DATA_GPIO_IN Failed!!\\\\r\\\\n\"); } return p_pin_value; } voidDHT11_Init(void); uint8_tDHT11_Read_Data(float *temperature, float *humidity); #endif/* BSP_CODE_BSP_DHT11_H_ */ 给官方代码稍作修改适配我的,跑动结果如图:

    2025-12-26 18:23