STM32F103ZET6学习记录-呼吸灯

     1. 开发板原理图

使用的是LED7通过PWM来实现灯的亮度逐渐变高,之后再逐渐的变暗来模拟一个呼吸灯的一个效果。

PWM:

PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调

,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控

制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成

为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,

功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些

音频放大器,因此学习PWM具有十分重要的现实意义。

其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码

的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个

具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的

任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压

或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去

的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被

断开的时候。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。

 

通过改变占空比来实现信号的强弱变化。实现呼吸灯效果。

信号频率是由自动重装寄存器 ARR 的值决定,占空比比较寄存器

CCR 的值决定。

2.     配置步骤

(1).在用户文件夹APP中建立专门用于pwm的一个文件夹。命名为PWM,配置编译路径。

STM32F103ZET6学习记录-呼吸灯_第1张图片

STM32F103ZET6学习记录-呼吸灯_第2张图片

将PWM的文件夹路径添加过来即可。

(2).在pwm文件夹中新建pwm.c和pwm.h文件。配置相关的pwm初始化操作

 STM32F103ZET6学习记录-呼吸灯_第3张图片

 此次需要用到管脚的重映像和管脚复用功能。

 STM32F103ZET6学习记录-呼吸灯_第4张图片

 之后利用GPIO函数实现重映射的作功能。

 下面初始化定时器

 STM32F103ZET6学习记录-呼吸灯_第5张图片

Per和psc是函数的参数。使用的是信道1和向上计数模式,使用的是TIM3.

之后初始化pwm的相关函数功能。

STM32F103ZET6学习记录-呼吸灯_第6张图片

STM32F103ZET6学习记录-呼吸灯_第7张图片

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);
	}
}

 

你可能感兴趣的:(STM32学习记录)