之前有写过怎么使用定时器生成PWM波,以及怎么修改频率与占空比,具体大家可以看下面这篇

stm32f4 生成PWM波_居安士的博客-CSDN博客_stm32产生pwm波

STM32每一个定时器都有4路通道,但是通常一个TIM输出的频率是固定了,使用一个定时器通常只能输出同频率不同占空比的PWM波。

但是由于IO口的选择,如果不使用同一个TIM,就需要启用高级定时器(TIM1和TIM8),最后我们尝试先用同一个TIM生成多个不同频率和占空比的PWM波,几经波折,找到了解决方法!


下面我使用的是TIM3的3通道和4通道,对应着PB0和PB1,大家对照着自己的IO口和TIM修改下面我注释的地方:

#include "sys.h"
#include "osa.h"
//OSA clk : PB0 TIM3_CH3
//OSA Reset£ºPB1 TIM3_CH4uint16_t CCR3_Val1 = 200;//修改
uint16_t CCR3_Val2 = 200;uint16_t CCR4_Val1 = 800;//修改
uint16_t CCR4_Val2 = 1600;void OSA_clk_init(void)
{NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;修改RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3); //修改
GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM3); //修改GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;     //修改             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_UP;                GPIO_Init(GPIOB,&GPIO_InitStructure);                      TIM_TimeBaseStructure.TIM_Period = 65535;TIM_TimeBaseStructure.TIM_Prescaler =1;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/* Output Compare Toggle Mode configuration: Channel2 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = CCR3_Val1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC3Init(TIM3, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);/* Output Compare Toggle Mode configuration: Channel3 */TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = CCR4_Val1;TIM_OC4Init(TIM3, &TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* TIM enable counter *//* TIM IT enable */TIM_ITConfig(TIM3,TIM_IT_CC3| TIM_IT_CC4, ENABLE);//修改/* Enable the TIM3 global Interrupt */TIM_Cmd(TIM3, ENABLE);}_Bool CH3_Flag = 0;_Bool CH4_Flag = 0;void TIM3_IRQHandler(void)
{uint16_t capture1 = 0;uint16_t capture2 = 0;/* TIM3_CH2 toggling with frequency = 732.4 Hz */if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);capture1 = TIM_GetCapture3(TIM3);if(CH3_Flag == 0){TIM_SetCompare3(TIM3, capture1 + (uint16_t)CCR3_Val2);CH3_Flag = 1;}else{TIM_SetCompare3(TIM3, capture1 + (uint16_t)CCR3_Val1);CH3_Flag = 0;}}/* TIM3_CH3 toggling with frequency = 1464.8 Hz */if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);capture2 = TIM_GetCapture4(TIM3);if(CH4_Flag == 0){TIM_SetCompare4(TIM3, capture2 + (uint16_t)CCR4_Val2);CH4_Flag = 1;}else{TIM_SetCompare4(TIM3, capture2 + (uint16_t)CCR4_Val1);CH4_Flag = 0;}}}

修改完IO口和TIM,我们只需要动下面这个地方,即修改CCR的值

最终,频率=主频/分频/(CCR1+CCR2)

占空比=CCR1/(CCR1_CCR2)

我们可以按照自己的需要,设置CCR1和CCR2的值

普通定时器主频/分频=84;高级定时器主频/分频=168

举个例子:普通定时器CCR1=CCR2=84,那么频率就是 84/(84+84)=0.5M,占空比=0.5


但是在实验的时候,我们发现,这个代码只能输出低于0.1M频率的PWM波(或许还不够完善?),如果大家需要生成高于这个频率的PWM波,只能选择使用高级定时器(TIM1和TIM8),很不幸,我的项目需要频率高于0.1M,也需要使用高级定时器。。。但是也不算白弄,分享给可以使用的朋友!

stm32f4 用一个定时器输出多个不同频率占空比PWM波(含代码)相关推荐

  1. STM32单片机一个定时器输出不同频率PWM波

      在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式.可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_C ...

  2. STM32用一个定时器输出多路不同频率及占空比的PWM(输出比较模式)

    我们使用STM32输出PWM时会使用定时器的PWM输出模式来进行生成,但是这样子生成PWM是有局限的,它只能生成四路频率相同的PWM,当你设定了TIMx_PSC(预分频寄存器)和TIMx_ARR(自动 ...

  3. 51单片机实现用一个定时器输出可调PWM

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.为什么要用一个定时器实现? 使用步骤 2.代码思路 3.如何改变输出频率和正脉宽 一.调节正脉宽 二.调节频率 使 ...

  4. c语言定时器1khz占空比,STM32高级定时器TIM1产生两路互补的PWM波(带死区)

    测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...

  5. STM32 - CubeMX 的使用实例详细(04.1)- STM32F103的 - 定时器设定详细解释 - PWM波的产生 - 频率占空比的设定 - 软件代码分析

    前言:本文详细条例STM32 103定时器的设定 1 定时器简介 中等容量的STM32F103xx增强型系列产品包含1个高级控制定时器.3个普通定时器,以及2个看门 狗定时器和1个系统嘀嗒定时器. 下 ...

  6. MSP432库函数输出多路任意占空比PWM波

    一.在电赛开始的前一天中午,突然得知2021电赛电赛推迟至8月11号至14号,现在晚上又通知变成了择期,比赛时间遥遥无期 既然如此那就再继续拼搏吧,顺便也分享一下备赛以来对msp432的学习 二.前情 ...

  7. 编写stm32输出PWM波的代码

    首先,你需要先定义 STM32 的 GPIO 引脚,然后配置 PWM 频率,最后启动 PWM 输出.具体的代码如下:GPIO_InitTypeDef GPIO_InitStructure;TIM_Ti ...

  8. 定时器输出PWM控制电机(程序)

    电机控制程序的三方面要点: 一.定时器的输出通道设置 二.电机频率的设定 三.占空比输入函数的设计 对于电机来说,转速与转向是最重要的表现.这里的程序是针对四个直流无刷电机来编写的. 控制四个电机,是 ...

  9. 通用定时器输出PWM波实现呼吸灯

    STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...

最新文章

  1. 全国首个窄带物联网实验局落户福州 助力智慧城市建设
  2. 使用 gperf 实现高效的 C/C++ 命令行处理
  3. go tcp客户端自动重连_使用 Go 语言创建 WebSocket 服务
  4. 一文看尽 JVM GC 调优
  5. 谈判失败:Oracle 杀死 Java EE
  6. C++新特性探究(十一):enum class(struct)
  7. 【Python笔记】网络爬虫——介绍
  8. 在碾压中找到自己,提升自己的思考能力
  9. SWAT-CUP径流率定过程
  10. YeeCOM DTU 轮询采集
  11. 技术管理必备之沟通机制
  12. 艺龙深耕酒店VS携程 布局旅游全产业
  13. 简谈:java种关于BigDecimal的坑
  14. 孙式无极桩站桩要领--林泰年
  15. 为什么没人再提勤劳致富了?
  16. linux管理web项目目录结构图,WEB项目管理完整.doc
  17. go环境搭建开发工具安装配置
  18. java使用poi操作world生成饼图,柱状图,折线图,组合图:二
  19. 女程序员,作程序员还是作女人?
  20. macOS根目录上无法写入文件和创建目录的问题

热门文章

  1. 小程中的data数据如何赋值获取
  2. java毕设项目开源了,springMVC+layui的医院医药管理系统
  3. Qt开发技术:QDBus介绍、编译与Demo
  4. srtruct input_event学习
  5. linux_sw_64,Zabbix使用system.sw.os获取主机信息
  6. 笑看云卷云舒,聆听花开花落
  7. Windows更新策略配置
  8. 使用浅层神经网络识别图片中的英文字母
  9. java版 设计一个程序, 输入整数l, 求边长为l的正方形面积, 比直径为l的圆形面积大多少.
  10. 教育系统APP(二)