stm32f103 pwm学习

本文详细解析了STM32微控制器中PWM模块的初始化过程,包括频率与占空比的设置方法,以及如何通过配置寄存器实现精确的PWM信号生成。适用于嵌入式系统开发人员理解和应用PWM技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void PWM_Init(u32 Freq, u32 Duty_Cycle)
{		
	//TIM5 counter clock
	uwPeriodValue = (uint32_t) ((SystemCoreClock / 2 / Freq) - 1);	
	PWMHandle.Instance = TIM5;    //TIM5_CH4²úÉúPWM
	PWMHandle.Init.Prescaler     = 0;
	PWMHandle.Init.Period        = uwPeriodValue;
	PWMHandle.Init.ClockDivision = 0;
	PWMHandle.Init.CounterMode   = TIM_COUNTERMODE_UP;
	PWMHandle.Init.RepetitionCounter = 0;
	
	if(HAL_TIM_PWM_Init(&PWMHandle) != HAL_OK)
	{
		while(1);
	}

	sConfig.OCMode     = TIM_OCMODE_PWM1;        //PWM1ģʽ
	sConfig.OCPolarity = TIM_OCPOLARITY_LOW;     //Êä³ö¼«ÐÔµÍµçÆ½
	sConfig.OCFastMode = TIM_OCFAST_DISABLE;     //Êä³ö±È½Ï¿ìËÙʹÄܽûÖ¹
	sConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
	sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
	sConfig.OCIdleState  = TIM_OCIDLESTATE_SET;

	sConfig.Pulse = (Duty_Cycle * (uwPeriodValue - 1)) / 100;     //ÉèÖÃÕ¼¿Õ±È
	
	if(HAL_TIM_PWM_ConfigChannel(&PWMHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK)
	{
		while(1);
	}

	if(HAL_TIM_PWM_Start(&PWMHandle, TIM_CHANNEL_4) != HAL_OK)  //PWMÆô¶¯
	{
		while(1);
	}
}

main.c中

PWM_Init(10000,duty);   //10KHz
10000表示频率。
duty表示占空比。

duty等于50%时,频率为10000,那么高电平为0.05ms,低电平为0.05ms。
那么就要设置周期寄存器的时间为0.1ms。
如果原来pwm 的时钟频率是SystemCoreClock / 2 ,那么数多少次,可以占用0.1ms?
SystemCoreClock / 2/10000
那么如何设置值呢?  SystemCoreClock / 2/10000-1
uwPeriodValue = (uint32_t) ((SystemCoreClock / 2 / Freq) - 1);	
设置比较寄存器
sConfig.Pulse = (Duty_Cycle * (uwPeriodValue - 1)) / 100; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值