详解stm32的定时器8输出PWM

发布者:Qianfeng最新更新时间:2024-04-01 来源: elecfans关键字:stm32  定时器  输出PWM 手机看文章 扫描二维码
随时随地手机看文章

我在定时器3的例程上面改,改了很久都没改好,百度看别人说定时器1和定时器8需要额外的指令用于PWM输出,今天下午硬件的人来要东西了,来不及研究了,于是网上找了个定时器8的4个通道全部可以输出的例程记录一下,已经经过本人试验是OK的。


1.调用:



TIM8_PWM_Init(1439 ,0);    //不分频。PWM频率=72000000/1440=50Khz

2.函数源码:


//TIM8 PWM部分初始化 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM8_PWM_Init(u16 arr,u16 psc)

{  

  GPIO_InitTypeDef GPIO_InitStructure;

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;



  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //使能定时器3时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM_CH2

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO

  

  //初始化TIM8

  TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

  TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值

  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位



  //初始化TIM8 Channel2 PWM模式  

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出极性:TIM输出比较极性高

  TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8 OC2



  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR2上的预装载寄存器



  TIM_SetCompare1(TIM8,474);



  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出极性:TIM输出比较极性高

  TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8 OC2



  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR2上的预装载寄存器



  TIM_SetCompare2(TIM8,700);



  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出极性:TIM输出比较极性高

  TIM_OC3Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8 OC2



  TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR2上的预装载寄存器



  TIM_SetCompare3(TIM8,900);



  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出极性:TIM输出比较极性高

  TIM_OC4Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8 OC2



  TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR2上的预装载寄存器



  TIM_SetCompare4(TIM8,1200);



  TIM_Cmd(TIM8, ENABLE);  //不使能TIM8



  TIM_CtrlPWMOutputs(TIM8,ENABLE);   

}


关键字:stm32  定时器  输出PWM 引用地址:详解stm32的定时器8输出PWM

上一篇:STM32嵌入式开发中的RTOS应用分析
下一篇:STM32实现:步进电机的速度控制

推荐阅读最新更新时间:2026-03-23 10:57

利用STM32高精度定时器实现PWM输出的实现原理
很多STM32系列的MCU内置高精度定时器,比方STM32F334、STM32G4、STM32H7等系列。利用高精度定时器实现PWM输出应该说是最基本的功能了。不过,在实际应用中,常有人觉得无法实现duty=0或duty=100%的PWM输出情形。这里以STM32F334的HRTIM为例,简单介绍下利用它实现PWM输出的实现原理。 STM32F334的HRTIM的功能框图如下,由一个MASTER定时器和ABCDE五个定时器单元组成。其中ABCDE五个定时器单元各可以产生2路输出信号,并支持互补输出。 先看看跟HRTIM有关的时钟。别的系列有支持向上、向下计数模式的。 在利用HRTIM中的定时器单元实现PWM输出时,基于不同
[单片机]
利用<font color='red'>STM32</font>高精度<font color='red'>定时器</font>实现<font color='red'>PWM</font><font color='red'>输出</font>的实现原理
STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
1.实验目的 使用高级定时器,输出两路互补的PWM输出,需要有带死区和不带死区两种情况 2.实验效果 图1:不带死区的两路互补的PWM输出 图2 :带死区的两路互补的PWM输出 3.理论部分 3.1时钟源 内部时钟(基本定时器,通用定时器时钟源来自PCLK1,但高级定时器的时钟源来自PCLK2(72M)) 实践中几乎无需使用:外部时钟模式1、外部时钟模式2 3.2时基单元 组成: 16bit预分频PSC 16bit计数器CNT 8bit重复计数器RCR(高级定时器独有) 16bit自动重装载寄存器ARR 3.3输入捕获 作用:对输入信号的上升沿/下降沿/双边沿进行捕获,测量输入信号的脉宽,和
[单片机]
<font color='red'>STM32</font>学习笔记(4) 高级<font color='red'>定时器</font>-两路互补的<font color='red'>PWM</font><font color='red'>输出</font>(带死区和刹车控制)
如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
MCU:STM32F334C8T6 PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。 高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。 STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2 工作原理: PWM mode 1 - In upcounting, channel 1 is active as lon
[单片机]
如何利用<font color='red'>STM32</font>通用<font color='red'>定时器</font>实现<font color='red'>输出</font>两路占空比和频率可调的互补<font color='red'>PWM</font>
STM32 高级定时器 输出PWM (用DHT11测得的温度去调节RGB灯的亮度)
开发平台 野火STM32F429开发板 使用标准库开发 高级定时器 高级定时器其实就是基本定时器加上输入捕获、输出比较和断路死区,所以有四个初始化函数: 定时器时基初始化函数 TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); 输出比较初始化函数 TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); 输入捕获初始化函数 TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICI
[单片机]
STM32单片机一个定时器输出不同频率PWM
  在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式。可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_CCRx)来设置占空比。一个定时器只有一个自动重装载寄存器(TIMx_ARR),但是有4个通道的捕获/ 比较寄存器 1(TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、TIMx_CCR4)。所以使用一个定时器输出PWM波形的时候,频率是统一调整的,4个通道的频率是相同的,但是占空比每个通道可以独立设置。比较寄存器TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、TIMx_CCR4分别设置4个通道的占空比。   
[单片机]
<font color='red'>STM32</font>单片机一个<font color='red'>定时器</font><font color='red'>输出</font>不同频率<font color='red'>PWM</font>波
STM32学习笔记(5):通用定时器PWM输出
1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和
[单片机]
stm32定时器实现PWM输出控制无源蜂鸣器(HAL)
(一)PWM概念和原理 脉冲宽度调制(PWM),是英文“Pulse Width Modulation 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。 PWM原理示意图 上图是简单的PWM原理示意图。图中,我们假定定时器工作在向上计数PWM模式,且当CNT (二)代码示例 环境:STM32F103C8 主频64MHz TIM3 (1)GPIO初始化 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_S
[单片机]
<font color='red'>stm32</font><font color='red'>定时器</font>实现<font color='red'>PWM</font><font color='red'>输出</font>控制无源蜂鸣器(HAL)
STM32 定时器输出PWM的模式
数据手册上TIMx_CCMR1寄存器的6:4位决定了定时器输出PWM的几种模式: 000:冻结。输出比较寄存器TIMx_CCR1与计数器TIMx_CNT间的比较对OC1REF不起作用。即当计数器值与比较值相等时管脚上电平信号保持上一次的信号。 Eg:定时器设置: TIM_TimeBaseStructure.TIM_Period = 1000; // 设置自动重载周期值 TIM_TimeBaseStructure.TIM_Prescaler = 47; // 设置预分频值48分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 设置时钟分割:TDTS = Tck_tim
[单片机]
<font color='red'>STM32</font> <font color='red'>定时器</font><font color='red'>输出</font><font color='red'>PWM</font>的模式
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved