[DemoCode下载] N76E003的PWM – RGB LED Fading

[复制链接]
954|3
 楼主| 幸福小强 发表于 2019-12-31 20:52 | 显示全部楼层 |阅读模式
PWM硬件是任何现代微控制器的另一个基本要求。我们可以将PWM用于许多应用,例如电机控制,照明控制,开关模式电源(SMPS)等。借助PWM,我们还可以模拟数模转换器(DAC)。幸运的是,N76E003带有一个独立的PWM模块,该模块不属于任何内部定时器。它具有您可以想象的所有功能。它可用于生成简单的独立6个单通道PWM。它还可以用于生成具有死区时间功能的互补和相互依赖的PWM。
806875e0b44656f9f1.png
  1. #include "N76E003.h"
  2. #include "SFR_Macro.h"
  3. #include "Function_define.h"
  4. #include "Common.h"
  5. #include "Delay.h"
  6. #include "soft_delay.h"
  7. unsigned int R_value[10] = {20, 150, 250, 360, 440, 560, 680, 820, 900, 1020};
  8. unsigned int G_value[10] = {440, 560, 680, 820, 900, 1020, 20, 150, 250, 360};
  9. unsigned int B_value[10] = {900, 1020, 20, 150, 250, 360, 440, 560, 680, 820};
  10. void set_PWM_period(unsigned int value);
  11. void set_PWM0(unsigned int value);
  12. void set_PWM1(unsigned int value);
  13. void set_PWM2(unsigned int value);
  14. void set_PWM3(unsigned int value);
  15. void set_PWM4(unsigned int value);
  16. void set_PWM5(unsigned int value);
  17. void main(void)
  18. {
  19.     signed int i = 0;
  20.     signed char j = 0;
  21.     P01_PushPull_Mode;
  22.     P10_PushPull_Mode;
  23.     P11_PushPull_Mode;
  24.     PWM1_P11_OUTPUT_ENABLE;
  25.     PWM2_P10_OUTPUT_ENABLE;
  26.     PWM4_P01_OUTPUT_ENABLE;
  27.     PWM_IMDEPENDENT_MODE;
  28.     PWM_EDGE_TYPE;
  29.     set_CLRPWM;
  30.     PWM_CLOCK_FSYS;
  31.     PWM_CLOCK_DIV_64;
  32.     PWM_OUTPUT_ALL_NORMAL;
  33.     set_PWM_period(1023);
  34.     set_PWMRUN;
  35.     while(1)
  36.     {
  37.         for(i = 0; i < 1024; i += 10)
  38.         {
  39.             set_PWM1(i);
  40.             delay_ms(20);
  41.         }
  42.         for(i = 1023; i > 0; i -= 10)
  43.         {
  44.             set_PWM1(i);
  45.             delay_ms(20);
  46.         }            
  47.         for(i = 0; i < 1024; i += 10)
  48.         {
  49.             set_PWM2(i);
  50.             delay_ms(20);
  51.         }
  52.         for(i = 1023; i > 0; i -= 10)
  53.         {
  54.             set_PWM2(i);
  55.             delay_ms(20);
  56.         }
  57.         for(i = 0; i < 1024; i += 10)
  58.         {
  59.             set_PWM4(i);
  60.             delay_ms(20);
  61.         }
  62.         for(i = 1023; i > 0; i -= 10)
  63.         {
  64.             set_PWM4(i);
  65.             delay_ms(20);
  66.         }
  67.         delay_ms(600);
  68.         for(i = 0; i <=9; i++)
  69.         {
  70.             for(j = 0; j <= 9; j++)
  71.             {
  72.                 set_PWM4(R_value[j]);
  73.                 set_PWM1(G_value[j]);
  74.                 set_PWM2(B_value[j]);
  75.                 delay_ms(200);
  76.             }
  77.             for(j = 9; j >= 0; j--)
  78.             {
  79.                 set_PWM4(R_value[j]);
  80.                 set_PWM1(G_value[j]);
  81.                 set_PWM2(B_value[j]);
  82.                 delay_ms(200);
  83.             }
  84.         }
  85.         delay_ms(600);
  86.     }
  87. }
  88. void set_PWM_period(unsigned int value)
  89. {
  90.   PWMPL = (value & 0x00FF);
  91.   PWMPH = ((value & 0xFF00) >> 8);
  92. }
  93. void set_PWM0(unsigned int value)
  94. {
  95.   PWM0L = (value & 0x00FF);
  96.   PWM0H = ((value & 0xFF00) >> 8);
  97.   set_LOAD;
  98. }
  99. void set_PWM1(unsigned int value)
  100. {
  101.   PWM1L = (value & 0x00FF);
  102.   PWM1H = ((value & 0xFF00) >> 8);
  103.   set_LOAD;
  104. }
  105. void set_PWM2(unsigned int value)
  106. {
  107.   PWM2L = (value & 0x00FF);
  108.   PWM2H = ((value & 0xFF00) >> 8);
  109.   set_LOAD;
  110. }
  111. void set_PWM3(unsigned int value)
  112. {
  113.   PWM3L = (value & 0x00FF);
  114.   PWM3H = ((value & 0xFF00) >> 8);
  115.   set_LOAD;
  116. }
  117. void set_PWM4(unsigned int value)
  118. {
  119.   set_SFRPAGE;
  120.   PWM4L = (value & 0x00FF);
  121.   PWM4H = ((value & 0xFF00) >> 8);
  122.   clr_SFRPAGE;
  123.   set_LOAD;
  124. }
  125. void set_PWM5(unsigned int value)
  126. {
  127.   set_SFRPAGE;
  128.   PWM5L = (value & 0x00FF);
  129.   PWM5H = ((value & 0xFF00) >> 8);
  130.   clr_SFRPAGE;
  131.   set_LOAD;
  132. }
332775e0b448f11f6b.png
说明
N76E003的PWM硬件生成的PWM基于比较匹配原理,这在其框图中很明显。有6个PWM通道,它们可以独立使用或作为相互依存的组使用,以形成互补的PWM。N76E003生成的PWM可以根据用户要求为边沿对齐或居中对齐的PWM。PWM模块可以由系统时钟或定时器1溢出直接提供时钟。此外,还有一个预分频器单元可减少输入时钟源。
为了演示N76E003的PWM功能,我使用了RGB LED。使用PWM通道1,2和4生成了三个独立的PWM。让我们研究一下设置PWM通道和PWM硬件的过程。由于PWM是GPIO引脚的输出功能,因此必须首先将PWM GPIO设置为推挽式GPIO。我们还必须启用我们要使用的PWM输出通道。

 楼主| 幸福小强 发表于 2019-12-31 21:00 | 显示全部楼层
  1. P01_PushPull_Mode;
  2. P10_PushPull_Mode;
  3. P11_PushPull_Mode;
  4. PWM1_P11_OUTPUT_ENABLE;
  5. PWM2_P10_OUTPUT_ENABLE;
  6. PWM4_P01_OUTPUT_ENABLE;
 楼主| 幸福小强 发表于 2019-12-31 21:02 | 显示全部楼层
其次,根据我们的需要设置PWM硬件。由于此处需要独立的PWM,因此选择独立的PWM模式。选择边缘对齐PWM是因为它最容易理解和使用。PWM通道在使用前会复位。PWM输出是非反相的,因此它们的特性为普通PWM。在这里,我使用系统时钟作为PWM模块的时钟源,但它被预分频/除以64,以获得250kHz的有效PWM时钟。当我们设置周期计数或最大PWM值/占空比时,PWM分辨率设置为10位。设置周期计数会产生内部PWM计数器的设置。这样可以产生大约245Hz频率或4ms周期的PWM。最后,在设置所有这些之后,将启用PWM硬件。
  1. PWM_IMDEPENDENT_MODE;
  2. PWM_EDGE_TYPE;
  3. set_CLRPWM;
  4. PWM_CLOCK_FSYS;
  5. PWM_CLOCK_DIV_64;
  6. PWM_OUTPUT_ALL_NORMAL;
  7. set_PWM_period(1023);
  8. set_PWMRUN;

255675e0b4696d91f5.png
221645e0b46a06e8d8.png
517685e0b46a7bdfda.png
要更改PWM占空比,调用如下所示的功能。更改占空比或比较值后,将加载并运行新值。
  1. void set_PWMn(unsigned int value)
  2. {
  3.   PWMnL = (value & 0x00FF);
  4.   PWMnH = ((value & 0xFF00) >> 8);
  5.   set_LOAD;
  6. }
小明的同学 发表于 2019-12-31 21:58 | 显示全部楼层
呼吸灯的效果哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

1720

帖子

3

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