stm32f103定时器产生PWM

理清思路

  1. 确定使用的定时器(本文里为定时器1)
  2. 确定输出通道(本文里为CH1)
  3. 根据所选用的输出端口确定重映射关系(本文里使用PA8,采用部分重映射)

*注意:本文里所使用的是定时器1,其时钟信号来源于APB2时钟,而stm32f103里大部分定时器的时钟信号源来自APB1时钟,并且由于定时器1属于高级定时器与普通定时器配置上略有不同,请读者根据自己的需要调整代码。

初始化工作

  1. 使能并初始化时钟
  2. 使能并初始化GPIO
  3. 使能AFIO,配置重映射

代码

void PWM_timer1_PA8_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef OCInit;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|
						   RCC_APB2Periph_GPIOA|
						   RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
	
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_Prescaler=0;
	TIM_TimeBaseStructure.TIM_Period=1000;
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
	
	TIM_CtrlPWMOutputs(TIM1,ENABLE);//使用高级定时器输出PWM时需要这条代码,如果是普通定时器则不需要这条代码
	
	OCInit.TIM_OCMode=TIM_OCMode_PWM1;
	OCInit.TIM_OCPolarity=TIM_OCPolarity_High;
	OCInit.TIM_Pulse = 500;
	OCInit.TIM_OutputState=TIM_OutputState_Enable;
	
	TIM_OC1Init(TIM1,&OCInit);
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

	TIM_Cmd(TIM1,ENABLE);
}

代码详解

GPIO和定时器部分的配置在我之前的文章里都已经讲过了,下面的内容将会对定时器的PWM相关的内容着重分析。

需要注意的是:
GPIO的引脚视情况需要配置为复用推挽输出模式

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
重映射函数GPIO_PinRemapConfig(GPIO_PartialRemap_TIMx, ENABLE);

根据手册可知,如果我们想让PA8作为PWM的输出端口,那么可以对定时器1做部分重映射或者不做重映射。
在这里插入图片描述

高级定时器的刹车和死区寄存器(TIMx_BDTR)

对于普通定时器来说是不需要下面这条代码的,但是对于高级定时器来说,如果你想输出PWM,那么就需要下面这条代码来配置刹车和死区寄存器。

TIM_CtrlPWMOutputs(TIM1,ENABLE);

关于刹车和死区寄存器的说明本章不做重点讨论,如果你感兴趣可自行阅读下面寄存器说明:
在这里插入图片描述
在这里插入图片描述

捕获/比较输出配置
OCInit.TIM_OCMode=TIM_OCMode_PWM1;
OCInit.TIM_OCPolarity=TIM_OCPolarity_High;
OCInit.TIM_Pulse = 500;
OCInit.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM1,&OCInit);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

这一部分代码配置了比较输出通道的输出模式、极性、使能(默认情况下,如果没有指定’‘OCInit.TIM_Pulse = 500’',初始化之后占空比为0,否则为500/1000),然后初始化比较输出通道1并使能预加载功能。

修改占空比
TIM_SetCompare1(TIMx,X);//修改定时器x通道1的占空比
TIM_SetCompare2(TIMx,X);//修改定时器x通道2的占空比
TIM_SetCompare3(TIMx,X);//修改定时器x通道3的占空比
TIM_SetCompare4(TIMx,X);//修改定时器x通道4的占空比
呼吸灯的实现

下为简略版,循环修改占空比实现呼吸灯效果代码

int main(void)
{
	delay_init();
	PWM_timer1_PA8_Init();
	while (1)
	{
		TIM_SetCompare1(TIM1,1000);
		delay_ms(100);
		TIM_SetCompare1(TIM1,500);
		delay_ms(100);
		TIM_SetCompare1(TIM1,200);
		delay_ms(100);
		TIM_SetCompare1(TIM1,0);
		delay_ms(100);
		TIM_SetCompare1(TIM1,200);
		delay_ms(100);
		TIM_SetCompare1(TIM1,500);
		delay_ms(100);
	}
}

感谢阅读

下附上效果展示:

stm32f103呼吸灯

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用介绍了使用STM32F103单片机定时器3来输出4路PWM波来控制舵机转动的代码原理和实现。引用提到了STM32F103系列单片机的TIM4定时器可以输出PWM信号,而引用指出在产生PWM信号时,如果输出引脚已经被使用,需要进行引脚重映射。 所以,STM32F103定时器4也可以通过配置和使用TIM4定时器来实现PWM输出功能。具体步骤可以参考STM32F103参考手册中关于TIM4的章节,了解TIM4的工作原理和寄存器的配置方法,以及如何进行引脚重映射来实现PWM输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32F103--定时器3输出4路PWM波控制舵机转动(寄存器版)](https://blog.csdn.net/qq_43705611/article/details/107375907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [STM32f103定时器4PWM四个通道输出无需移植库函数](https://download.csdn.net/download/k_ksy/12365141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [STM32F103 使用TIM3产生四路PWM](https://blog.csdn.net/hktkfly6/article/details/85250282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值