昆明网站建设介绍,国家住房城乡建设部网站,网站 手机网站,优秀校园景观设计文章目录 前言一、PWM是什么#xff1f;二、CubeMX配置PWM三、代码分析3.1 CubeMX生成代码3.2 PWM的几个库函数HAL_TIM_PWM_Start 3.3 PWM回调函数3.4 占空比占空比是什么__HAL_TIM_SET_COMPARE设置占空比 四、呼吸灯示例总结 前言
STM32微控制器是一系列功能强大的微控制器二、CubeMX配置PWM三、代码分析3.1 CubeMX生成代码3.2 PWM的几个库函数HAL_TIM_PWM_Start 3.3 PWM回调函数3.4 占空比占空比是什么__HAL_TIM_SET_COMPARE设置占空比 四、呼吸灯示例总结 前言
STM32微控制器是一系列功能强大的微控制器广泛应用于嵌入式系统和电子设备中。其中一个常见的应用是生成PWM信号用于控制各种设备如电机、LED灯、声音发生器等。了解如何配置和使用PWM输出对于嵌入式系统开发非常重要。
CubeMX是STMicroelectronics提供的一种工具用于帮助开发人员轻松配置STM32微控制器并生成初始化代码。通过CubeMX您可以在不深入复杂的寄存器级编程的情况下设置PWM输出的参数节省了大量的时间和精力。
在本文中我们将首先介绍STM32微控制器的基础知识包括GPIO通用输入/输出引脚和定时器的概念这是配置PWM输出所必需的。然后我们将详细讨论CubeMX的基本用法包括如何创建一个新的项目、配置定时器和GPIO引脚以及生成PWM输出代码。 一、PWM是什么
当我们需要控制某些东西的强度、亮度、速度等时常常会用到PWM即脉冲宽度调制。 想象一下你在做热巧克力你有一杯热奶和一块巧克力你想要控制巧克力的甜度。你可以用勺子每次蘸取一小勺巧克力然后搅拌到奶里。如果你蘸巧克力的时间很短巧克力味就不浓如果你蘸巧克力的时间很长巧克力味就浓。 PWM就有点像这个过程。它是一种通过不断切换电流的方式来控制设备的强度或亮度的方法。在PWM中我们不是像勺子一样蘸取巧克力而是快速地打开和关闭电流然后根据打开和关闭的时间来控制设备的表现。如果打开时间很短设备的效果就弱如果打开时间很长设备的效果就强。 所以PWM就像在控制设备的过程中以不同的速度开和关开关从而控制了设备的特性就像你用不同时间搅拌巧克力来控制它的味道一样。这是一种常见的电子控制技术用于各种应用从调光LED到控制电机速度都可以使用PWM。
二、CubeMX配置PWM
1、其实PWM占用的是定时器所以我们要选择定时器。 2、然后选择通道 千万不要选错了。
3、设置分频系数和我们之前的定时器是一样的如果忘记了的同学建议重看前面的文章 4、设置周期 1000-1代表一个毫秒一次可以说这个就是我们常说的占空比在后面我们会将占空比是什么。
5、最后设置一下中断开启即可 6、最后生成代码就可以了
三、代码分析
3.1 CubeMX生成代码
static void MX_TIM2_Init(void)
{/* USER CODE BEGIN TIM2_Init 0 *//* USER CODE END TIM2_Init 0 */TIM_MasterConfigTypeDef sMasterConfig {0};TIM_OC_InitTypeDef sConfigOC {0};/* USER CODE BEGIN TIM2_Init 1 *//* USER CODE END TIM2_Init 1 */htim2.Instance TIM2;htim2.Init.Prescaler 72-1;htim2.Init.CounterMode TIM_COUNTERMODE_UP;htim2.Init.Period 1000-1;htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(htim2) ! HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(htim2, sMasterConfig) ! HAL_OK){Error_Handler();}sConfigOC.OCMode TIM_OCMODE_PWM1;sConfigOC.Pulse 0;sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1) ! HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM2_Init 2 *//* USER CODE END TIM2_Init 2 */HAL_TIM_MspPostInit(htim2);}代码分析 TIM_MasterConfigTypeDef sMasterConfig {0}; 和 TIM_OC_InitTypeDef sConfigOC {0}; 这两行定义了两个结构体变量 sMasterConfig 和 sConfigOC用来存储定时器的配置信息。
htim2.Instance TIM2; 这行代码将定时器 htim2 的实例设置为 TIM2表明要配置的是 TIM2 定时器。
htim2.Init.Prescaler 72-1; 这行代码设置了 TIM2 的分频器分频器决定了计数器的计数速度。
htim2.Init.CounterMode TIM_COUNTERMODE_UP; 这行代码设置了计数模式即计数器是向上计数还是向下计数。
htim2.Init.Period 1000-1; 这行代码设置了计数器的周期即计数器从 0 开始计数一直计数到 999然后重新开始。
htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; 这行代码设置了时钟分频器的分频系数这里是不分频。
htim2.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE; 这行代码禁用了自动重装载预装载这意味着在更新定时器参数时不会立即生效而是等待计数器计数到上一个周期结束后才会生效。
if (HAL_TIM_PWM_Init(htim2) ! HAL_OK) 这行代码初始化了 PWM 功能的定时器 TIM2如果初始化失败就会调用 Error_Handler() 函数进行错误处理。
sMasterConfig.MasterOutputTrigger TIM_TRGO_RESET; 这行代码设置了主定时器的输出触发模式这里是复位触发。
sMasterConfig.MasterSlaveMode TIM_MASTERSLAVEMODE_DISABLE; 这行代码禁用了主从模式主从模式通常用于多个定时器的同步。
if (HAL_TIMEx_MasterConfigSynchronization(htim2, sMasterConfig) ! HAL_OK) 这行代码配置了主定时器的同步功能如果配置失败就会调用 Error_Handler() 函数进行错误处理。
sConfigOC.OCMode TIM_OCMODE_PWM1; 这行代码设置了 TIM2 的通道 1 为 PWM1 模式。
sConfigOC.Pulse 0; 这行代码设置了 PWM 的脉冲值初始值为 0。
sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; 这行代码设置了 PWM 输出的极性这里是高电平有效。
sConfigOC.OCFastMode TIM_OCFAST_DISABLE; 这行代码禁用了快速输出模式。
if (HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1) ! HAL_OK) 这行代码配置了 TIM2 的通道 1 为 PWM 模式如果配置失败就会调用 Error_Handler() 函数进行错误处理。
HAL_TIM_MspPostInit(htim2); 这行代码完成了定时器的初始化后处理可能包括一些硬件相关的配置。
3.2 PWM的几个库函数
HAL_TIM_PWM_Start
HAL_TIM_PWM_Start 函数是HAL库Hardware Abstraction Layer硬件抽象层中用于启动定时器的 PWM脉冲宽度调制功能的函数。以下是该函数的原型、功能和参数含义
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);HAL_StatusTypeDef这是函数的返回类型它表示函数执行的结果通常用于检查函数是否成功执行。如果成功返回 HAL_OK否则返回错误代码。
TIM_HandleTypeDef *htim这是一个指向 TIM_HandleTypeDef 结构体的指针用于指定要操作的定时器。
uint32_t Channel这是一个表示通道的参数用于指定要启动 PWM 的定时器通道。通常定时器可以有多个通道每个通道可以独立配置并启动 PWM 输出。
函数的功能是启动指定通道的 PWM 输出。PWM 是一种用于产生脉冲宽度可调的信号的技术通常用于控制电机速度、LED亮度等应用。通过调整参数你可以控制 PWM 的频率和占空比。启动 PWM 后定时器将按照配置的参数生成 PWM 信号并根据需要输出到相应的引脚上。
使用示例
HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1);上述示例代码将启动 htim2 定时器的通道 1 上的 PWM 输出。这将使定时器开始生成 PWM 信号并根据配置的参数输出到相应的引脚上。
3.3 PWM回调函数
函数原型如下
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);3.4 占空比
占空比是什么
在前面我们已经设置了这个属性 占空比是一个用来描述脉冲信号中高电平时间与周期之比的概念。通俗来说它表示了一个周期内信号处于高电平状态的时间比例。
考虑一个周期性的信号比如一个方波或PWM脉冲宽度调制信号。这个信号在一个周期内会不断重复而占空比告诉我们高电平通常是1表示电压为高的状态在这个周期内占据了多大的比例。
举个例子如果我们有一个方波信号它在一个周期内持续高电平的时间是2毫秒而周期总共是10毫秒那么占空比就是2毫秒/10毫秒也就是20%。这意味着在这个信号中高电平状态占据了整个周期的20%。占空比通常以百分比的形式表示因此这个信号的占空比是20%。
占空比在电子电路和信号处理中非常重要因为它决定了信号的特性。在PWM中占空比控制了输出信号的平均电压或功率因此可以用来控制电机的速度、LED的亮度等。在电路设计中占空比也常常用来调整信号的特性以满足特定的需求。
或者我们可以简单的理解为占我们上面的图片上的1000的百分之几我们的灯的亮度就会是正常的百分之几。
__HAL_TIM_SET_COMPARE设置占空比
__HAL_TIM_SET_COMPARE 宏是用于在STMicroelectronics的HAL库中设置定时器的通道比较值比较寄存器值的宏。这个宏通常用于PWM脉冲宽度调制控制其中比较值决定了PWM信号的占空比。以下是宏的作用和参数
作用
__HAL_TIM_SET_COMPARE 宏的作用是将指定定时器的指定通道的比较值比较寄存器的值设置为给定的值。这允许您动态地更改PWM信号的占空比以控制相关设备的亮度、速度或其他特性。 参数
TIMx这是指向TIM定时器外设的指针其中 x 表示具体的定时器例如 TIM1、TIM2 等。您需要指定要设置比较值的定时器。
Channel这是指定要设置比较值的通道通常以宏的形式表示如 TIM_CHANNEL_1、TIM_CHANNEL_2 等。不同的通道对应于定时器的不同输出引脚或用途。
Compare这是要设置的比较值。比较值决定了PWM信号的占空比。具体数值的意义取决于应用通常是一个表示时间或百分比的值。
使用示例
__HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, 500);上述示例将 htim2 定时器的通道 1 的比较值设置为 500。这将影响定时器生成的PWM信号的占空比具体效果取决于定时器和应用的配置。
四、呼吸灯示例
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{static uint32_t index 0;static uint8_t step 0;switch(step){case 0:{__HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_1,index);index;if(index 1000){step 1;}}break;case 2:{__HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_1,index);index--;if(index 0){step 0;}}break;}
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)这是一个函数定义表示一个回调函数它会在PWM信号的一个脉冲周期结束后被调用。它接受一个指向定时器句柄TIM_HandleTypeDef的指针作为参数。
static uint32_t index 0;这是一个静态变量用来记录一个数值初始值为0。它在函数内部保留其值而不会在每次函数调用时重新初始化。
static uint8_t step 0;同样是一个静态变量用来记录一个表示步骤的数值初始值为0。
switch(step)这是一个开关语句根据 step 的值来执行不同的代码块。
case 0:如果 step 的值为0那么执行以下代码块。
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, index);这是一个函数调用用于设置定时器的通道1的PWM信号的占空比占空比的值由 index 决定。
index;增加 index 的值这将在下次函数调用时用于增加PWM信号的占空比。
if(index 1000)如果 index 的值大于或等于1000执行以下代码块。
step 1;将 step 的值设置为1这将触发下一个 case 中的代码块执行。
case 2:如果 step 的值为2执行以下代码块。
index–;减小 index 的值这将在下次函数调用时用于减小PWM信号的占空比。
if(index 0)如果 index 的值等于0执行以下代码块。
step 0;将 step 的值重新设置为0这将触发下一个 case 0 中的代码块执行形成一个循环。
这段代码的作用是在PWM信号中逐渐增加占空比然后再逐渐减小占空比不断循环。这通常用于控制某些设备或效果的强度或速度。每次函数调用都会更新PWM信号的占空比直到达到一定条件例如占空比达到1000或0时会改变步骤step来反转占空比的变化方向。这种方式可以创建一种周期性变化的PWM信号用于控制设备的行为。 总结
STM32微控制器是一系列功能强大的微控制器广泛应用于嵌入式系统和电子设备中。其中一个常见的应用是生成PWM信号用于控制各种设备如电机、LED灯、声音发生器等。了解如何配置和使用PWM输出对于嵌入式系统开发非常重要。
CubeMX是STMicroelectronics提供的一种工具用于帮助开发人员轻松配置STM32微控制器并生成初始化代码。通过CubeMX您可以在不深入复杂的寄存器级编程的情况下设置PWM输出的参数节省了大量的时间和精力。
在本文中我们将首先介绍STM32微控制器的基础知识包括GPIO通用输入/输出引脚和定时器的概念这是配置PWM输出所必需的。然后我们将详细讨论CubeMX的基本用法包括如何创建一个新的项目、配置定时器和GPIO引脚以及生成PWM输出代码。