STM32学习和实践笔记(24):PWM输出实验:呼吸灯

发布于:2024-05-04 ⋅ 阅读:(39) ⋅ 点赞:(0)

本实验所要实现的功能是:通过TIM3的CH1输出一个PWM信号,控制D7指示

灯由暗变亮,再由亮变暗,类似于人的呼吸。程序框架如下

1)初始化PC6管脚为PWM输出功能

2)PWM输出控制程序

本实验的硬件电路非常简单,只使用到开发板上的LED(D7),因为D7指

示灯接在PC6管脚,而通过对TIM3_CH1复用功能完全重映射就可以映射到

PC6脚。所以可以通过TIM3的CH1输出PWM信号,实现D7指示灯呼吸灯的控

制。

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "pwm.h"



/*	通过TIM3的CH1输出一个PWM信号,控制D7指示

灯由暗变亮,再由亮变暗,类似于人的呼吸。程序框架如下:

(1)初始化PC6管脚为PWM输出功能

(2)PWM输出控制程序
*/

int main()
{
	u16 i=0;
	u8 fx=0;
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
	LED_Init();
	TIM3_CH1_PWM_Init(500,72-1);//PWM频率设为2KHZ
	

	
	while(1)
	{
		if(fx==0)
		{
			i++;
			if(i==300)
			{
				fx=1;
			}
		}
			
			else
			{
				i--;
				if(i==0)
				{
					fx=0;
				}
			}
		
		TIM_SetCompare1(TIM3, i); //修改TIMx_CCRx的值控制占空比
		delay_ms(100);
		
	}
}


pwm.c

#include "pwm.h"
#include "led.h"

void TIM3_CH1_PWM_Init(u16 period,u16 prescaler)
{
		GPIO_InitTypeDef GPIO_InitStructure; //为将PC6引脚初始化而声明的结构体变量
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定时器初始化的结构体变量声明
		TIM_OCInitTypeDef TIM_OCInitStructure; //初始化PWM输出各参数的结构体变量声明 
	
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PC端口的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟以便进行端口映射
	
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; //
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;// PC6为复用功能输出
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//
		GPIO_Init(GPIOC,&GPIO_InitStructure);
	
		GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//将通用定时器3的通道1的输出从PA6引脚重映射到PC6引脚
		
		TIM_TimeBaseInitStructure.TIM_Period=period;   //装入函数传过来的自动装载值
		TIM_TimeBaseInitStructure.TIM_Prescaler=prescaler; //装入函数传过来的分频系数
		TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频(没有分频)
		TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式:从0开始计数到自动重载值后溢出产生中断
		TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3各参数:自动重装值、分频系统、计数方式等
	
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_Low;
		TIM_OCInitStructure.TIM_OutputState =	TIM_OutputState_Enable;
		TIM_OC1Init(TIM3,&TIM_OCInitStructure);
	
		TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIMx在CCRx上的预装载寄存器
		TIM_ARRPreloadConfig(TIM3, ENABLE);//使能 TIMx 在 ARR 上的预装载寄存器允许位
		
		TIM_Cmd(TIM3, ENABLE);//开启定时器
	
}
	



pwm.h

#ifndef _pwm_H
#define _pwm_H

#include "system.h"

void TIM3_CH1_PWM_Init(u16 period,u16 prescaler);


#endif

实际在开发板上测试,因为开发板上不是接的LED,而是接到一个数码管的一段,呼吸灯的效果不明显。

改为下述参数后,呼吸灯的效果就很明显了。


网站公告

今日签到

点亮在社区的每一天
去签到