STM32Cube的PWM控制应用篇(一)用一个定时器改变另一个定时器下的三个PWM波占空比

STM32Cube的PWM控制基础篇(一)一路PWM设置
STM32Cube的PWM控制基础篇(二)多路占空比不同的PWM
STM32Cube的PWM控制基础篇(三)定时器的PWM设置详解
今天来点干货!!
以下说明要建立在以上基础篇知识已经搞清楚的情况下来操作!!!!!

通过之前的学习,我们可以基本上操作我们需要的PWM波形,今天就在这个基础上做一些衍生,个人见解,不喜一定要在评论区喷我。

今日目标:用一个定时器控制另一个定时器下的三路PWM波

一、实验原理

问题:我们在之前的学习中可以通过STM32Cube来设置好定时器,但是我们在改变定时器下PWM的占空比时只能在代码中改变其占空比值,PWM波就按照该占空比一直运行,但是我们如果需要占空比随时间变化呢?

(解决方案是在不占用main.c主循环来处理的,以便于大家在使用操作系统或者想在main.c主循环写一些其他东西的时候不影响PWM的输出)
解决方案:我们通过另一个定时器中断来改变当前定时器下的PWM波的占空比,写好计算方法之后就可以按照我们的计算方法来处理PWM。

总而言之就是用一个定时器去改变另一个定时器PWM的参数

二、操作步骤

要求:用定时器TIM1构建三个500Hz,脉冲宽度为50%的PWM波,用定时器TIM2中断以50Hz的频率使三个PWM在占空比为50%和80%之间来回变化

1、根据自己的stm32的芯片型号来选择,我这里是STM32F103RBTx

芯片选择

2、选好芯片之后照旧设置RCC为外部时钟

设置RCC

3、设置定时器TIM1为三路PWM模式,并设置时钟源位内部时钟,定时器TIM2启动即可,如图:

定时器设置

4、配置时钟树

配置时钟树
时钟源选择外部时钟,外部时钟为8MHz倍频9倍后变为72MHz后导入系统时钟,通过AHB分频后得到硬件时钟HCLK后分配给各个部件,图中标识了时钟频率最大值,根据后边的分频来保证各个部件不超过最大频率(按照需求配置,不要小于PWM的频率即可。PS:频率越低越节能,越高性能越好)

5、定时器设置(设置PWM频率)

点击TIM1进入配置界面
在这里插入图片描述
我现在需要使PWM频率达到500Hz,此时时钟树APB2设置为72MHz,所以存在以下计算公式:

						目的定时器频率=时钟源/(预分频系数*自动重载值)

						时钟源:72MHz
						目的定时器频率:500Hz

所以我们可以自己设置自动重载值和预分频系数使等式成立:

预分频系数:144
自动重载值:1000

由于计数是从0开始,所以需要在设置量上减1得到以下设置图
在这里插入图片描述
之后下拉滑动条,根据下图设置进行更改,原理看博客顶部基础篇(三)
在这里插入图片描述
以上设置效果为PWM低电平有效,PWM关闭时引脚为高电平

点击ok保存,点击TIM2进入配置界面
我现在需要使TIM2频率达到50Hz,此时时钟树APB2设置为72MHz,所以存在以下计算公式:

						目的定时器频率=时钟源/(预分频系数*自动重载值)

						时钟源:72MHz
						目的定时器频率:50Hz

所以我们可以自己设置自动重载值和预分频系数使等式成立:
所以我们可以自己设置自动重载值和预分频系数使等式成立:

预分频系数:1440
自动重载值:1000

由于计数是从0开始,所以需要在设置量上减1得到以下设置图
TIM2设置
完成之后设置完毕,点击菜单栏
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照以上设置生成项目(会玩的根据自己的习惯搞)

6、代码部分(设置PWM占空比)

由于本次应用不占用main.c主循环,我们大多代码是在tim.c中添加的
首先第一步,一定要在main.c中启动定时器TIM2中断

  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim2); \\启动TIM2中断
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);\\启动TIM1的PWM1
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);\\启动TIM1的PWM2
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);\\启动TIM1的PWM3
  /* USER CODE END 2 */

之后再在main.c中的/* USER CODE BEGIN PV */部分定义全局变量stat,中断需要使用

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t stat=0;
/* USER CODE END PV */

改完main.c文件后打开tim.c,在最下方的用户代码1部分添加如下TIM2中断回调函数:

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	extern uint8_t stat;
    if (htim->Instance == TIM2)
			{
				if (stat==0)  stat=1;				\\改变状态
				else  stat=0;
				
				if(stat==0)							\\判断状态,状态为0时设定占空比为50%
				{
					__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);
					__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 500);
					__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 500);
				}
				else								\\判断状态,状态为1时设定占空比为80%
				{
					__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 800);
					__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 800);
					__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 800);
				}
				
			}
}

/* USER CODE END 1 */

工作结束,编译下载!!

7、测试部分

用逻辑分析仪三个频道夹子夹到对应PWM引脚,底线接板子底线,进行分析得到结果:
在这里插入图片描述
眼神不好的同学放大看!!!!!
本次实验为低电平有效,所以周期内有效部分是低电平部分

本次实验PWM频率为500Hz,控制定时器TIM2频率为50Hz,所以应该是10个PWM周期进行一次变化、

由图可知,10个占空比为50%的波形结束后变为10个80%占空比的波形,之后又变为50%占空比
由图可知,一个周期为2.0ms,10个周期改变一次

							fpwm=1/Tpwm=1/0.02s=500Hz
		    fpwm:PWM频率
			Tpwm:PWM周期
							fc=1/Tc=1/(0.02s*10)=50Hz
		    fc:控制频率
			Tc:控制周期

由此可知,PWM频率500Hz,占空比每0.2秒变化一次,控制频率为50Hz,占空比变化为50%-80%-50%-80%循环,实验目标达成!

										Good Game!!!!!!

					接下来会推出一系列的关于PWM控制电机的分享,有需要的猿们敬请关注!!!!!

以上内容欢迎大家转载引用,标明出处即可!!!!!

发布了20 篇原创文章 · 获赞 53 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ASWaterbenben/article/details/93599856