栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32CubeMX应用 -- PWM输出

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32CubeMX应用 -- PWM输出

目录

参考链接

一、原理

二、配置过程

 三、C语言示例程序


参考链接

STM32定时器基本原理_hurryddd的博客-CSDN博客_stm32定时器

一、原理

直接看图吧,清晰明了,CNT为计数器计数值,ARR为重装载寄存器的重装载值,CCRX为捕获比较(值)寄存器(x=1,2,3,4)设置的比较值。CNTCCRx时输出高电平

二、配置过程

 

在输入捕获配置中,除了要配置 选择要使用的定时器(TIM1~TIM5、TIM8),选择计时器的时钟源为内部时钟(CK_INT)、根据要定时的时间计算预分频系数(TIMx_PSC)、自动重装载值(TIMx_ARR)、内部时钟的分频系数以外,更重要的还需要配置:

TIMx_CCRx:捕获比较(值)寄存器(x=1,2,3,4),设置比较值。

 TIMx_CCMRx:捕获/比较模式寄存器,设置 OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

PWM模式1:在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2:在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为有效电平,否则为无效电平

 三、C语言示例程序

比如将Timer3的通道4配置成PWM输出

void MX_TIM3_Init(void)
{
	LL_TIM_InitTypeDef TIM_InitStruct = {0};
	LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
	LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	
	LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
	
	
	GPIO_InitStruct.Pin        = LL_GPIO_PIN_1;
	GPIO_InitStruct.Mode       = LL_GPIO_MODE_ALTERNATE;
	GPIO_InitStruct.Speed      = LL_GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	LL_GPIO_AF_RemapPartial_TIM3();
	
	
	TIM_InitStruct.Prescaler     = 71;
	TIM_InitStruct.CounterMode   = LL_TIM_COUNTERMODE_UP;
	TIM_InitStruct.Autoreload    = 49;
	TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
	LL_TIM_Init(TIM3, &TIM_InitStruct);
	LL_TIM_EnableARRPreload(TIM3);
	
	
	NVIC_EnableIRQ(TIM3_IRQn);

	LL_TIM_SetCounter      (TIM3, 0);
//	LL_TIM_EnableIT_UPDATE (TIM3);
//	LL_TIM_ClearFlag_UPDATE(TIM3);
	LL_TIM_EnableCounter   (TIM3);   
	
	
	
	LL_TIM_SetClockSource  (TIM3, LL_TIM_CLOCKSOURCE_INTERNAL);
	LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH4);
	
	TIM_OC_InitStruct.OCMode       = LL_TIM_OCMODE_PWM2;
	TIM_OC_InitStruct.OCState      = LL_TIM_OCSTATE_ENABLE;
	TIM_OC_InitStruct.OCNState     = LL_TIM_OCSTATE_DISABLE;
	TIM_OC_InitStruct.CompareValue = 35;
	TIM_OC_InitStruct.OCPolarity   = LL_TIM_OCIDLESTATE_LOW;
	LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH4, &TIM_OC_InitStruct);
	
	LL_TIM_OC_DisableFast        (TIM3, LL_TIM_CHANNEL_CH4);
	LL_TIM_SetTriggerOutput      (TIM3, LL_TIM_TRGO_RESET);
	LL_TIM_DisableMasterSlaveMode(TIM3);       
}


void Set_Timer3_PWM(uint16_t Freq, uint16_t Pulse)
{
	uint16_t Arr = 0, CompareValue = 0;
	
	Arr = 1000 / Freq - 1;
	CompareValue = Arr * Pulse / 100;
		
	LL_TIM_SetAutoReload(TIM3, Arr);
	LL_TIM_OC_SetCompareCH4(TIM3, CompareValue);	
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850321.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号