- PWM信号的基础
- 硬件设置和要求
- Nuvoton N76E003微控制器LED调光电路图
- N76E003 Nuvoton微控制器上的PWM引脚
- N76E003 Nuvoton微控制器中的PWM寄存器和功能
- Nuvoton N6E003微控制器中的PWM操作模式
- 为PWM编程Nuvoton N76E003
- 刷新代码并测试输出
脉宽调制(PWM)是微控制器中常用的技术,用于产生具有定义频率和占空比的连续脉冲信号。简而言之,PWM就是在频率恒定的同时改变脉冲宽度。
PWM信号主要用于控制伺服电机或LED的亮度。此外,由于微控制器只能在其输出引脚上提供逻辑1(高)或逻辑0(低),因此除非使用DAC或数模转换器,否则它无法提供变化的模拟电压。在这种情况下,可以对微控制器进行编程,以输出占空比变化的PWM,然后将其转换为变化的模拟电压。我们以前也曾在许多其他微控制器中使用过PWM外设。
- ARM7-LPC2148 PWM教程:控制LED的亮度
- 使用MSP430G2的脉冲宽度调制(PWM):控制LED的亮度
- 使用带有MPLAB和XC8的PIC单片机生成PWM
- STM32F103C8中的脉冲宽度调制(PWM):直流风扇的控制速度
- 在PIC微控制器的GPIO引脚上生成PWM信号
- Raspberry Pi PWM教程
- ESP32的PWM教程
在本教程中,我们将连接一个LED,该LED将使用来自N76E003微控制器单元的PWM信号进行控制。我们将评估所需的硬件设置以及如何对微控制器进行编程。在此之前,让我们了解PWM信号的一些基础知识。
PWM信号的基础
下图显示了恒定的PWM信号。
上面的图像不过是具有相同的开启时间和相同的关闭时间的恒定方波。假设信号的总周期为1秒。因此,通断时间为500ms。如果在此信号上连接了LED,则LED会亮500ms,然后熄灭500ms。因此,在透视图中,如果在没有任何关闭时间的情况下将其打开为直接5V信号,则LED将以实际亮度的一半点亮。
现在,如上图所示,如果更改占空比,则LED将使用与前面讨论的原理相同的实际亮度点亮25%。如果您想了解更多信息并了解脉冲宽度调制(PWM),可以查看链接的文章。
硬件设置和要求
由于该项目的要求是使用PWM控制LED。N76E003需要连接一个LED。由于N76E003开发板上有可用的LED,因此将在该项目中使用它。不需要其他组件。
更不用说,我们需要基于N76E003微控制器的开发板以及Nu-Link编程器。如果不将编程器用作电源,则可能需要一个额外的5V电源单元。
Nuvoton N76E003微控制器LED调光电路图
如我们在下面的示意图中看到的,测试LED位于开发板内部,并且连接在端口1.4上。最左侧显示了编程接口连接。
N76E003 Nuvoton微控制器上的PWM引脚
N76E003具有20个引脚,其中10个引脚可用作PWM。下图显示了红色方框中突出显示的PWM引脚。
如我们所见,突出显示的PWM引脚也可以用于其他目的。但是,当引脚配置为PWM输出时,这些引脚的其他用途将不可用。引脚1.4用作PWM输出引脚,它将失去其他功能。但是,这不是问题,因为该项目不需要其他功能。
之所以选择引脚1.4作为输出引脚,是因为内置的测试LED连接在开发板上的该引脚上,因此我们不需要外部LED。但是,在该单片机的20个引脚中,有10个引脚可以用作PWM输出引脚,而其他任何PWM引脚都可以用于与输出相关的目的。
N76E003 Nuvoton微控制器中的PWM寄存器和功能
N76E003使用系统时钟或定时器1溢出除以PWM时钟,并在1/1〜1/128中选择预分频器。可以使用16位周期寄存器PWMPH和PWMPL寄存器设置PWM周期。
微控制器具有六个单独的PWM寄存器,这些寄存器生成六个称为PG0,PG1,PG2,PG3,PG4和PG5的PWM信号。但是,每个PWM通道的周期相同,因为它们共享相同的16位周期计数器,但是每个PWM的占空比可以彼此不同,因为每个PWM使用名为{PWM0H,PWM0L}的不同16位占空比寄存器,{PWM1H,PWM1L},{PWM2H,PWM2L},{PWM3H,PWM3L},{PWM4H,PWM4L}和{PWM5H,PWM5L}。因此,在N76E003中,可以独立产生具有不同占空比的六个PWM输出。
与其他微控制器不同,启用PWM不会自动将I / O引脚设置为其PWM输出。因此,用户需要配置I / O输出模式。
因此,无论应用需要什么,第一步都是确定或选择哪一个或两个或什至两个以上的I / O引脚作为PWM输出。选择一个后,需要将I / O引脚设置为推挽模式或准双向模式以产生PWM信号。可以使用PxM1和PxM2寄存器进行选择。这两个寄存器设置I / O模式,其中x代表端口号(例如,对于端口P1.0,该寄存器将为P1M1和P1M2,对于P3.0,它将为P3M1和P3M2,依此类推。)
该配置可以在下图中看到-
然后,下一步是在该特定I / O引脚中启用PWM。为此,用户需要设置PIOCON0或PIOCON1寄存器。该寄存器取决于引脚映射,因为PIOCON0和PIOCON1根据PWM信号控制不同的引脚。这两个寄存器的配置可以在下图中看到-
如我们所见,以上寄存器控制6种配置。其余的,请使用PIOCON1寄存器。
因此,上述寄存器控制其余4种配置。
Nuvoton N6E003微控制器中的PWM操作模式
下一步是选择PWM操作模式。每个PWM支持三种操作模式-独立,同步和死区启用模式。
独立模式提供了可以独立生成六个PWM信号的解决方案。当需要打开和控制与LED相关的操作或蜂鸣器时,这是最长的时间。
所述同步模式设定PG1在同相PWM输出/ 3/5,同样作为PG0 / 2/4,其中PG0 / 2/4提供独立的PWM输出信号。这主要是控制三相电动机所必需的。
在死区时间插入模式有点复杂,在实际电机应用中应用,特别是在工业应用。在此类应用中,需要“死时间”插入互补的PWM输出,以防止损坏GPIB等功率开关器件。在此模式下设置配置的方式是,PG0 / 2/4以与独立模式相同的方式提供PWM输出信号,但是PG1 / 3/5相应地提供PG0 / 2/4的“异相PWM信号”输出并忽略PG1 / 3/5占空比寄存器。
可以使用以下寄存器配置选择以上三种模式-
下一个配置是使用PWMCON1寄存器选择PWM类型。
因此,正如我们所看到的,可以使用上述寄存器选择两种PWM类型。在边缘对齐中,16位计数器通过从0000H递增到{PWMPH,PWMPL}的设置值,然后从0000H开始计数,使用单斜率操作。输出波形是左边缘对齐的。
但是,在中心对齐模式下,16位计数器使用双斜率操作,即从0000H递增到{PWMPH,PWMPL},然后又通过递减从{PWMPH,PWMPL}递增到0000H。输出中心对齐,对于生成非重叠波形很有用。现在终于可以在以下寄存器中检查PWM控制操作了:
要设置时钟源,请使用CKCON时钟控制寄存器。
也可以使用PMEN寄存器屏蔽PWM输出信号。使用该寄存器,用户可以将输出信号屏蔽0或1。
接下来是PWM控制寄存器-
上面的寄存器对于运行PWM,加载新的周期和占空比,控制PWM标志和清除PWM计数器很有用。
相关的位配置如下所示:
要设置时钟分频器,请使用PWMCON1寄存器作为PWM时钟分频器。第5位用于启用组模式的分组PWM,并为前三个PWM对提供相同的占空比。
为PWM编程Nuvoton N76E003
编码很简单,可以在本页底部找到本教程中使用的完整代码。LED连接到P1.4引脚。因此,需要将P1.4引脚用于PWM输出。
在主程序中,设置按各自的顺序进行。下面的代码行设置PWM并将P1.4引脚配置为PWM输出。
P14_PushPull_Mode;
这用于将引脚P1.4设置为推挽模式。这在 Function_define.h 库中定义为-
#定义P14_PushPull_Mode P1M1&=〜SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
下一行用于在引脚P1.4中启用PWM。这也在 Function_define.h 库中定义为-
#定义PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS&= 0xFE; EA = BIT_TMP //P1.4为PWM1输出使能 PWM_IMDEPENDENT_MODE;
以下代码用于将PWM设置为独立模式。在 Function_define.h 库中,它定义为-
#定义PWM_IMDEPENDENT_MODE PWMCON1&= 0x3F PWM_EDGE_TYPE;
然后,我们必须设置EDGE类型的PWM输出。在 Function_define.h 库中,它定义为-
#定义PWM_EDGE_TYPE PWMCON1&=〜SET_BIT4 set_CLRPWM;
接下来,我们必须清除 SFR_Macro.h 库中提供的PWM计数器值-
#定义set_CLRPWM CLRPWM = 1
之后,选择PWM时钟作为Fsys时钟,并且使用的分频系数为64分频。
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
两者都定义为-
#define PWM_CLOCK_FSYS CKCON&= 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1&= 0xFE PWM_OUTPUT_ALL_NORMAL;
下面的代码行用于将输出PWM信号屏蔽为0,定义为-
#定义PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period(1023);
然后我们必须设置PWM信号的周期时间。该功能设置PWMPL和PWMPH寄存器中的周期。由于这是一个16位寄存器,因此该函数使用一种移位方法来设置PWM周期。
void set_PWM_period(unsigned int value){ PWMPL =(value&0x00FF); PWMPH =((值&0xFF00)>> 8); }
但是,除了1023和8位周期之外,用户还可以使用其他值。延长周期会导致平滑的调光或褪色。
set_PWMRUN;
这将启动 SFR_Macro.h 库中定义的PWM为-
#定义set_PWMRUN PWMRUN = 1
接下来,在 while循环中 ,LED点亮并持续衰减。
while(1){ for(value = 0; value <1024; value + = 10){ set_PWM1(value); Timer1_Delay10ms(3); } for(value = 1023; value> 0; value- = 10){ set_PWM1(value); Timer1_Delay10ms(2); } } }
占空比由 set_PWM1(); 设置 , 该函数用于设置PWM1L和PWM1H寄存器中的占空比。
set_PWM1(无符号整数值){ PWM1L =(value&0x00FF); PWM1H =((值&0xFF00)>> 8); set_LOAD; }
刷新代码并测试输出
代码准备好后,只需对其进行编译并将其上传到控制器。如果您不熟悉环境,请查看Nuvoton N76E003教程入门以了解基础知识。从下面的结果中可以看到,代码返回0警告和0错误,并使用Keil的默认闪烁方法进行闪烁。该应用程序开始工作。
重建开始:项目:PWM 重建目标'Target 1', 组装了STARTUP.A51… 编译main.c… 编译Delay.c… 链接… 程序大小:data = 35.1 xdata = 0 code = 709 创建来自“。\ Objects \ pwm”… “。\ Objects \ pwm”的 十六进制文件 -0错误,0警告。 建立时间已过:00:00:05
硬件已连接到电源,并且按预期方式工作。也就是说,板载LED的亮度先降低然后升高,以指示PWM占空比发生变化。
您也可以在下面的视频中找到本教程的全部内容。希望您喜欢本教程并从中学到有用的东西,如果您有任何疑问,请将其留在评论部分,或者您可以将我们的论坛用于其他技术问题。