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);  //比较值不断改变导致占空比变化
 }
}
 
  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用STM32F103ZET6PWM输出方波,需要按照以下步骤进行操作: 1. 配置GPIO引脚为PWM输出模式。 2. 配置TIM(定时器)为PWM模式。 3. 设置TIM的计数周期和占空比,以生成所需的方波。 下面是一个简单的示例代码,可以输出100Hz的50%占空比方波: ```c #include "stm32f10x.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // Enable clock for GPIOA and TIM1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE); // Configure PA8 as alternate function (TIM1_CH1) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Configure TIM1 as PWM mode 1 TIM_TimeBaseStructure.TIM_Period = 7199; // 72MHz / 7200 = 10kHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 3600; // 50% duty cycle TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_Cmd(TIM1, ENABLE); while (1) { // Do nothing } } ``` 在这个示例代码中,我们使用PA8作为PWM输出引脚,TIM1作为定时器,以10kHz的频率输出50%的占空比方波。你可以根据需要调整计数周期和占空比来生成不同频率和占空比的方波。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MR_Promethus

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

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

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

打赏作者

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

抵扣说明:

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

余额充值