STM32F103ZET6 PWM输出

STM32 定时器3输出通道引脚
在这里插入图片描述

【 1. PWM工作过程 】

在这里插入图片描述
在这里插入图片描述
PWM周期由ARR决定,CCRx决定占空比

【 2. 内部逻辑 】

在这里插入图片描述
CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。
CCMR1: OC1M[2:0]位:
对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】
CCER:CC1P位:输入/捕获1输出极性。0:高电平为有效电平,1:低电平为有效电平。
CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

【 3. PWM模式 】

在这里插入图片描述

PWM模式1 & PWM模式2

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:
在这里插入图片描述
在这里插入图片描述

【 4. 自动重载的预装载寄存器 】

在这里插入图片描述
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
当预重装载值改变后,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

【 5. 相关函数 】

①PWM初始化
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
②设置比较值函数
void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
③使能输出比较预装载
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
④使能自动重装载的预装载寄存器允许位
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

【 6. 配置过程 】

① 使能定时器3和相关IO口时钟。
使能定时器3时钟:RCC_APB1PeriphClockCmd();
使能GPIOB时钟:RCC_APB2PeriphClockCmd();
② 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
⑤ 初始化输出比较参数:TIM_OC2Init();
⑥ 使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
⑦ 使能定时器。TIM_Cmd();
⑧ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

【 7. 范例 】

呈现呼吸灯的效果
PWM.h

void MYPWM_Init(u16 arr,u16 psc)
{
	GPIO_InitTypeDef MYPWMstructure;
	TIM_TimeBaseInitTypeDef MYTIM_PWMstructure;
	TIM_OCInitTypeDef MYOCPWMstructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   //使能定时器3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   //使能GPIOB时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能AFIO时钟
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //开启重映射
	
	MYPWMstructure.GPIO_Mode=GPIO_Mode_AF_PP; //推挽复用输出
	MYPWMstructure.GPIO_Pin=GPIO_Pin_5;   //选择引脚
	MYPWMstructure.GPIO_Speed=GPIO_Speed_50MHz; //速度
	GPIO_Init(GPIOB,&MYPWMstructure);      //初始化GPIO
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能AFIO时钟
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //开启重映射
	
	
	MYTIM_PWMstructure.TIM_ClockDivision=0;//设置时钟分割:TDTS = Tck_tim
	MYTIM_PWMstructure.TIM_CounterMode=TIM_CounterMode_Up;//配置向上计数模式
	MYTIM_PWMstructure.TIM_Period=arr; //自动装载值
	MYTIM_PWMstructure.TIM_Prescaler=psc;//预分频系数
	TIM_TimeBaseInit(TIM3,&MYTIM_PWMstructure);    //初始化定时器
	
	MYOCPWMstructure.TIM_OCMode=TIM_OCMode_PWM2; //配置PWM模式2
	MYOCPWMstructure.TIM_OCPolarity=TIM_OCPolarity_High; //有效电平为高电平
	MYOCPWMstructure.TIM_OutputState=TIM_OutputState_Enable; //使能
	TIM_OC2Init(TIM3,&MYOCPWMstructure);  //初始化输出比较参数
	
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能预装载寄存器
    TIM_Cmd(TIM3,ENABLE); //使能定时器
	
}

main.c

int main(void)
 {	
	u16 mycomp=0;  //比较值
	u8 flag=1;   //标志位。flag=1比较值自加,flag=0比较值自减
	delay_init();
	LED_Init();		  	//初始化与LED连接的硬件接口
	MYPWM_Init(899,0); //配置装载值799,不分频,则PWM频率=72K/(899+1)=80
	 while(1)
	{
		delay_ms(10);	 
		if(flag)  mycomp++;    //mycomp从0开始加到301,再减到0,再开始加到301,不断循环
		else      mycomp--;
		
		if(mycomp>300) flag=0;  //限幅
		if(mycomp==0) flag=1;
		TIM_SetCompare2(TIM3,mycomp);  //比较值不断改变导致占空比变化
 }
}
 
### STM32F103ZET6 PWM 输出配置示例教程 STM32F103ZET6 是一款基于 ARM Cortex-M3 内核的高性能微控制器,支持多种外设功能,其中包括定时器模块用于生成脉宽调制 (PWM) 信号。以下是关于如何在 STM32F103ZET6 上配置并输出 PWM 的详细说明。 #### 定时器与 GPIO 配置基础 为了实现 PWM 功能,通常会使用通用定时器(如 TIM2、TIM3 等),并将相应的 GPIO 引脚设置为复用模式以连接到指定的定时器通道[^2]。具体来说: - **GPIO 初始化**: 将需要使用的 IO 口分配给对应的定时器通道。 - **定时器初始化**: 设置预分频器 (PSC) 和自动重装载寄存器 (ARR),从而定义 PWM 周期。 - **捕获/比较单元配置**: 使用 CCR 寄存器来设定占空比。 #### HAL 库下的 PWM 配置流程 利用 STM32CubeMX 工具自动生成项目框架后,在代码层面完成进一步定制化操作如下所示: ```c // 启动定时器输出比较中断(可选) __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC1); // 设定初始占空比 uint32_t dutyCycle = 75; // 占空比百分比值 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, ((dutyCycle * htim2.Init.Period)/100)); // 开启对应通道的输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); ``` 上述片段展示了如何动态调整某个特定通道上的 PWM 波形参数以及启动它的工作状态。 #### 实际案例分析 - 四路独立PWM输出 当需求涉及多路同步或者异步变化规律控制时,则需注意不同通道间相互影响关系及其硬件资源占用情况。例如对于 STM32F103ZET6 而言,其高级控制定时器(TIM1 & TIM8)能够提供互补型双极性驱动能力;而普通计数器则更适合处理简单周期性的单向调节任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值