1. 开发板原理图
使用的是LED7通过PWM来实现灯的亮度逐渐变高,之后再逐渐的变暗来模拟一个呼吸灯的一个效果。
PWM:
PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调
制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控
制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成
为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,
功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些
音频放大器,因此学习PWM具有十分重要的现实意义。
其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码
的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个
具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的
任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压
或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去
的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被
断开的时候。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。
通过改变占空比来实现信号的强弱变化。实现呼吸灯效果。
信号频率是由自动重装寄存器 ARR 的值决定,占空比由比较寄存器
CCR 的值决定。
2. 配置步骤
(1).在用户文件夹APP中建立专门用于pwm的一个文件夹。命名为PWM,配置编译路径。
将PWM的文件夹路径添加过来即可。
(2).在pwm文件夹中新建pwm.c和pwm.h文件。配置相关的pwm初始化操作
此次需要用到管脚的重映像和管脚复用功能。
之后利用GPIO函数实现重映射的作功能。
下面初始化定时器
Per和psc是函数的参数。使用的是信道1和向上计数模式,使用的是TIM3.
之后初始化pwm的相关函数功能。
PWM中最重要的就是调节占空比。在stm32的头文件的tim.c部分有一个函数用作调节占空比,
设定一个i值用于存放占空比,然后设定一个方向变量让i慢慢的增加或者减小。
以下为程序部分。
pwm.c程序
#include "pwm.h"
//通用定时器16位
void TIM3_CH1_PWM_Init(u16 per, u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/*开启相应的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,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.H)*/
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
/*******************************************/
/*************初始化定时器******************/
/*******************************************/
TIM_TimeBaseInitStructure.TIM_Period=per;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
/*******************************************/
/*************初始化PWM*********************/
/*******************************************/
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
//输出极性
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
//TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
//输出使能
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
//重装载配置
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
//ARR
TIM_ARRPreloadConfig(TIM3,ENABLE);
//使能定时器
TIM_Cmd(TIM3,ENABLE);
}
pwm.h程序
#ifndef _PWM_H
#define _PWM_H
#include "system.h"
void TIM3_CH1_PWM_Init(u16 per, u16 psc);
#endif
main.c程序
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "pwm.h"
int main()
{
//u8最大255
u16 i=0;
u8 fx=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
//设定固定频率2k
TIM3_CH1_PWM_Init(500,72-1);
while(1)
{
if(fx == 0)
{
i++;
if(i == 300)
{
fx=1;
}
}
else
{
i--;
if(i == 0)
{
fx=0;
}
}
//调节占空比
TIM_SetCompare1(TIM3,i);
delay_ms(10);
}
}