STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解

这篇具有很好参考价值的文章主要介绍了STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


过来人的经验分享:
TIM定时器在我们学习STM32的过程中是一个重要且稍微有点难度的外设了,就拿从学校里做的项目来说用到的也是一些基本的外设配置和传感器等等。TIM作为外设中稍微有点难度的外设相当关键,学好TIM,对以后学习单片机开发也有很大帮助。

TIM 定时器

定时器是stm32单片机中的一个外设,可以用作测量输入信号的脉冲长度或者产生输出波形,(输出比较和PWM)。就拿常用的STM32来说 ,我使用的F103VET6板子有8个定时器,分别是2个高级定时器TIM1TIM8,4个通用定时器TIM2~5,2个基本定时器TIM6,7

根据不同型号的单片机,挂载的定时器个数不同,比如C8T6只有TIM1~4,更高级的控制器有更多的定时器。

每当我们学习新的外设时,首先要知道他的时钟频率是多少,挂载在哪条总线上?有什么功能,主要用来干啥?其次就是他的寄存器了。

定时器的时钟频率

查看芯片手册可以知道这部分内容。
下图是VET6的总线架构图:
STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解,STM32,嵌入式软件开发,keil5,stm32,单片机,嵌入式硬件
得出:

1.高级定时器TIM1,8挂载在APB2总线上频率为72MHZ
2.通用和基本定时器挂载在APB1上,时钟频率为36MHZ
时钟频率也是定时器在使用过程中最重要的参数。

我们就拿通用定时器来讲解,因为高级定时器不过就是在通用定时器基础上多了几个功能而已,基本定时器少了几个功能,只能提供时间基准。

通用定时器

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成可以用于输入捕获和输出比较,PWM波输出等。

通用定时器主要功能

测量输入信号的脉冲长度-------输入捕获
产生输出波形 PWM-----输出比较
注意:每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。

全部功能:

  1. 16位向上、向下、向上/向下自动装载计数器
  2. 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值
  3. 每个通用定时器都有四个通道,互不干涉每个通道都可以有多种模式
    ─ 输入捕获
    ─ 输出比较
    ─ PWM生成(边缘或中间对齐模式)
    ─ 单脉冲模式输出
  4. 通用定时器还支持针对定位的增量(正交)编码器和霍尔传感器电路
    编码器功能主要是用来对带编码器的电机的信号处理,做PID调速可用到。

通用定时器框图

STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解,STM32,嵌入式软件开发,keil5,stm32,单片机,嵌入式硬件

通用TIM 功能描述

可编程通用定时器的主要部分是一个16位计数器和与其相关的自动冲装载寄存器。这个寄存器可以向上计数,向下,向上向下双向计数。计数器时钟由预分频器得到
计数器、自动充装载寄存器和预分频寄存器可以由软件读写,在计数器运行时仍可读写。
定时器的核心:时基单元,在配置完时基单元后,如果想用定时器输出模式,额外再配置一输出结构体即可,输入模式同理。
时基单元包含
● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)

预分频器描述
预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲区,可以在工作时被改变。新的预分频值在下一次更新事件到来时被采用。

计数器模式
计数器在上面说到三种工作模式 ,向上,向下,中心对齐,然后我们讲一下向上计数,其他都一样哈。
向上计数模式
在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始
计数并且产生一个计数器溢出事件。
每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中(通过软件方式或者使用从模式控制器)设置UG位也同样可以产生一个更新事件。
● 预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。
● 自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)
中央对齐模式(向上/向下计数)
在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器
溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。

捕获、比较通道

每一个捕获、比较通道都是围绕一个捕获、比较寄存器,包括捕获的输入部分和输出部分。
输入部分对相应的TIx输入信号采样,并产生一个滤波后的信号TIxF。然后,一个带极性选择的
边缘检测器产生一个信号(TIxFPx),它可以作为从模式控制器的输入触发或者作为捕获控制。该
信号通过预分频进入捕获寄存器(ICxPS)。

STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解,STM32,嵌入式软件开发,keil5,stm32,单片机,嵌入式硬件
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器
进行比较。

高级定时器的用途:输入捕获,输出比较,PWM,嵌入死区时间的互补PWM等,比通用定时器多了了两个功能。
时基单元包含:
● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)
● 重复次数寄存器 (TIMx_RCR)

我们说一下PWM输出模式
输出比较模式的配置步骤:

  1. 选择计数器时钟(内部,外部,预分频器)
  2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
  3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
  4. 选择输出模式,例如当计数器CNT与CCRx匹配时翻转OCx的输出引脚,CCRx预装载未
    用,开启OCx输出且高电平有效,则必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和
    CCxE=’1’。
  5. 设置TIMx_CR1寄存器的CEN位启动计数器

PWM 模式

详细了解PWM驱动电机请点击STM32输出PWM波控制电机
看另外一篇文章。
在手册中这部分说的寄存器太复杂,看好时间也看不入门。、。。。

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。
在使用库函数配置输出模式时,会有一个输出模式结构体,第一个元素TIM-OCMode PWM模式有两种PWM1和PWM2,区别下图:
STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解,STM32,嵌入式软件开发,keil5,stm32,单片机,嵌入式硬件

预分频器值和重装载寄存器的值是时基单元结构体中可以改的。
Tout=ARR+1)(PSC+1)/Tclk

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频

在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。
关于PWM的输出要额外配置一个定时器输出模式的结构体,里可选择PWM模式和极性、占空比等信息

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

TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能     
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH2预装载使能
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH3预装载使能
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH4预装载使能    
//对应四个通道



TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
对于高级定时器输出PWM波的时候,还要额外添加一个函数TIM_CtrlPWMOutputs

TIM_CtrlPWMOutputs(TIM1,ENABLE);    //MOE 主输出使能     高级定时器输出PWM波特殊配置
不要忘了使能时钟:
TIM_Cmd(TIM1, ENABLE);  //使能TIM1

仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计
数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或
低电平有效。TIMx_CCER寄存器中的CCxE位控制OCx输出使能

PWM频率和占空比计算

对于PWM频率和占空比计算:纯干货,外面没人教你,希望看到这里能给个点赞,收藏不迷路!
频率和占空比可以进行如下设定:
PWM的频率:1秒钟内信号从高电平到底电平再回到高电平的一个次数。
PWM周期=1/频率
PWM的周期:Tout=(PSC+1)(ARR+1)/Tclk
占空比=周期内输出高电平时间/PWM周期=Compare/ARR+1 //Compare的值是库函数中TIM_SetComparex函数给CCR寄存器的值。
我们可以直接操控寄存器或者调用固件库提供的函数
把这里学会 以后学习舵机的时候也要用!!!


#define PWM1   TIM1->CCR1  //PA8       TIM-CH1 ----CH4    PA 8-9-10-11
#define PWM4   TIM1->CCR4  //PA11

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);     //输出模式时可以给每个通道单独赋CCR寄存器的值
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
//这个值


PWM模式1:当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低

看到这里先别走,对于很多小白来说,在学习固件库的过程中,对于官方提供的驱动文件内的函数找不到资料,很关键,这里我为大家搜集了大部分的函数功能,良心up点个赞吧。

void TIM_DeInit(TIM_TypeDef* TIMx);
//恢复缺省配置
void TIM_TimeBaseInit(TIM_TypeDef* TIMx,
TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//时基单元初始化,比较重要,用来配置上图的时基单元,第一个参数TIMx选择某个定时器,
//第二个是结构体,包含配置时基单元的一些参数,
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//可把结构体变量赋一个默认值,
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//用来使能计数器,对应上图的运行控制,第一个参数选择定时器,第二个NewState新的状态
//即使能还是失能,对应计数器是否运行
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT,
FunctionalState NewState);
//用来使能中断输出信号,对应上图中断输出控制,第一个参数选择定时器,第二个选择要
//配置哪个中断输出,第三个新的状态即使能还是失能,ITConfig函数会经常遇到使能外设的中断输出

//以下六个函数对应时基单元的时钟选择部分,可选择RCC内部时钟、ETR外部时钟等四个
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
//选择内部时钟,参数只有一个
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx,
uint16_t TIM_InputTriggerSource);
//选择ITRx其他定时器时钟,第一个参数选择要配置的定时器,第二个选择要接入
//哪个其他的定时器
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
//选择TIx捕获通道的时钟,第一个选择定时器,第二个选择TIx具体的某个引脚,
//第三个和第四个,输出的极性和滤波器,对于外部引脚的波形一般都会有这两个选择,更灵活
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
//选择ETR通过外部时钟模式1输入的时钟,第一个略,第二个外部触发预分频器,可对ETR的
//外部时钟再提前做一个分频,后两个同样是极性和滤波器
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
//同上
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
//这个不是用来选择时钟,单独用来配置ETR引脚的预分频器、极性、滤波器这些参数,

时钟源选择就用上面六个函数!!时基单元用TIM_TimeBaseInit函数,中断输出控制用TIM_ITConfig函数,NVIC用外部中断讲过的NVIC_Init函数,运行控制用TIM_Cmd函数,这样初始化基本就可以了!!
下面再来看几个,因为初始化结构体里有很多关键的参数,比如自动重传值和预分频值等,这些参数可能在初始化之后还需要进行修改,如果因为这个还要再调用一次初始化函数太过麻烦!
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler,
uint16_t TIM_PSCReloadMode);
//用来单独写预分频值,第二个prescaler就是要写入的预分频值,第三个参数写入模式
//预分频器有一个缓冲器,写入的值是在更新事件发生后才有效的,写入模式可选择是
//听从安排在更新事件生效、或者再写入后手动产生一个更新事件,让这个值立刻生效
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
//用来改变计数器的计数模式,参数countermode选择新的计数器模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
//自动重装器预装功能配置,有预装还是无预装是可以自己选择的,newstate使能还是失能决定了它
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
//给计数器写入一个值,如果想手动给一个计数值就可调用此函数,
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
//给自动重装器写入一个值,如果想手动给一个自动重装值就可调用此函数,
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
//获取当前计数器的值,如果想看当前计数器计到哪里了就可调用此函数,
//返回值就是当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
//获取当前预分频器的值
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
//这四个函数用来获取标志位和清楚位的

二、下面的函数与通用/高级定时器的输出比较功能有关:(运用PWM实操用到了)
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
//这四个函数是用结构体来配置输出比较单元的,OC就是Output Compare,可参考输出比较单元博客(4路),第一个TMx选择定时器
//第二个结构体,就是输出比较的那些参数
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
//这个用来给输出比较结构体赋一个默认值的
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
//补充:这个函数仅高级定时器使用,在使用高级定时器输出PWM时需要调用该函数,使能主输出,否则PWM不可正常输出。

以上几个就基本可以配置输出比较了很重要,下面还有一些小功能和运行时更改参数的函数,大多数用的不多了解即可,有兴趣可参考手册,最后一个比较重要:
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
//用来配置强制输出模式,如果在运行中想要暂停输出波形并且强制输出高/低电平可用到。
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
//用来配置CCR寄存器的预装功能,即影子寄存器,就是写入的值不会立即生效,而是在更新事件后才会生效。
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
//用来配置快速使能,手册中单脉冲模式
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
//手册中外部事件时清除REF信号
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
//可用来单独设置输出比较的极性的,带N的就是高级定时器里互补通道的配置,OC4没有互补通道,单独设置极性(多用于修改)
//在结构体初始化的函数里也可以设置极性。一般来说结构体里的参数都会有一个单独的函数可对其修改
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
//可用来单独修改输出使能参数
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
//可用来单独更改输出比较模式
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
//可用来单独更改CCR寄存器值,这四个比较重要更改占空比需要用到,不过建议使用TIMx->CCR1直接控制寄存器

STM32输出PWM波控制电机转速,红外循迹避障智能车+L298N的详细使用手册、接线方法及工作原理,有代码文章来源地址https://www.toymoban.com/news/detail-726654.html

到了这里,关于STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HAL库STM32常用外设教程(五)—— 定时器 输出比较

    有关于定时器 输出PWM功能 不了解的可以看这篇文章 :HAL库STM32常用外设教程(一)—— 定时器 输出PWM 有关于定时器 定时功能 不了解的可以看这篇文章 :HAL库STM32常用外设教程(四)—— 定时器 基本定时 1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以

    2024年03月27日
    浏览(53)
  • stm32之16.外设定时器——TIM3

       ----------- 源码 其他外设定时器使用方法 打开对应时钟供电  

    2024年02月10日
    浏览(45)
  • STM32F4使用高级定时器(TIM1和TIM8)输出PWM问题

    STM32F4使用高级定时器(TIM1和TIM8)输出PWM时要使用TIM_CtrlPWMOutputs使能PWM输出,否则不会输出PWM波形,这一点是和通用定时器输出PWM不一样的地方,通用定时器是不用配置TIM_CtrlPWMOutputs函数的。、

    2024年02月15日
    浏览(34)
  • STM32F105RBT6 使用定时器TIM3输出PWM波

    2.1 相关函数 RCC_APB1PeriphClockCmd、GPIO_Init、TIM_TimeBaseInit、TIM_OC4Init、TIM_OC4PreloadConfig、NVIC_Init、TIM_ITConfig、TIM_Cmd、 3.1 在启动文件里面找到TIM3 对应的中断入口函数,也就是中断服务函数 TIM3_IRQHandler 4.1 中断服务函数需要快速地执行完毕。中断服务函数应该避免执行太多的计算复

    2024年02月08日
    浏览(40)
  • HAL库STM32常用外设教程(一)—— 定时器 输出PWM

    本篇文章为个人参考总结所用,如果错误还望指出。 涉及的知识: 1、STM32CubeMx的部分使用 2、PWM原理及常用概念 3、用单片机生成一定频率的PWM 用到的软件及单片机: 1、STM32CubeMx 2、IDE: MDK-Keil软件 3、芯片:STM32F407ZGT6 4、开发板:正点原子探索者 注:不同型号的单片机实现

    2024年02月02日
    浏览(49)
  • STM32——高级定时器输出比较模式实验

    1,配置定时器基础工作参数 HAL_TIM_OC_Init() 2,定时器PWM输出MSP初始化 HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等 3,配置PWM模式/比较值等 HAL_TIM_OC_ConfigChannel() 4,使能通道预装载 __HAL_TIM_ENABLE_OCxPRELOAD() 5,使能输出、主输出、计数器 HAL_TIM_OC_Start() 6,修改捕获/比较寄存器的值 _HAL

    2024年02月02日
    浏览(43)
  • 【江科大】STM32:(超级详细)定时器输出比较

    输出比较单元 名词解释 IC input capture 输入捕获 OC outpucompare 输出比较 CC capture compare 输入捕获和输出比较的单元 OC(Output Compare)输出比较 :用来输出PWM波形 特点 输出比较可以通过比较CNT(计数器)与CCR(捕获/比较)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作

    2024年01月23日
    浏览(38)
  • STM32笔记——定时器输出比较功能(产生PWM波)

    目录 一、概述 二、PWM简单介绍  三、通用定时器输出比较 3.1 输出比较简介 3.2 输出比较通道 3.3 产生PWM的过程 四、实验硬件介绍及PWM模块程序 4.1 舵机简介 4.2 直流电机及驱动芯片TB6612  4.3 PWM模块驱动程序         主要介绍通用定时器输出比较功能,在GPIO口输出PWM来控

    2024年02月13日
    浏览(35)
  • STM32定时器(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,配置使用

    2.1 时钟来源 计数器时钟可以由下列时钟源提供: ·内部时钟(CK_INT) ·外部时钟模式1:外部输入脚(TIx) ·外部时钟模式2:外部触发输入(ETR) ·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

    2024年02月02日
    浏览(42)
  • 【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包