STM32CubeMX应用 -- PWM输出

目录

参考链接

一、原理

二、配置过程

 三、C语言示例程序


参考链接

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

一、原理

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

二、配置过程

 

在输入捕获配置中,除了要配置 选择要使用的定时器(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输出

/* TIM3_CH4 泵PWM控制 init function */
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};
	
	/* Peripheral clock enable */
	LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
	
	/**TIM2 GPIO Configuration    
	PB1     ------> TIM3_CH4 
	*/
	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();
	
	/*TIM2*/
	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);
	
	/* TIM1 interrupt Init */
	NVIC_EnableIRQ(TIM3_IRQn);

	LL_TIM_SetCounter      (TIM3, 0);
//	LL_TIM_EnableIT_UPDATE (TIM3);
//	LL_TIM_ClearFlag_UPDATE(TIM3);
	LL_TIM_EnableCounter   (TIM3);   
	
	
	/*PWM*/
	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);       
}

/*
 *设置PWM的频率和占空比
 *ARR决定PWM频率,PULSE比较值决定PWM占空比
 *频率 = TCCLK72M /(Autoreload + 1) * (Prescaler + 1) psc = 71
 *Arr = 10^6 / 频率 - 1. 频率单位为KHZ,所以 Arr = 1000 / 频率 - 1
 *
 *比较值 0 - Arr 对应占空比 0 - 100%
*/
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);	
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值