stm32 PWM设计

导论

再上一章我们介绍了定时器的定时模式,实现了定时器的基本用法,在本章将介绍定时器作为PWM输出的方法

什么是PWM

PWM的全称为:Pulse Width Modulation,简称脉宽调制
百度来的:脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
而简单的来说就是,我们可以使用处理器输出自己想要的占空比的矩形波,去达到控制模拟电路等目的

资源介绍

在STM32F407的芯片手册中有描述:12个16位的定时器,2个32位的定时器,每个定时器可以由4个通道去产生PWM

简单原理介绍

在上一章中我们说到定时器的计数模式有多种,而常用的时向上计数,当达到计数值时产生中断来处理相应的事件
在这里插入图片描述而PWM的输出就是在此基础上添加了一个比较值当计数值大于比较值,或者小于比较值时将输出低电平(或者高电平,这是根据我们配置的PWM 输出有关)

通用定时器框图

在这里插入图片描述我上面说的“比较值”就是TIM框图中比较部分的“Capture/Comparex register”比较寄存器,这个值就会决定输出引脚的电平。
从框图上可以看到,STM32通用定时器,用不同颜色的笔给划分了区域,分成了4个部分

时钟源
基本定时器
输入捕获
输出比较

分成了以上这四个部分:
1.时钟源
计数器时钟可由下列时钟源提供:
● 内部时钟 (CK_INT)
● 外部时钟模式 1:外部输入引脚 (TIx)
● 外部时钟模式 2:外部触发输入 (ETR),仅适用于 TIM2、TIM3 和 TIM4。
● 内部触发输入 (ITRx):使用一个定时器作为另一个定时器的预分频器,例如可以将定时器配置为定时器 2 的预分频器。(定时器的级联)
时钟源框图:
在这里插入图片描述内部时钟框图(CK_INT)在这里插入图片描述如何选择内部时钟作为时钟源?
将TIMx_SMCR 寄存器中 SMS=000,ECE=0,当对 CEN 位写入 1 时,预分频器的时钟就由内部时钟 CK_INT 提供。内部时钟的频率为该定时器所在时钟线频率x2。
**一般常用内部时钟作为时钟源
在这里插入图片描述在这里插入图片描述
在这里插入图片描述外部时钟源模式1框图
在这里插入图片描述
如何选择外部时钟模式1作为时钟源?
当 TIMx_SMCR 寄存器中的 SMS=111 ,ECE=0时,可选择此模式。
选择作为时钟源后,可以通过配置SMCR的TS位来进一步选择时钟来源。
内部触发(其他定时器与之级联,这种级联方式的组合是ST规定的)
在这里插入图片描述
外部时钟源模式2框图
在这里插入图片描述如何选择外部时钟模式2作为时钟源?
TIMx_SMCR 寄存器中的ECE位写入 1 可选择此模式。
选择之后,可以使用外部输入的脉冲信号作为定时器的时钟源,通过操作TIMx->SMCR的ETP、ETPS、ETF功能位,可以选择输入信号的极性、分频系数、滤波系数。

** 通用定时器的输出比较(PWM的输出)**
每个通用定时器至少有1个通道,每个通道对应一个IO引脚(若需要使用定时器的输入/输出功能,需要将该引脚复用成定时器通道)。每个通道可以用于输入 或 输出功能。
输出比较:根据计数器和比较寄存器值的大小关系,决定在对应的通道(引脚)上输出特定的电平。

输出比较的框图
在这里插入图片描述在这里插入图片描述
在这里插入图片描述对于输出比较的配置从这张框图上就能看出,首先
把通道配置成输出通道。 TIMx->CCMR1 中的 CC1S[0:1] 填00在这里插入图片描述
关闭CCR1的缓冲功能 ,也就是关闭影子功能。OCIE 清零在这里插入图片描述
设置输出比较模式为PWM1还是PWM2,TIMx->CCRM1的OC1M[0:2]位在这里插入图片描述
设置有效电平 是高电平有效还是低电平有效,手册上说的有点绕,这里我的理解,PWM1,有效电平为高电平。PWM2,有效电平为低电平。TIMx->CCER的CC1P位。 在这里插入图片描述
别忘了使能通道和给设置比较值。在这里插入图片描述在这里插入图片描述

PWM关键参数

先说PWM的关键指标:周期,以及占空比

1.PWM周期:就是通过配置定时器的溢出时间(即图中ARR的值),当计数器(CNT寄存器)计数的值与ARR的值相等时,计数归零,重新计数

2.PWM占空比:设置CRRx的值,作为比较值,CNT计数值与CRR做对比,因此衍生出PWM的模式,

如:在PWM模式1,当计数器CNT<CRR,输出通道设置的输出电平为有效电平,否则为无效电平

PWM 配置流程

四.PWM的配置流程如下

1.使能GPIO时钟,配置一个GPIO结构体变量(该GPIO上可以复用为定时器的输出),并进行初始化

2.将GPIO的引脚复用为TIM的输出

3.使能定时器时钟,配置一个TIM结构体变量,主要关注设置Arr的值,并进行初始化

4.配置TIM_OCInitTypeDef结构体,用于输出比较的结构体,

代码配置

此代码更具调节PWM的占空比来控制输出高电平的时间来达到呼吸灯的效果

#include"stm32f4xx.h"
#include"sys.h"
static GPIO_InitTypeDef GPIO_InitStructure;
static TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

static TIM_OCInitTypeDef   TIM_OCInitStructure;

void delay_ms(uint32_t n)
{
	while(n--)
	{
		SysTick->CTRL=0;
		SysTick->LOAD=(168000)-1;
		SysTick->VAL=0;
		SysTick->CTRL=5;
		while((SysTick->CTRL&0x10000)==0);
	
	}
	SysTick->CTRL=0;
}

void Time14_Init(void)
{
	//是能硬件时钟
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
//配置定时器数值,,分屏,,计数值//频率为100HZ
	TIM_TimeBaseStructure.TIM_Period = (10000/200)-1;// 计数值0~9999 计数10000次为一秒  决定定时时间  PLL_M==8才行
    TIM_TimeBaseStructure.TIM_Prescaler =8400-1;//预分频值    自加1   84MHZ频率  进行8400预分频  分频后为10000HZ
    //TIM_TimeBaseStructure.TIM_ClockDivision = 0;//f407不支持
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式///向上技术
	
	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
	
	//配置定时器终端触法方式    //时间更新
	
	//
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置PWM通道
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure. TIM_Pulse=100;//比较直    
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low  ;//电频有效方式
	//计数值小于比较值输出有效电频    模式1
	//计数值小于比较值输出无效电频    模式二
	TIM_OC1Init(TIM14,&TIM_OCInitStructure);
	
	
	//使能定时器工作
	TIM_Cmd(TIM14, ENABLE);
}


int main(void)
{
	uint32_t TIM_Pwm;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF ;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	//PF9应交连接到定时器14
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//将PF9连接到TIM4的PWM输出端
	Time14_Init();
	while(1){
	
		for(TIM_Pwm=0;TIM_Pwm<=100;TIM_Pwm++)
		{
			TIM_SetCompare1(TIM14,TIM_Pwm);
			delay_ms(10);
		}
		for(TIM_Pwm=100;(int)TIM_Pwm>=0;TIM_Pwm--)
		{
			
			TIM_SetCompare1(TIM14,TIM_Pwm);
			delay_ms(10);
		}
		
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32的通用定时器具备生成PWM波的功能,并且可以将PWM输出到定时器的通道引脚。在配置STM32PWM时,需要进行基础配置和定时器相关配置。基础配置包括设置定时器的时钟源、预分频因子、计数周期等参数,而定时器相关配置则包括设置PWM的占空比、周期以及极性等参数。 具体来说,配置STM32PWM可以通过CubeMX来完成。首先,选择对应的STM32型号,比如STM32G070CBT6。然后,根据需求选择定时器(如TIM3)作为PWM源,并进行相应的配置,包括选择输出引脚、设置频率、占空比、极性等。在完成配置后,生成代码并将其导入到开发环境中,即可开始使用配置好的PWM功能。 总结来说,配置STM32PWM需要进行基础配置和定时器相关配置,可以通过CubeMX等工具来简化配置过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [一文搞懂STM32 PWM配置](https://blog.csdn.net/chanchairen/article/details/131184538)[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: 50%"] - *3* [2023年电赛E题代码-stm32部分源码、jetson nano上的OpenCV源码及电路板PCB原理图设计](https://download.csdn.net/download/qq_32971095/88226738)[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: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值