STM32的TIM1互补PWM输出

发布者:Blissful5最新更新时间:2019-08-21 来源: eefocus关键字:STM32  TIM1  互补PWM输出 手机看文章 扫描二维码
随时随地手机看文章

芯片为STM32F412VETx,使用的是高级定时器TIM1的PWM互补PWM输出,看一下STM32CubeMX配置,

再看时钟的配置,TIM1用的是APB2的时钟,。


再看引脚的配置

产生的PWM频率为:Fpwm = 96MHz / ((95+1)(9999+1)) =100Hz,占空比为50%


然后生成代码,看下代码中的FMX_TIM1_Init函数初始化


/* TIM1 init function */

static void FMX_TIM1_Init(void)

{

 

  TIM_ClockConfigTypeDef sClockSourceConfig;

  TIM_MasterConfigTypeDef sMasterConfig;

  TIM_OC_InitTypeDef sConfigOC;

  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

 

  htim1.Instance = TIM1;

  htim1.Init.Prescaler = 95;

  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim1.Init.Period = 9999;

  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim1.Init.RepetitionCounter = 0;

  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)  //使能TIM1时钟

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  sConfigOC.OCMode = TIM_OCMODE_PWM1;

  sConfigOC.Pulse = 5000;

  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;

  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;

  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;

  sBreakDeadTimeConfig.DeadTime = 0;

  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;

  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;

  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  HAL_TIM_MspPostInit(&htim1);  //引脚配置

 

}

好了到此TIM1的PWM互补已经配置完成,接下来就是要是要使能PWM输出了,接下在再main函数中使能输出就OK了。


    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);    //starts PWM on CH1 pin

    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); //starts PWM on CH1N pin

最好用示波器看下效果图

关键字:STM32  TIM1  互补PWM输出 引用地址:STM32的TIM1互补PWM输出

上一篇:STM32高级定时器TIM1、TIM15输出PWM
下一篇:STM32F103ZET定时器TIM1输出六路带死区互补PWM波形

推荐阅读最新更新时间:2024-11-07 18:36

STM32 Usart 上电发送一个无效字符的问题
无论这么设置USart,上电后都会发送一个无效字符,这个是STATUS寄存器的上电初始值有问题造成的,Usart的发送数据寄存器有一个缓冲移位寄存器。并且发送有两个状态,一个是发送数据寄存器为空,一个是移位寄存器发送完成。上电后Usart的状态寄存器的发送完成位为0,造成了上电以后会始终会有一个值被发送,这个值就是发送移位寄存器中的值,而这个值有时候是0X00有时候是0XFE 。 要解决这个问题,在初始化的时候先初始化Usart,然后再配置Usart的GPIO位,就可以避免Usart上电发送一个无效字符的问题。 还有一种可能性,在上电后至端口初始化,STM32的I/O端口处于高阻状态,有些RS232转换芯片在输入端为高阻时
[单片机]
“游览”意法半导体展位,学习创新服务汽车、工业
慕尼黑电子展是一场大型电子集会,几乎包含了电子领域内的所有相关产品和技术,分布在不同的展区,每个展区都人声鼎沸。但要说最热闹的,人数最多的还是半导体展区,在这个展区内聚集了全球芯片TOP 10的厂商,每家厂商的展位都是门庭若市,工作人员向每位感兴趣的参展者展示、讲解自家的产品。在意法半导体( ST Microelectronics,以下简称 ST )的展位,我们记者团也充当了一回游客,由 ST 相关负责人便带领我们开始了ST展位“一日游”,介绍了ST近几年在 汽车电子 和 工业 两个领域的努力。 意法半导体展位 由 汽车电子 和分立器件组成的ADG(Automotive & Discrete Group)是ST业务的重
[汽车电子]
STM32大小端序与堆栈及其增长方向分析
  在开源电子中看到一篇文章讲的是栈增长和大端/小端问题。学C语言的时候,我们知道堆栈的区别:   (1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。   (2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。   (3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。   (4)文字常量区:常量字符串就是存放在这里的。   (5)程序代码区:存放函数
[单片机]
<font color='red'>STM32</font>大小端序与堆栈及其增长方向分析
在MDK调试STM32出现“could not stop cortex-m device”解决办法
错误如http://www.amobbs.com/forum.php?mod=viewthread&tid=4075329 错误图片如下: 我的解决办法: 发现RESET一直在1V附近,将RESET处的下拉电容换掉后第一个错误没有,但是跳出下面的错误:No Cortex-M Device found in JTAG chain。 解决办法:发现JTAG线没插上,插上就好了。 http://no001.blog.51cto.com/1142339/857117 网上的解决办法: 1 我遇到这个问题的原因是Boot1没接地,所以可以考虑下是否是硬件的原因 2 如果MCU出于reset状态,也会出现这种情
[单片机]
在MDK调试<font color='red'>STM32</font>出现“could not stop cortex-m device”解决办法
STM32_在线调试查看硬件程序运行时间的两种方法
方法一: 为了保证在MDK中读取正确的程序运行时间,必须对仿真器的跟踪项进行设置。 以ULink2为例(如果使用的是J-LINK下载器或者ST-link下载器 原理一样,可做类比): (1)在工程的“ Option for Target ..”目标选项界面中,选择标签“Debug”,进行调试设置界面,选择使用“Cortex-M3-ULIK2”作为仿真器,然后点击右侧的“Settings”按键,进入ULINK设置界面。 (2)点击标签“Trace”进入跟踪设置界面,将“Core Clock:”右侧的编辑区输入你的CPU的频率,例如你的实际CPU运行频率为72MHz,那么你就必须输入72Mhz。 (3)“Core C
[单片机]
STM32_在线调试查看硬件程序运行时间的两种方法
STM32学习——MPU6050姿态传感器
STM32移植(抄)起来特别爽。。。 MPU6050简介 1.MPU6050是一款六轴(三轴加速度+三轴角速度(陀螺仪))传感器 2.MPU6050含有一个第二IIC接口,可用于连接外部磁力传感器 3.MPU6050自带数字运动处理器(DMP)通过主IIC接口,可以向CPU提供四元数,CPU可利用四元数得到欧拉角,避免了CPU通过原始数据进行姿态计算(DMP驱动库由官方提供,使用时需要改动) 4.据说stm32的硬件IIC接口存在bug,需要用软件模拟IIC时序 MPU6050初始化步骤 (1)初始化IIC接口 即SDA和SCL对应的GPIO (2)复位MPU6050 使MPU6050内部所有的寄存器恢复默认值,通过对电
[单片机]
<font color='red'>STM32</font>学习——MPU6050姿态传感器
STM32CubeMX系列教程
STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(RTOS, USB, FatFs, TCP/IP, Graphics, 等等). 直观的STM32微控制器的选择和时钟树配置 微控制器图形化配置外围设备和中间件的功能模式和初始化参数 C代码生成项目覆盖STM32微控制器的初始化符合IAR™,Keil的™和GCC编译器。 对于新的产品设计,我们强烈推荐使用STM32Cube来加速你的开发过程,并为以后的产品平台移植打下良好的基础。 1.新建工程 打开STM32cubeMX软件,点
[单片机]
STM32CubeMX系列教程
STM32 PWM问题
本文不提供完整程序,仅点出要点 1:时钟配置。因为PWM输出属于复用功能,所以时钟使能必须使能RCC_APB2Periph_AFIO ; 2:IO口使能。因为PWM属于复用功能,所以IO输出设置要配置成GPIO_Mode_AF_PP;而不能配置成普通输出IO的GPIO_Mode_OUT_PP模式; 3:PWM初始化代码如下,本程序只用通道3输出,所以pwm输出只配置了通道3,TIM_OC3Init(TIM3, &TIM_OCInitStructure);需要多通道输出PWM则需要配置多个PWM输出通道,通过改变TIM_Pulse 的值可以改变pwm的占空比(可以通过直接操作寄存器TIM3- CCR3=2400来实现)。 /* Ti
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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