【STM32】TIM和PWM模式配置的基础学习(CT117E电路)

目录

TIM与PWM介绍

TIM

PWM

TIM和PWM的初始化

参考文献(个人觉得有帮助的都加上去了)


TIM与PWM介绍

TIM

对于简单的PWM的输出以及捕获都主要用到向上计数功能。计数值会按照设定的频率(根据预分频器寄存器的值得到设定频率)来计数(计数值存在计数器寄存器中),当计数值(计数器寄存器中的值)达到与自动装载寄存器中的值相等时,又从零计数,周而复始。

PWM

根据配置PWM,使得一个周期内以固定占空比(duty,表示一个周期中高电平所占的比例)输出高电平与低电平。

 

     根据stm32f103rbt6.pdf的第19页可以看到TIM3的通道1和通道2对应的引脚分别为PA6,PA7,TIM2的通道2和通道3对应的引脚为PA1,PA2。我们常用到以下四个引脚来配置PWM的输出和捕获。

TIM和PWM的初始化

这里以TIM2的通道2和3(TIM2_CH2、TIM2_CH3)为例,来配置PWM的输出的初始化

void PWM_INITOutput(u16 arr,u16 pre,u16 OC2pluse,u16 OC3pluse)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_TimeBaseInitStructure.TIM_Period=arr-1;//一个计数周期的整个计数值大小,是从0开始计数所以要减去1
	TIM_TimeBaseInitStructure.TIM_Prescaler=pre-1;//分频大小,分频后最终的计数频率为:(72M/pre)Hz;
	TIM_TimeBaseInitStructure.TIM_CounterMode=0x0;//记住
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0x0;//记住
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM2模式时配置极性为LOW(PWM1模式时配置极性为High):这样配置,占空比的数值就是对应的pluse的值
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//低电平有效
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//要用时就ENABLE(打开),不用该输出时就DISABLE(关闭)
	TIM_OCInitStructure.TIM_Pulse=OC2pluse;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=OC3pluse;
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);
	
	TIM_CtrlPWMOutputs(TIM2,ENABLE);
	TIM_Cmd(TIM2,ENABLE);
}

 这个地方困扰了我很久,直到看到下面这篇博客

	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM2模式时配置极性为LOW(PWM1模式时配置极性为High):这样配置,占空比的数值就是对应的pluse的值
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//低电平有效
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//要用时就ENABLE(打开),不用该输出时就DISABLE(关闭)
	TIM_OCInitStructure.TIM_Pulse=OC2pluse;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM2模式时配置极性为LOW(PWM1模式时配置极性为High):这样配置,占空比的数值就是对应的pluse的值

 首先需要知道:TIM_OCInitStructure.TIM_Pulse=CCR1_Value;也就是说TIM_Pulse的值赋值到TIMx_CCR1。

PWM2模式是由CCMR1的OC1M和OC2M来决定的,因为我们选择的是是通道1,所以设置的是OC1M,再看相关介绍OC1M[2:0]:输出比较1模式(Output compare 1 enable)

110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低,所以这里我们设置的CC2P是1

CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  位1 
CC1通道配置为输出:0:OC1高电平有效    1:OC1低电平有效

看了上面要是对输出电平又疑惑可以看这篇博客:STM32输出PWM时,PWM1和PWM2的区别 https://blog.csdn.net/kinsno/article/details/46763243

若arr=1000,pre=72,OC1pluse=400,OC2pluse=800.

常用参数的计算公式(可以根据公式配置想要的参数值):

Duty(占空比,注意:这是根据以上配置求得的):

Duty=\frac{pluse*100}{arr}

Fre(频率):

Fre=\frac{72000000}{pre*arr}

参考文献(个人觉得有帮助的都加上去了)

[1] 定时器周期计算公式 https://blog.csdn.net/weixin_30457465/article/details/96171032

[2] 定时器TIM和PWM的输出 https://blog.csdn.net/huangyangquan/article/details/78819941

[3] STM32的TIM中的OCMode设置 http://blog.sina.com.cn/s/blog_be25f0c101017qfs.html

[4] 关于PWM输出的,图中的设置的,TIM1脉冲宽度调制模式2与其他模式有什么区别? https://bbs.csdn.net/topics/390531641 

[6] 蓝桥杯嵌入式开发经验分享(9.PWM模式配置) https://blog.csdn.net/qq_34952376/article/details/81172361

[7] STM32输出PWM时,PWM1和PWM2的区别 https://blog.csdn.net/kinsno/article/details/46763243

<think>好的,我现在需要帮用户解决如何配置PWM(脉宽调制)的问题。首先,我得回忆一下PWM的基本原理,用户可能已经了解一些,但可能需要从基础开始引导。根据用户提供的引用内容,特别是引用[2]里提到的PWM原理,我应该先解释PWM是什么,以及它的核心参数,比如频率、占空比分辨率。 接下来,用户需要具体的配置步骤。不同的硬件平台配置方法可能不同,比如Arduino、STM32或者单片机,如蓝桥杯的CT107D。引用[3]提到了蓝桥杯单片机上的PWM应用,可能需要分开说明不同平台的配置方法。比如在Arduino中使用analogWrite函数,而在STM32中可能需要配置定时器寄存器。 然后,用户可能关心参数设置,比如如何选择频率占空比,以及如何计算分辨率。引用[1]里提到的分辨率公式((VPWMn-VPWMn-1)/Vp-p)可能需要在这里解释,说明分辨率与PWM位数的关系,比如8位、10位对应的不同分辨率值。 此外,用户可能需要实际应用的例子,比如控制LED亮度或电机速度,这样他们能更好地理解配置后的效果。比如在Arduino中生成呼吸灯效果,或者用PWM实现DAC转换,如引用[1][2]所提到的。 最后,应该提醒用户注意硬件兼容性,比如引脚是否支持PWM,以及负载特性对频率选择的影响。可能还需要提到常见的调试问题,比如信号不稳定或占空比不准确,以及如何解决这些问题。 总结一下,回答的结构应该是:PWM原理简介,配置步骤(分平台),参数设置方法,应用示例,注意事项常见问题。这样用户能一步步按照指导进行配置,同时理解背后的原理,避免常见错误。</think>### PWM配置步骤及参数设置详解 PWM(脉宽调制)通过调节脉冲宽度模拟连续信号,广泛应用于电机控制、LED调光、音频合成等领域[^2]。以下是配置PWM的详细步骤及参数设置方法: --- #### **一、核心参数定义** 1. **频率(Frequency)** PWM周期时长的倒数,单位Hz。公式: $$f_{\text{PWM}} = \frac{1}{T_{\text{周期}}}$$ 电机控制常用1-20kHz,LED调光常用100Hz-1kHz。 2. **占空比(Duty Cycle)** 高电平时间占周期的百分比,公式: $$\text{占空比} = \frac{T_{\text{高电平}}}{T_{\text{周期}}} \times 100\%$$ 占空比直接决定输出等效电压(如5V PWM占空比50%等效2.5V)[^1]。 3. **分辨率(Resolution)** 占空比的最小调节步长,由计数器位数决定。公式: $$\text{分辨率} = \frac{1}{2^N} \times 100\%$$ 例如8位PWM分辨率为$1/256 \approx 0.39\%$。 --- #### **二、硬件平台配置示例** ##### **1. Arduino平台** ```cpp int pwmPin = 9; // 支持PWM的引脚(3,5,6,9,10,11) void setup() { pinMode(pwmPin, OUTPUT); analogWrite(pwmPin, 128); // 占空比50%(8位分辨率) } ``` - **频率调整**:默认490Hz(引脚5/6为980Hz),需修改定时器寄存器: ```cpp TCCR0B = TCCR0B & 0b11111000 | 0x01; // 引脚5/6频率降至31.25Hz ``` ##### **2. STM32(HAL库)** ```c // 配置TIM2通道1为PWM TIM_HandleTypeDef htim; htim.Instance = TIM2; htim.Init.Prescaler = 84-1; // 84MHz/84=1MHz htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 1000-1; // 1MHz/1000=1kHz频率 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, 500); // 占空比50% ``` ##### **3. 蓝桥杯CT107D单片机** ```c // 使用PCA模块生成PWM CCON = 0x00; CL = 0x00; CH = 0x00; CMOD = 0x08; // 时钟源为SysClk/4 CCAPM0 = 0x42; // 使能PWM0 CCAP0L = 0x80; // 初始占空比50% CCAP0H = 0x80; CR = 1; // 启动PCA计数器[^3] ``` --- #### **三、参数优化技巧** 1. **频率选择** - 电机控制需避开机械共振频率(通常>20kHz) - LED调光需高于人眼闪烁阈值(>200Hz) - 音频合成需覆盖目标频段(如20Hz-20kHz) 2. **分辨率与噪声平衡** - 高分辨率(16位)适合精密DAC转换[^1] - 低分辨率(8位)可降低计算负载 3. **死区时间(电机驱动)** 全桥电路中需插入1-5μs死区,防止上下管直通: $$T_{\text{死区}} = \frac{\text{驱动延迟} \times 2}{\text{时钟周期}}$$ --- #### **四、调试验证方法** 1. **示波器检测** 直接观测波形频率/占空比是否符合预期。 2. **等效电压测试** 万用表测量PWM滤波后电压,验证: $$V_{\text{等效}} = V_{\text{高电平}} \times \text{占空比}$$[^1] 3. **动态响应测试** 阶梯变化占空比,观察执行器(如电机)响应平滑度。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值