欢迎光临~啄木鸟电子科技

新闻中心

软件:PWM 波形分析

 PWM,英文名 Pulse Width Modulation,是脉冲宽度调制缩写

它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,
占空比就是指在一个周期内,信号处于 高电平的时间占据整个信号周期的百分比
例如方波的占空比就是50%;

常见实例:电机转速的控制, 呼吸灯,及各种 信号发生器;;

现在很多高档的单片机也都集成了PWM 功能模块,方便用户的应用。
对于PWM 信号,主要涉及到两个概念,
1. PWM 信号的 周期 T频率 f: T = 1 / f
2. PWM 信号的 占空比;

例: 当频率为 1KHZ,占空比为20%,有效信号为1 的 PWM 信号
在用示波器测量时,就是高电平的时间为200uS,低电平的时间为 700uS 的周期波形。

在单片机中实现PWM 信号的功能模块,实际上就是带比较器的计数器模块。
首先该计数器循环计数,例如从0 到N,那么这个N 就决定了PWM 的周期,PWM 周期=(N+1)*计数器时钟的周期。
在计数器模块中一定还有一个比较器,比较器有 2 个输入,一个就是 计数器的当前值,另一个是可以设置的数,这个数来自一个比较寄存器。

当计数器的值小于比较寄存器的值时,输出为1(可以设置为0),
当计数器的值大于或等于比较寄存器的值时,输出为0(也可设置为1,与前面对应)。

了解了这个基本原理后,我们就可以使用STM8 单片机中的PWM 模块了。
1. 首先将定时器2 的通道2 设置成 PWM 输出方式,
/*******************************************************************************
// 功能:PWM 信号 输出测试 
*******************************************************************************/ 


/*******************************************************************************/ 
// 头文件 宏定义
#include <iostm8s003f3.h>
#include"stdio.h"

/*******************************************************************************/ 
// 常用数据类型定义
#define u8  uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char    uint8_t;
typedef unsigned int     uint16_t;
typedef unsigned long    uint32_t;

/*******************************************************************************/ 
// 函数声明; 
void CLK_Init(void);
void TIM_Init(void);

/*******************************************************************************
* 函数名称:DelayMS(unsigned int ms)
* 功能描述:延时函数
* 输入参数:ms -- 要延时的毫秒数,这里假设CPU 的主频为2MHZ
* 输出参数:无  
* 返回值:  无 
* 备注:    无 
********************************************************************************/
void DelayMS(unsigned int ms)
{
	unsigned char i;
	while(ms != 0)
	{
		for(i=0; i<250; i++);
		for(i=0; i<75; i++);
		ms--;
	}
}

/*******************************************************************************
* 函数名称:CLK_Init()
* 功能描述:初始化时钟
* 输入参数:无 
* 输出参数:无  
* 返回值:  无 
* 备注:    无 
********************************************************************************/
void CLK_Init()
{
	CLK_CKDIVR = 0x11; // 10: fHSI = fHSI RC output/ 4
	// = 16MHZ / 4 =4MHZ
	// 001: fCPU=fMASTER/2. = 2MHZ
}

/*******************************************************************************
* 函数名称:TIM_Init()
* 功能描述:初始化定时器2 的通道2,用于控制LED 的亮度
* 输入参数:无 
* 输出参数:无  
* 返回值:  无 
* 备注:    无 
********************************************************************************/
void TIM_Init()
{
	TIM2_CCMR2 = TIM2_CCMR2 | 0x70; // Output mode PWM2.   0111 0000
	
	// 通道2 被设置成比较输出方式
	// OC2M = 111,为PWM 模式2,
	// 向上计数时,若计数器小于比较值,为无效电平
	// 即当计数器在0 到比较值时,输出为1,否则为0
	
	TIM2_CCER1 = TIM2_CCER1 | 0x30;// CC polarity low,enable PWM output */
	// CC2P = 1,低电平为有效电平
	// CC2E = 1,开启输出引脚
	
	//初始化自动装载寄存器,决定PWM 方波的频率,Fpwm=4000000/256=15625HZ	
	TIM2_ARRH = 0;
	TIM2_ARRL = 0xFF;
	
	//初始化比较寄存器,决定PWM 方波的占空比
	TIM2_CCR2H = 0;
	TIM2_CCR2L = 0;
	
	// 初始化时钟 分频器为1,即计数器的时钟频率为 Fmaster = 4MHZ
	TIM2_PSCR = 0;
	
	// 启动计数
	TIM2_CR1 = TIM2_CR1 | 0x01;
}

/*******************************************************************************
* 函数名称:main()
* 功能描述:主函数; 
* 输入参数:无 
* 输出参数:无  
* 返回值:  无 
* 备注:    无 
********************************************************************************/
main()
{
	unsigned char i;
	CLK_Init(); // 初始化时钟
	TIM_Init(); // 初始化定时器
	
	while(1) // 进入无限循环
	{
		// 下面的循环将占空比逐渐从0 递增到50%
		for(i=0; i<128; i++)
		{
			TIM2_CCR2H = 0;
			TIM2_CCR2L = i;
			DelayMS(5);
		}
		// 下面的循环将占空比逐渐从50%递减到0
		for(i=128; i>0; i--)
		{
			TIM2_CCR2H = 0;
			TIM2_CCR2L = i;
			
			DelayMS(5);
		}
	}
}


2. 通过设置 自动装载寄存器 TIM2_CCR2,决定PWM 信号的周期。
在程序的主循环中,循环修改占空比,先是从0 逐渐递增到128,然后再从128 递减到0。
 
// 程序描述:用PWM 输出驱动LED


上一个:NE555 工作原理 下一个:C 常用转义字符

联系我们

联系人:客服在线

手机:全工:13903011251

电话:李R:13530006400

邮箱:729986191@qq.com

地址: GUANGDONG PROVINCE

用手机扫描二维码关闭
二维码