PWM原理及应用

一、PWM的基本概念

1、什么是PWM

        脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是在具有惯性的系统中利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换和电机控速等的许多领域中。

        在我的理解上,PWM是一个模拟电压控制,主要是将硬件中单一的高电平或低电平模拟成一个准确的电压值,怎么实现的呢?主要是靠占空比以及高频率来实现的,比如3V的高电平当一个周期中有效电平(高电平)只占三分之一时,就认为他只有1V,因为刷新频率很快所以得以实现。

2、PWM参数

        (1)频率 = 1 / Ts(是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);)

        (2)占空比 = Ton /  Ts(有效电平与周期之比

        (3)分辨率 = 占空比变化步距

二、PWM的基本原理

1、PWM的基本结构

        黄线ARR重装载值        蓝线CNT计数值        红线CCR的值

此图为高电平为有效电平,低于CCR的值时为有效电平(高电平),高于CCR的值为无效电平(低电平)

2、参数计算

PWM频率:        Freq = CK_PSC / (PSC + 1) / (ARR + 1)

PWM占空比:    Duty = CCR / (ARR + 1)

PWM分辨率:    Reso = 1 / (ARR + 1)

注:CK_PSC为时钟频率,PSC预分频值,ARR重装载值

三、代码实例

1、PWM驱动呼吸灯

#include "stm32f10x.h"                  // Device header


void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 	//使能tim2时钟
	
	TIM_InternalClockConfig(TIM2);							//选择内部时钟驱动
	
	TIM_TimeBaseInitTypeDef TIM_InitStructrue;				//配置时钟单元
	TIM_InitStructrue.TIM_ClockDivision = TIM_CKD_DIV1;		//配置滤波器
	TIM_InitStructrue.TIM_CounterMode = TIM_CounterMode_Up; //计数方式采用向上计数
	TIM_InitStructrue.TIM_Period = 100 - 1;  				// 自动重装载值,ARR
	TIM_InitStructrue.TIM_Prescaler = 720-1;				//预分频系数,PSC
	TIM_InitStructrue.TIM_RepetitionCounter = 0;			//高级定时器的重复次数计数
	TIM_TimeBaseInit(TIM2,&TIM_InitStructrue);
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	

	TIM_Cmd(TIM2,ENABLE);										  //启动定时器
	
	
	TIM_OCInitTypeDef TIM_InitStructure;						//带N和Idlest参数都为高级定时器的参数
	TIM_OCStructInit(&TIM_InitStructure);						//给结构体附初始值
	TIM_InitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//设置输出比较的模式
	TIM_InitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;	//设置输出比较的极性,设置有效点平为高电平
	TIM_InitStructure.TIM_OutputState = TIM_OutputState_Enable;	//设置输出使能
	TIM_InitStructure.TIM_Pulse = 90;								//设置CCR
	
	TIM_OC1Init(TIM2,&TIM_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	//因为GPIOA0为TIM2_CH1的通道
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);



}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);	//程序运行中设置CCR的值控制占空比,近似想象改变输出电压

}

2、PWM驱动舵机

(1)关于舵机:舵机是一种根据输入PWM信号占空比来控制输出角度的装置 输入PWM信号要求:周期为20ms(50HZ),高电平宽度为0.5ms~2.5ms,我采用的是180°舵机

                        ​​​​​​​        ​​​​​​​                                                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       ​​​      

#include "stm32f10x.h"                  // Device header


void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 	//使能tim2时钟
	
	TIM_InternalClockConfig(TIM2);							//选择内部时钟驱动
	
	TIM_TimeBaseInitTypeDef TIM_InitStructrue;				//配置时钟单元
	TIM_InitStructrue.TIM_ClockDivision = TIM_CKD_DIV1;		//配置滤波器
	TIM_InitStructrue.TIM_CounterMode = TIM_CounterMode_Up; //计数方式采用向上计数
	TIM_InitStructrue.TIM_Period = 20000 - 1;  				// 自动重装载值,ARR
	TIM_InitStructrue.TIM_Prescaler = 72 - 1;				//预分频系数,PSC
	TIM_InitStructrue.TIM_RepetitionCounter = 0;			//高级定时器的重复次数计数
	TIM_TimeBaseInit(TIM2,&TIM_InitStructrue);
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	

	TIM_Cmd(TIM2,ENABLE);										  //启动定时器
	
	
	TIM_OCInitTypeDef TIM_InitStructure;						//带N和Idlest参数都为高级定时器的参数
	TIM_OCStructInit(&TIM_InitStructure);						//给结构体附初始值
	TIM_InitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//设置输出比较的模式
	TIM_InitStructure.TIM_OCPolarity = TIM_OCPolarity_High;		//设置输出比较的极性,设置有效点平为高电平
	TIM_InitStructure.TIM_OutputState = TIM_OutputState_Enable;	//设置输出使能
	TIM_InitStructure.TIM_Pulse = 0;							//设置CCR,500~2500
	
	TIM_OC2Init(TIM2,&TIM_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);



}

void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2,Compare);

}



//舵机驱动

void Servo_Init(void)
{
	PWM_Init();
}

/*
	0°--》500 CCR
	180°--》 2500 CCR
*/
void Servo_SetAngle(float Angle) //设置角度
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}








  • 24
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前面已经回答了PWM的产生原理,这里再进行一下简单的总结: PWM通过改变脉冲信号的宽度来控制电路输出,其产生的原理是将一个固定频率的周期性波形通过比较器与一个可调节占空比的方波信号进行比较,从而控制输出信号的占空比。具体来说,当周期性波形的电压高于方波信号时,比较器输出高电平;反之,当周期性波形的电压低于方波信号时,比较器输出低电平。 根据控制信号的波形形式,PWM可以分为三种类型: 1. 单极性PWM 单极性PWM的控制信号为正半周期的方波信号,即高电平和低电平的幅值不同。在单极性PWM中,输出信号的电平平均值与占空比成正比关系,当占空比为0时,输出信号为0电平;当占空比为100%时,输出信号为最大电平。 2. 双极性PWM 双极性PWM的控制信号为正负两个半周期的方波信号,即高电平和低电平的幅值相同。在双极性PWM中,输出信号的电平平均值与占空比成正比关系,当占空比为50%时,输出信号为0电平;当占空比为0或100%时,输出信号为最大电平。 3. 多级PWM 多级PWM是将多个PWM信号级联形成的一种PWM形式,可以实现更高精度的电路输出控制。多级PWM的控制信号是一个多位计数器输出的数字信号,通过逐步增加计数器的位数,可以实现更高分辨率的PWM控制。 需要注意的是,不同类型的PWM在实际应用中,适用于不同的场合。例如,单极性PWM适用于直流电机调速、LED调光等领域;双极性PWM适用于音频放大器、电源变换器等领域;多级PWM适用于高精度的电路输出控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值