N76E003 PWM 程序及分析(边沿对齐、独立输出模式)

N76E003 包含三对( 6个PWM通道) 16位精度、可调周期和占空比的PWM输出

让我们来看看六个通道的引脚分别是
在这里插入图片描述
可能有同学会疑问,为什么P1.5和P0.3都是PWM5,那如果要使用PWM5,该如何选择引脚呢?我们来看看芯片内部的原理图。
这里写图片描述
还是以PWM5为例:芯片内部是通过一个二选一选择器来进行引脚选择的,通过PIO05/PIO15寄存器来进行数据选择.
这里写图片描述
如果我们选择使用P0.3作为PWM5的输出管脚,PIOCON0|=0x20;即可
贴心的新唐官方,为了让我们不用每次都去查表,在function_define.h中,提前将这些寄存器进行了宏定义。PWM5_P03_OUTPUT_ENABLE这样就可以了~

管脚选择完成后,我们开始配置PWM发生器,其中包含两种模式,边沿对齐或中心对齐,其中包含PWM频率和占空比的计算方法,之后的程序中我们会用到。这里我们配置为边沿对齐型clr_PWMTYP;
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
然后我们将要模式配置独立输出模式(独立输出模式,可以让每个通道单独输出)
这里写图片描述
clr_PWMMOD0; clr_PWMMOD1;

接下来配置周期寄存器

脉冲宽度调制发生器时钟由系统时钟或定时器1计数溢出产生,可通过PWM时钟预分频调整1/1~1/128除频。 PWM周期由16位周期寄存器 {PWMPH, PWMPL} 组合预先设置。所有PWM通道共享同一个16位周期计数器,周期是相同的。下图可以看出,周期、占空比之间的关系
这里写图片描述
在PWMPH,PWMPL中配置的数据,在通过下图的公式进行计算
这里写图片描述
在官方例程中将周期配置为1ms,分频设置为8分频PWM_CLOCK_DIV_8;

PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) <Fpwm = Fsys/PWM_CLOCK_DIV> 
= (16MHz/8)/(0x7CF + 1)
= 1KHz (1ms)

接下来就是配置PWM5的占空比
我们将占空比配置为周期的一半,按照上图公式,也就是1000>0X03F8.

PWM5H = 0x03;						
PWM5L = 0xe8;

以上,我们就成功配置好了~PWM5以周期1ms输出0.5ms占空比
这里写图片描述
之后将PWMRUN和LOAD置高,即可开始运行

set_LOAD;
set_PWMRUN;

这里写图片描述
这里写图片描述
由逻辑分析仪可以看出,程序按照设计要求运行。
至此,一个最简单的PWM输出程序,就完成了,最后附上完整工程代码

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"
void main(void)
{
    Set_All_GPIO_Quasi_Mode;//所有IO设置为双向模式
		PWM5_P03_OUTPUT_ENABLE;//使能PWM5,通过P03引脚输出
		clr_PWMTYP;//边沿对齐模式
		clr_PWMMOD0;//设置为独立输出模式
		clr_PWMMOD1;
		PWM_CLOCK_DIV_8;//8分频模式
		PWMPH = 0x07;//1999(Dec)
		PWMPL = 0xCF;
	set_SFRPAGE;//PWM4 and PWM5 duty seting is in SFP page 1
	PWM5H = 0x03;//1000(Dec)				
	PWM5L = 0xe8;
	clr_SFRPAGE;											
    set_LOAD;//载入周期和占空比
    set_PWMRUN;//开始输出PWM
	while(1)
	{
	   //构建你的代码,LOAD会自动重载,PWM持续输出。
	}
}

N76E003 PWM极性控制(程序及分析)

猜你喜欢

转载自blog.csdn.net/u014798590/article/details/82728701