stm32定时器实现PWM输出控制无源蜂鸣器(HAL)

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lee_xuwei/article/details/86648267

(一)PWM概念和原理

脉冲宽度调制(PWM),是英文“Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

PWM原理示意图
PWM原理示意图

上图是简单的PWM原理示意图。图中,我们假定定时器工作在向上计数PWM模式,且当CNT<CCRx时,输出0,当CNT>=CCRx时输出1,当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的频率。

(二)代码示例

环境:STM32F103C8  主频64MHz   TIM3

(1)GPIO初始化

 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

(2)PWM相关函数

//---------------------------main.c---------------------------------------
// PWM 输出初始化
// arr:自动重装值  
static void TIM3_PWM_Init(UStoreData *pStoreData)
{
	uint32_t liv_Var = Buzzer_Get_Buzzer_Volume(pStoreData->Buzzer_Volume);
	
	if (liv_Var == BUZZER_VOLUME_ABNORMAL)
	{
		liv_Var = BUZZER_VOLUME_5;
	}
		
	TIM3_Handler.Instance = TIM3;
	TIM3_Handler.Init.Prescaler = (HAL_RCC_GetPCLK1Freq() << 1) / 200000UL - 1; 	// 定时器分频:200K
	TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
	TIM3_Handler.Init.Period = BUZZER_PWM_MAX_FRE; 	// 自动重装载值
	TIM3_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
	HAL_TIM_PWM_Init(&TIM3_Handler);
	
	TIM3_CH3Handler.OCMode = TIM_OCMODE_PWM1;
	TIM3_CH3Handler.Pulse = liv_Var; 	// 设置比较值,此值用来确定占空比,占空比为50%时,蜂鸣器最响
	TIM3_CH3Handler.OCPolarity = TIM_OCPOLARITY_LOW; // 输出比较极性为低
	HAL_TIM_PWM_ConfigChannel(&TIM3_Handler, &TIM3_CH3Handler, TIM_CHANNEL_3);
	HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_3);
}

// 设置TIM通道3的占空比
// compare:比较值
void TIM_SetTIM3Compare3(uint32_t compare)
{
	TIM3->CCR3 = compare;
}

//---------------------------stm32f1xx_hal_msp.c------------------------------------

// 定时器底层驱动,时钟使能,引脚配置
// 此函数会被HAL_TIM_PWM_Init()调用
// htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	__HAL_RCC_TIM3_CLK_ENABLE();		
}

猜你喜欢

转载自blog.csdn.net/lee_xuwei/article/details/86648267