STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)

STM32定时器输出一路PWM(控制LED灯的亮度)

STM32的定时器具有强大的功能,今天的输出PWM功能是属于其中的输出比较功能。
stm32输出PWM原理:(以下为个人理解,如果错误的地方 请多多指教OoO)
CNT是计数值 ARR是重装载值 CCRx是比较值
定时器输出PWM有两种模式:
PWM 模式1 计数值大于比较值 输出有效电平 否则输出无效电平
PWM 模式2 计数值大于比较值 输出无效电平 否则输出有效电平(有效电平我们自己设定,电平输出作用在定时器PWM的输出通道)
例如:
ARR=1000 CCRx=500 有效电平为:高电平
当CNT 当CNT>CCRx 时(即CNT在(501,1000)的范围时) 输出有效电平(高电平)
高低电平时间各占一半,即PWM的占空比为50%,重装载值为PWM的周期(即定时器的更新时间为PWM的周期)
定时器时间的计算在我的另外一篇文章定时器控制LED灯中有说到,有不懂得如何计算小伙伴可以去看一下
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第1张图片

一、定时器–>配置

1、新建工程,配置RCC、Clock、GPIO(这是对于STM32F407ZG,大家根据自己的开发板的具体参数去配置)

RCC
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第2张图片
Clock
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第3张图片
GPIO(设置两个按键PE2、PE3,来改变CCRx的值的大小从而改变占空比的大小;PF10作为指示灯,按键按一次改变一次状态)
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第4张图片
在这里插入图片描述
按键配置(K1、K2配置类似)
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第5张图片

2、配置TIM(这里选用TIM14,CH1,输出端口为PF9)

Pluse为比较值,这里先设置为0(在程序里面会有改动)
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第6张图片

二、输出代码

输出配置
STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第7张图片

三、添加自定义代码

1、选择开发板型号

STM32cubemx学习记录————TIM输出PWM(基于STM32F407ZG)_第8张图片

2、添加自定义代码

定义全局变量(Pulse比较值)

uint16_t TIM_Pulse=500;//初值设置为500(占空比50%)

添加函数,功能:重新设定Pulse的值

void TIM14_SetPulse(uint16_t pulse)
{
		TIM_OC_InitTypeDef sConfigOC = {0};
		
		sConfigOC.OCMode = TIM_OCMODE_PWM1;
		sConfigOC.Pulse = pulse;//占空比的值
		sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
		sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
		if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
		{
			Error_Handler();
		}
		HAL_TIM_PWM_Start (&htim14,TIM_CHANNEL_1);//使通道一开始产生PWM
}

添加按键函数

#define K1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)//读取PE2、PE3的状态
#define K2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)

void Key_Work()
{
		if(K1==0)
		{
				HAL_Delay(10);
				if(K1==0)
				{
						TIM_Pulse+=50;//占空比增加
						printf("%d\n",TIM_Pulse);//使用串口输出占空比的值
						HAL_GPIO_TogglePin(GPIOF,LED_Pin);//指示灯转态改变
						TIM14_SetPulse(TIM_Pulse);//重新设置
				}
				while(!K1);
		}
		else if(K2==0)
		{
				HAL_Delay(10);
				if(K2==0)
				{
						TIM_Pulse-=50;
						printf("%d\n",TIM_Pulse);
						HAL_GPIO_TogglePin(GPIOF,LED_Pin);
						TIM14_SetPulse(TIM_Pulse);
				}
				while(!K2);
		}
}

在主函数的while中调用按键函数,并添加

HAL_TIM_PWM_Start (&htim14,TIM_CHANNEL_1);//使通道一开始产生PWM,第一次启动

编译并烧入开发板,改变Pulse的值 LED灯的暗亮也随之改变

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