PWM 中文意思就是脉冲宽度调制,简 称脉宽调制。应用领域包括测量,通信,功率控制与变换,电动机控制、伺 服控制、调光、开关电源,甚至某些音频放大器。
CCRX是比较值,ARR是自动重载值
双边沿计数方式包括向上和向下计数,向上计数默认cnt小于CCR是高电平,向下计数默认大于CCR是低电平
默认无效是低电平,有效是高电平
中心对齐计数模式
输出极性为高则输出有效是高电平
1.开启定时器时钟并设置引脚复用器映射
2.初始化定时器参数
3初始化PWM输出参数,包含PWM模式,输出极性,使能等,比较输出使能是为enable时可以输出信号出去
4.使能预装载寄存器
5.开启定时器
pwm.c
#include "pwm.h"
//GPIO,AFIO,TIM
void TIM3_CH1_PWM_Init(u16 per,u16 pse)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; //PWM初始化结构体
//1*开启定时器,引脚,AFIO的时钟并设置引脚数据和重映射
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE); //重映射映射到GPIOC_Pin_6,连接LED7
//2*初始化定时器
TIM_TimeBaseInitStructure.TIM_Period = per;
TIM_TimeBaseInitStructure.TIM_Prescaler = pse;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//3*初始化PWM输出参数,包括PWM模式,输出极性,使能等
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //常用是pwm1和pwm2模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性配置为低,即cnt小于比较值是低电平,该板是低电平点亮
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIM3在CCR1的预装载寄存器,即自动重装比较值的寄存器
TIM_ARRPreloadConfig(TIM3,ENABLE); //使能ARR预装载寄存器 ,即那个自动重装一个计数周期的寄存器,就是那个pre(一个计数周期)https://blog.csdn.net/jpaekeo/article/details/64906477
//4*开启定时器
TIM_Cmd(TIM3,ENABLE);
}
pwm.h
#ifndef _pwm_H
#define _pwm_H
#include "system.h"
void TIM3_CH1_PWM_Init(u16 per,u16 pse);
#endif
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "pwm.h"
int main()
{
u16 i=0;
u8 pwm_flag=0;
SysTick_Init(72); //系统时钟初始
LED_INIT();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
TIM3_CH1_PWM_Init(500,72-1);//这里我们设定定时器自动重装载 值为 500,预分频系数为72-1,定时周期即为 500us,频率即为 2KHz,
//预分频系数为72-1,这里减 1 是因为定时器预分频器内部会自动加 1, 所以如果要进行 81 分频的话,就传递 81-1。
while(1)
{
if(pwm_flag==0)
{
i++;
if(i==300) //比较值300不能大于一个计数周期500,不然全是本机有效电平(低电平)
{
pwm_flag=1;
}
}
else
{
i--;
if(i==0)
{
pwm_flag=0;
}
}
TIM_SetCompare1(TIM3,i); //i 值传递给 TIM_SetCompare1 函数,这个函数功能是改变占空 比的,因此可以实现 D1 指示灯亮度的调节,呈现呼吸灯的效果
delay_ms(8);
}
}
一开始led没放到头文件路径中死活不变化,而且编译不报错,头秃的一比