首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

stm32pwm初始化函数

2022-05-16 来源:华拓网
stm32pwm初始化函数

一、概述

PWM(Pulse Width Modulation,脉宽调制)是一种常用的控制技术,用于控制电机、LED等电子设备的亮度或速度。在STM32中,PWM也是一种常用的控制技术。本文将介绍如何在STM32中初始化PWM。

二、硬件配置

在使用PWM之前,需要先配置好STM32的硬件。具体步骤如下:

1. 选择一个可用的定时器(TIM)。

2. 配置该定时器的时钟源和分频系数。

3. 配置该定时器的计数模式和自动重载寄存器ARR(Auto-Reload Register)的值。

4. 配置输出比较通道(OC)。

5. 配置GPIO引脚作为OC输出口。

三、软件实现

1. 初始化定时器

首先需要初始化定时器。具体步骤如下:

1. 开启TIMx时钟(x为所选定时器编号)。

2. 设置TIMx分频系数和计数模式。常见的计数模式有向上计数模式和向下计数模式,可以根据具体需求选择。

3. 设置自动重载寄存器ARR的值。ARR决定了PWM波形周期长度,可以根据具体需求设置不同的值。

4. 使能更新事件中断,并开启TIMx中断。

5. 启动定时器。

2. 配置输出比较通道

接下来需要配置输出比较通道。具体步骤如下:

1. 选择一个可用的输出比较通道(OC)。

2. 配置该OC的工作模式。常见的工作模式有PWM1模式和PWM2模式,可以根据具体需求选择。

3. 配置该OC的输出极性。常见的输出极性有正极性和负极性,可以根据具体需求选择。

4. 配置该OC的占空比。占空比决定了PWM波形高电平时间与周期时间之比,可以根据具体需求设置不同的值。

3. 配置GPIO引脚

最后需要配置GPIO引脚作为OC输出口。具体步骤如下:

1. 开启GPIOx时钟(x为所选GPIO端口编号)。

2. 配置该GPIO引脚为AF(Alternate Function)模式,并设置AF编号为TIMx_CHy(y为所选OC通道编号)。

3. 配置该GPIO引脚的输出类型、驱动能力、上拉/下拉等属性。

四、完整代码

以下是一个完整的STM32 PWM初始化函数示例代码: ```c /**

* @brief 初始化PWM

* @param TIMx: 所选定时器编号

* @param OC_Channel: 所选OC通道编号 * @param GPIO_Pin: 所选GPIO引脚编号 * @param ARR: 自动重载寄存器的值 * @param PSC: 分频系数

* @param PWM_Mode: PWM工作模式,可选PWM1或PWM2 * @param Polarity: PWM输出极性,可选正极性或负极性 * @param DutyCycle: PWM占空比,取值范围为0~100(单位:百分之一) * @retval None */

void PWM_Init(TIM_TypeDef* TIMx, uint32_t OC_Channel, uint32_t GPIO_Pin, uint32_t ARR, uint32_t PSC, uint32_t PWM_Mode, uint32_t Polarity, uint32_t DutyCycle) {

// 开启TIMx时钟

if (TIMx == TIM1) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

} else if (TIMx == TIM2) {

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

} else if (TIMx == TIM3) {

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

} else if (TIMx == TIM4) {

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); } else { return; }

// 设置TIMx分频系数和计数模式

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = ARR - 1; TIM_TimeBaseStructure.TIM_Prescaler = PSC - 1;

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);

// 使能更新事件中断,并开启TIMx中断 TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE); NVIC_EnableIRQ(TIMx_IRQn);

// 启动定时器

TIM_Cmd(TIMx, ENABLE);

// 配置OC通道

TIM_OCInitTypeDef TIM_OCInitStructure; if (PWM_Mode == PWM1) {

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; } else if (PWM_Mode == PWM2) {

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; } else { return; }

if (Polarity == Polarity_Positive) { TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

} else if (Polarity == Polarity_Negative) {

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

} else { return; }

uint32_t CCR_Val = (uint32_t)(ARR * DutyCycle / 100); switch (OC_Channel) { case TIM_Channel_1:

TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable); TIM_SetCompare1(TIMx, CCR_Val); break;

case TIM_Channel_2:

TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable); TIM_SetCompare2(TIMx, CCR_Val); break;

case TIM_Channel_3:

TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable); TIM_SetCompare3(TIMx, CCR_Val); break;

case 4: default:

TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);

TIM_SetCompare4(TIMx, CCR_Val); break; }

// 配置GPIO引脚

GPIO_InitTypeDef GPIO_InitStructure; if (GPIO_Pin < GPIO_Pin_8) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } else if (GPIO_Pin < GPIO_Pin_15) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } else { return; }

} ```

五、调用示例

以下是一个调用PWM初始化函数的示例代码: ```c

int main(void) {

PWM_Init(TIM3, TIM_Channel_1, GPIO_Pin_6, 1000, 72, PWM1, Polarity_Positive, 50);

while (1) { } } ```

以上代码将在TIM3的第一个OC通道上输出一个周期为1000、占空比为50%、正极性的PWM波形,并将其输出到PA6引脚上。 六、总结

本文介绍了STM32中PWM的初始化方法,包括硬件配置和软件实现。对于初学者来说,可以通过本文快速掌握STM32中PWM的使用方法。对于资深开发者来说,可以通过本文加深对PWM的理解,并在实际应用中灵活运用。

因篇幅问题不能全部显示,请点此查看更多更全内容