[其它应用] 基于中颖NY8A050D的PWM控制LED亮度调节应用

[复制链接]
2859|10
 楼主| 童雨竹 发表于 2024-10-10 07:54 | 显示全部楼层 |阅读模式
中颖微电子(Sino Wealth)在国内 MCU 市场中占有一席之地,其推出的 NY8 系列 MCU 在低功耗、性能及成本上具有较高的性价比。本文将以 NY8A050D 为例,介绍如何使用该 MCU 实现 PWM(脉宽调制)控制 LED 的亮度调节。PWM 是一种常见的控制方式,广泛应用于电机控制、LED 调光等场景。
NY8A050D 是一款 8 位 MCU,具有 4KB 的 Flash、128 字节 RAM、以及多个 I/O 口。其集成的定时器模块可以轻松实现 PWM 输出,适用于 LED 调光、电机控制等多种应用场景。

1. 硬件准备
  • NY8A050D 开发板
  • 一颗 LED 和电阻(用于限流)
  • 连接线及电源

2. 软件工具
  • Keil C51 开发环境
  • 中颖提供的标准库文件

3. PWM 控制简介PWM 通过调节输出信号的占空比来控制设备的功率输出或调节亮度。在 LED 控制应用中,占空比越大,LED 亮度越高;占空比越小,亮度越低。当占空比为 0% 时,LED 关闭;当占空比为 100% 时,LED 全亮。

4. NY8A050D 的 PWM 配置NY8A050D MCU 的 T2 定时器支持 PWM 输出,可以通过简单的配置实现对 LED 的亮度控制。下面的代码将展示如何使用 T2 定时器生成 PWM 信号并通过调节占空比来控制 LED 的亮度。

5. 实现代码
  1. #include <NY8A050D.h>  // 中颖MCU的头文件

  2. // 定义 LED 引脚
  3. #define LED_PIN P1_0

  4. // 初始化定时器2用于 PWM 输出
  5. void PWM_Init() {
  6.     // 设置 P1_0 为输出模式
  7.     P1M0 |= 0x01;  // 设置 P1_0 为推挽输出
  8.     P1M1 &= ~0x01;

  9.     // 初始化 Timer2 作为 PWM 模式
  10.     T2MOD = 0x02;  // 设置 T2 为自动重载模式
  11.     TH2 = 0xFF;  // 设置定时器初始值高字节
  12.     TL2 = 0x00;  // 设置定时器初始值低字节

  13.     // 开启定时器2中断
  14.     IE2 |= 0x04;

  15.     // 开启定时器2
  16.     T2CON |= 0x04;
  17. }

  18. // 设置 PWM 占空比
  19. void Set_PWM_DutyCycle(uint8_t dutyCycle) {
  20.     // dutyCycle 取值范围为 0 - 100,表示占空比百分比
  21.     uint16_t value = (dutyCycle * 255) / 100;
  22.     TH2 = (255 - value);  // 设置 PWM 高字节占空比
  23. }

  24. // 定时器2中断处理函数
  25. void Timer2_ISR() interrupt 12 {
  26.     // T2溢出处理
  27.     P1_0 = !P1_0;  // 切换 P1_0 状态,用于 PWM 输出
  28. }

  29. int main() {
  30.     // 初始化 PWM
  31.     PWM_Init();

  32.     // 初始化占空比为 50%(LED 亮度为中等)
  33.     Set_PWM_DutyCycle(50);

  34.     while (1) {
  35.         // 模拟亮度变化,逐步调节占空比
  36.         for (uint8_t i = 0; i <= 100; i += 10) {
  37.             Set_PWM_DutyCycle(i);  // 设置占空比
  38.             for (uint16_t j = 0; j < 50000; j++);  // 简单延时
  39.         }
  40.     }
  41. }

代码解析
  • PWM_Init 函数:该函数配置定时器2为 PWM 输出模式,初始化定时器计数值,并开启定时器2中断。P1_0 被设置为推挽输出模式,用于控制 LED 的亮灭。
  • Set_PWM_DutyCycle 函数:该函数根据输入的占空比百分比值,计算对应的定时器寄存器值,从而调整 PWM 的输出占空比。占空比值越高,LED 亮度越高。
  • Timer2_ISR 中断处理函数:定时器2溢出时调用此函数,P1_0 的状态发生切换,从而产生 PWM 波形。
  • 主函数:在主函数中,MCU 初始化了 PWM,并通过循环逐步调节 PWM 占空比,模拟 LED 亮度的变化。每次调节后,加入延时,以便观察亮度变化的过程。


6. PWM 控制 LED 应用场景
  • 智能照明系统:PWM 可以用来调节 LED 的亮度,实现智能照明控制,比如根据环境光线自动调整亮度,或通过手动调节实现个性化的灯光设置。
  • 装饰照明:在室内或户外的装饰照明中,PWM 可以用来制作炫彩灯光效果,逐步调节不同灯带的亮度,营造出各种光效。
  • 节能设备:通过调节亮度,PWM 控制可以实现电能的节约,例如在夜晚或低光环境中,降低 LED 亮度来减少电力消耗。
  • 电机控制:PWM 不仅可以控制 LED,还可以用于控制直流电机的转速,通过调节占空比控制电机的功率输出。


7. 总结本文介绍了如何使用中颖 NY8A050D MCU 实现 PWM 控制 LED 的亮度调节,展示了 PWM 的基本原理及其在嵌入式应用中的重要性。通过简单的代码实现,可以让 LED 实现从熄灭到全亮的调节效果。通过 PWM,我们可以轻松控制各种设备的输出功率或亮度,特别适合需要精细控制的应用场景。


公羊子丹 发表于 2024-10-10 07:54 | 显示全部楼层
终于找到一篇讲中颖 MCU 实现 PWM 的文章了,讲得很清楚!
周半梅 发表于 2024-10-10 07:54 | 显示全部楼层
我按照你的代码改了一下,成功调亮了 LED,效果不错!
帛灿灿 发表于 2024-10-10 07:55 | 显示全部楼层
中颖的 MCU 真不错,功能强大,价格还亲民!
万图 发表于 2024-10-10 07:55 | 显示全部楼层
看了文章之后,我决定尝试在我的项目里加入 PWM 控制。
Wordsworth 发表于 2024-10-10 07:55 | 显示全部楼层
请问如果想用多个 LED 同时调光,要怎么修改代码?
Pulitzer 发表于 2024-10-10 07:55 | 显示全部楼层
文章写得真详细,特别是 PWM 占空比那部分,我之前不太懂。
Bblythe 发表于 2024-10-10 07:56 | 显示全部楼层
定时器中断的使用很巧妙,正好学习了中断处理的知识。
Uriah 发表于 2024-10-10 07:56 | 显示全部楼层
PWM 控制亮度确实比用普通开关好得多,调节范围很灵活。
Clyde011 发表于 2024-10-10 07:56 | 显示全部楼层
我想把这个应用改造成电机控制,不知道需不需要改动很多代码?
呐咯密密 发表于 2024-10-10 13:43 | 显示全部楼层
介绍的很详细,步骤很清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

6272

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部