抄自百度的定义:
Pulse Width Modulation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。也就占空比。
脉冲宽度调制(PWM)是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
PWM的优点:
总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。
提问:
由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值。需要输出模拟电压时,怎么办?如需要输出一个 ,3.3V的电压 或者 2.7V的电压,怎么办?
这时请出我们的神兵利器:PWM
电压换算原理:
输出电压值计算公式:(接通时间/脉冲时间)*最大电压值
基本方法:通过改变 (接通时间/脉冲时间) 从而改变输出的电压值。
由上图可以看出,PWM有三个基本参数:
由基础知识知道一个PWM的方波的产生,我们需要考虑脉冲的周期、脉冲宽度变化幅度,电压高度。
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitstrue.TIM_OCMode = TIM_OCMode_ PWM1 ;// PWM模式1:CNT < CCR时输出有效电平
TIM_OCInitstrue . TIM_OCPolarity = TIM_OCPolarity_ High;//设置极性-有效电平为:高电平
TIM_OCInitstrue .TIM_Outputstate = TIM outputstate_Enable;// 输出使能
TIM_OC2Init (TIM3, &TIM_OCInitstrue) ;//TIM3的通道2 PWM 模式设置;前面的OC2表示通道2,TIM3表示定时器3
pwm.h
#ifndef PWM_H
#define PWM_H
#include "stm32f10x.h"
void TIM3_PWM_Init(u16 arr,u16 psc);//注意arr的值要大于CCR的值
#endif
pwm.c
#include "pwm.h"
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIOInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//重映射
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//配置GPIO为AFIO
GPIOInitStructure.GPIO_Pin = GPIO_Pin_5;
GPIOInitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIOInitStructure);
//初始化 TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在自动重装载周期值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //这个起到滤波的作用,默认0就行
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//初始化 TIM3 Channel2 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化外设 TIM3 OC2
//使能TIM,CCR预装载寄存器
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能 TIM3
}
main.c
#include "stm32f10x.h"
#include "bsp_systick.h"
#include "led.h"
#include "exti.h"
#include "Tool.h"
#include "usart.h"
#include "pwm.h"
u8 wifiConnected = 0;
u8 cloudConnected = 0;
int main(void)
{
u16 pwmValue=0;
led_init();
usart1_init(9600);
TIM3_PWM_Init(2999,23); //24分频,PWM 频率=72M/24/3000=1000hz,周期为1ms
led1 = 1;
led2 = 1;
printf("system start!\n");
while(1)
{
SysTick_Delay_ms(1);
TIM_SetCompare2(TIM3,pwmValue);
pwmValue++;
//大约3000ms完成一次渐亮
if(pwmValue>2999)
pwmValue=0;
}
}