STM32__TIM
PART A 定时基本定时功能
一TIM简介
二,定时器类型 只存在TIM1,2,3,4这四个寄存器
三基本定时器(支持向上计数模式)
1,时基单位
2,预分频器PSC
写0:不分频(1分频):输出频率=输入频率=72MHz
写1:2分频:输出频率=输入频率/2=36MHz
写2:3分频:输出频率=输入频率/3=18MHz
················
预分频器的值和实际分频系数相差1,即实际分频系数=预分频器的值+1
改分频器是16位最大值可写65535,即65536分频
3,计数器:对预分频后计数时钟进行计数
4,自动重装寄存器:存写入的计数目标
运行过程中,计数值不断自增,自动重装值是固定的目标
计数值等于自动重装值时,计数时间到了,就会产生一个中断信号,并且清零计数器
计数器自动开始下一次的计数计时
5,更新中断:向上箭头,表示产生中断信号,这种计数值等于自动重装值产生的中断
更新事件:向下箭头,更新事件不会触发中断,但可以触发内部其他电路的工作
6,定时器中断流程:基准时钟->预分频器->计数器->
计数器计数自增,同时不断与自动重传寄存器比较->
值相等时,即计时时间到->产生一个更新中断和更新事件->
CPU响应更新中断
7,主从触发模式:能让内部的硬件在不受程序的控制下实现自动运行
主模式作用: 需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC
四,通用定时器【支持向上计数模式,
向下计数模式(从重装值开始,向下自减,减到0后回到重装值同时申请中断)
中央对齐模式(从0 开始,先向上自增,记到重装值,申请中断,
再向下自减到0,再申请中断 )】
1,时基单位
2,内外时钟源选择:可以选择内部72MHz和外部时钟(TIMx_ETR引脚上外部时钟)
3,外部时钟模式2
4,当TRGI当做外部时钟来使用的时候,这一路就叫做“外部时钟模式1”
5,实现定时器级联:初始化TIM3,使用主模式把更新事件映射到TRGO上
再初始化TIM2,选择ITR2,对应TIM3的TRGO
五,定时中断基本结构
六,预分频器时序
1,CK_PSC 预分频器的输入时钟
2,CNT_EN 计数器使能,高电平计数器正常运行,低电平计数器停止
3,CK_CNT 计数器时钟,即是预分频器的时钟输出,也是计数器的时钟输入
4,计数器寄存器数值跟随上升沿自增,可得ARR自动重装值就是FC,
当计数值计到和重装值相等。并旦下一个时钟来临时,计数值才清零
同时下面产生一个更新事件
5,预分频寄存器的缓冲,下三行(这里没捋懂)
七,计数器时序
1,CK_INT 内部时钟72MHz
2,时钟使能,高点频启动,
3,计数器时钟,因为分频系数为2,所以这个频率是上面(CNT)的/2
4,计数器在每个上升沿自增,到0036时,发生溢出,计到36后再来一个上升沿,计数器清零
计数器溢出,产生一个更新事件脉冲。并会置一个更新中断标志位UIF,UIF置1,
就会 申请中断,中断响应后要手动清零
5,计数器有预装时序,有缓冲寄存器
计数器无预装时序,无缓冲寄存器
八,定时器定时中断
1,因为定时器不涉及外部硬件,所以放system里
2,根据定时中断基本结构,初始化配置定时器
2.1 RCC开启时钟
2.2 选择时基单元时钟源(对于定时中断,我们选择内部时钟)
2.3 配置时基单元(预分频器,自动重装器,计数模式)
2.4 配置输出中断控制,允许更新中断到NVIC
2.5 配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
2.6 运行控制
2.7配置完要使能定时器,才可使用
2.8 最后写一个中断函数
3,介绍库函数
TIM_DeInit 恢复缺省配置(默认模式)
TIM_TimeBaseInit 时基单元初始化,
配置时基单元【参数1:TIMx选择某个定时器,
参数2:TIM_TimeBaseInitStruct 结构体(包含配置时基单元的参数)】
TIM_TimeBaseStructInit 可以把结构体变量赋一个默认值
TIM_Cmd 使能计数器(对应定时中断基本结构中的运行控制)
(参数1:TIMx选择定时器,参数2:NewState使能还是失能)
TIM_ITConfig 使能中断输出信号(对应定时中断基本结构中的中断输出控制)
(参数1:TIMx选择定时器,参数2:TIM_IT 选择配置哪个中断输出,参数3:NewState使能还是失能)
时钟源选择
TIM_InternalClockConfig 选择内部时钟
TIM_ITRxExternalClockConfig 选择ITRx其他定时器的时钟
TIM_TIxExternalClockConfig 选择TIx 捕获的时钟
TIM_ETRClockMode1Config 选择ETR通过外部时钟模式1输入的时钟
TIM_ETRClockMode2Config 选择ETR通过外部时钟模式2输入的时钟
TIM_ETRConfig 单独用来配置ETR引脚的预分频器、极性、滤波器这些参数的
NVIC 用上节NVIC_Init
TIM_PrescalerConfig 单独写预分频值
TIM_ARRPreloadConfig 自动重装器预装功能配置
TIM_SetCounter 给计数器写一个值
TIM_SetAutoreload 给自动重装器写入一个值
TIM_GetCounter 获取当前计数器的值
TIM_GetPrescaler 获取当前预分频器的值
4,Period,周期,就是ARR自动重装器的值
Prescaler,就是PSC预分频器的值
RepetitionCounter,是重复计数器的值
5,TIM_RepetitionCounter 高级定时器才用,这里给0
6,跨文件使用变量,
1,在使用变量的文件上用extern声明变量,把extern声明变量当作main.c变量的引用
该过程并没有定义新的变量 ,操作的还是main.c中的Num
2,复制中断函数,放到主函数后面,就不需要extern声明,Timer.c中的中断就不需要了
7,Num一开始是1,说明在初始化后立刻进入了一次中断函数
原因:预分频器是有一个缓冲寄存器的,写的值只有在更新事件时,才会真正起作用
为了让值立刻起作用,在最后手动生成一个更新事件,这样预分频器的值就有效
副作用:更新事件和更新中断同时发生 ,更新中断会置更新中断标志位
一但初始化完了,更新中断就会立刻进入
解决方案:开启中断前面加
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动清除更新中断标志位
九,定时器外部时钟
1,配置通过etr的外部时钟模式2 TIM_ETRClockMode2Config参数选择
1.1 TIM_ExtTRGPSC_OFF,不需要分频
1.2TIM_ExtTRGPolarity_Inverted是反向,就是低电平或下降沿有效
1.3TIM_ExtTRGPolarity_NonInverted是不反向,就是高电平或上升沿有效
1.4 外部触发滤波器:以一个采样频率f采用n个点,如果n个点都一样才会有效输出
填一个滤波值(该处填0x0F)就不会乱跳
*十,输出比较功能(主要用来输出PWM波形(驱动电机的必要条件))
1,OC(Output Compare)输出比较,IC(Input Compare)输入比较
CC(Capture Compare)表示输入捕获和输出比较单元
十一,PWM简介
1,,使用PWM波形,用来等效地实现一个模拟信号的输出
2,对于呼吸灯:调控点亮和熄灭的时间比例,就能让LED呈现出不同的亮度级别
对于电机调速:我们以很快的频率给电机通电断电通电断电,使电机的速度维持中等速度
3,PWM的应用场景必须是一个惯性系统,
即LED在熄灭的时候,由于余晖和人眼视觉暂留现象,
LED不会立马熄灭,而是有一定的惯性,过一小段时间才会熄灭。
电机也是,电机断电时,电机的转动不会立马停止,而是有一定的惯性,过一小段时间才会熄灭。
4,高低电平跳变的数字信号,可以等效为中间虚线表示的模拟量
当上面电平时间长一点,下面电平时间短一点的时候,等效模拟量就偏向于上面
当下面电平时间长一点,上面电平时间短一点的时候,等效模拟量就偏向于下面
5,PWM参数
5.1 频率=1/Ts(Ts代表一个高低电平变换周期的时间),
PWM频率越快,等效模拟的信号就越平稳,同时性能开销就越大
一般来说PWM频率在几k到几十k就够快了
5.2 占空比=Ton/Ts(Ton是高电平的时间,Ts代表一个高低电平变换周期的时间。
那Ton/Ts就是高电平时间相对于整个周期时间的比例)
占空比越大,那等效的模拟电压就越趋近于高电平
占空比越小,那等效的模拟电压就越趋近于低电平
5.3 分辨率(占空比变化的精细程度)=占空比变化步距
6,使用PWM 波形,可以在数字系统等效输出模拟量,实现LED控制亮度,电机控速等功能
十二,输出比较通道(通用)
1,左边就是CNT计数器和CCR1第一路的捕获/比较寄存器
CNT>CCR1或者CNT=CCR1,就会给输出模式控制器传一个信号
输出模式控制器就会改变它输出OC1REF(reference参考信号)的高低电平
2,ETRF ,不用
3,REF可以前往主模式控制器,可以映射到主模式的TRGO输出上
4,REF主要通往下一路的极性选择,
给寄存器写0,信号往上走,就是电平不翻转,进来什么样出去什么样
给寄存器写1,信号往下走,就是电平翻转,信号通过一个非门取反
5,输出使能电路
6,OC1引脚就是CH1通道的引脚
十三,输出比较模式(输出模式控制器里面的执行逻辑)
1,匹配时置有效电平,CNT=CCR时,REF置有效(高)电平
匹配时置无效电平,CNT=CCR时,REF置无效(低)电平
以上两种都是一次性,不适合输出连续变化的波形
2, PWM模式1,PWM模式2,用于输出频率和占空比都可调的PWM波形
十四, PWM基本结构(主要讲解使用PWM1)
1,蓝色CNT,黄色ARR,红色CCR,绿色输出
2,蓝色自增到99,清零后再自增
3,由0开始CNT<CCR,置高电平。后面CNT>=CCR变为低电平。
4,占空比受CCR调控,如果CCR高一些,输出占空比就变大
如果CCR低一些,输出占空比就变小
十五,参数计算
1,该处分辨率是占空比最小的 变化步距,值越小越好
CCR的范围定义成分辨率,值越大越好
总而言之:占空比变化越细腻越好
十六,相关硬件外设
1,舵机简介执行逻辑:PWM信号输入控制板 ,给控制板一个指定的目标角度
电位器检测输出轴的当前角度:如果大于目标角度,电机机会反转
如果小于目标角度,电机机会正转
最终是输出轴固定在指定角度
1,如果单独供电:供电负极要和STM32共地,正极接5V引脚上,信号线,直接接引脚上就行(如PA0)
1,VM电机电源的正极,和舵机要求电源一样,要接一个输出大电流的电源
VM是驱动电压输入端,范围是4.5-10V,一般与电机额定电压保持一致
如果是5V 的电机,这里就接5V
2,VCC逻辑电平输入端,范围是2.7V-5.5V,要和控制器电源保持一致
如果使用STM32,是3.3V的器件,就接3.3V,
不需要大功率,可以和控制器共用一个电源
3,第三个引脚GND,接系统的负极
4,AO1,AO2,BO1,BO2就是两路电机的输出
AO1,AO2是A路的两个输出,控制端是上面的三个(PWMA,AIN2,AIN1),
这三个引脚(直接接GPIO口)控制下面的一个电机,
其中PWMA要接PWM信号输出端,其他两个引脚任意接两个普通的GPIO口。
这三个引脚给一个低功率的控制信号,驱动电路就会从VM汲取电流,来输出到电机,
这样就能完成低功率的控制信号控制大功率设备的目的了。
5,STBY引脚,是待机控制脚。如果接GND芯片就不工作,处于待机状态
如果接逻辑电源VCC,芯片就正常工作
1,判断正转反转
十七,PWM驱动LED呼吸灯
1,根据PWM基本结构 开钟,配时基单元,配输出比较单元,配GPIO,运行控制
2,介绍库函数
结构体初始化输出比较单元(配四个)TIM_OC1Init,TIM_OC2Init,TIM_OC3Init,TIM_OC4Init
TIM_OCStructInit 这个是用来给输出比较结构体赋一个默认值的
TIM_CtrlPWMOutputs仅高级定时器使用
在使用高级定时器输出PWM时
需要调用这个函数
使能主输出
否则PWM将不能正常输出
TIM_SetCompare1 用来单独更改CCR寄存器值的函数
3,引脚重映射
把PA0,改到PA15,用部分重映射或者引脚重映射
重映射定时器或者其他外设的复用引脚
1,先打开AFIO时钟
2,再用AFIO重映射外设复用的引脚
PA15,PB3,PB4当作GPIO使用要解除调试
1,先打开AFIO时钟
2,再用AFIO复用将JTAG解除
重映射的引脚正好是调试端口
1,先打开AFIO时钟
2,再用AFIO重映射外设复用的引脚
3,再用AFIO复用将JTAG解除十八,PWM驱动舵机
1,对于同一个定时器的不同通道输出的PWM的特点
1.1 因为不同通道是共用一个计数器的 ,它们的频率是一样的
1.2占空比由各自的CCR决定,占空比可以各自设定
1.3由于计数器更新,所有PWM同时跳变,所以它们的相位是同步的
1.4如果驱动多个舵机或直流电机,使用同一个定时器不同通道的PWM,就可以了
2,参数计算
2.1 PWM_SetCompare2(1500);90度
(2500)180
(500)0
十九,PWM驱动直流电机
1,加大PWM频率,超出人耳范围,就听不到蜂鸣器响
人耳听到20-20kHz,目前是1kHz
可以加大频率,可通过减小预分频器完成,这样不会影响占空比,
给预分频器PSC去掉一个0,变成72-1,就是10kHz了
36-1,就是20kHz
2,反转用,int void Motor_SetSpeed(int8_t Speed)
3,Compare传正数,Speed前加-
二十,输入捕获简介
1,功能描述:就是输入引脚电平跳变的瞬间,把CNT的值锁存到CCR中
2,作用:测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
3,结合PWMI模式和主从触发模式,测量频率占空比就是硬件全自动执行
软件不需要干预和中断,需要测量时,直接读取CCR寄存器
二十一,频率测量
1,越往左,频率越高。越往右,频率越低
2,信号都是只有高低电平的数字信号
3,测试频率的方法
3.1 测频法(适合高频信号):测频法测量结果,更新的慢一些,数值相对稳定
3.2 测周法(适合低频信号):测周法更新的快,数据跳变也非常快
4,中界频率:测频法与测周法误差(N相同)相等的频率点,
5,N越大,正负1误差对我们的影响越小
6,每次捕获之后,要CNT清0,再补获取的CNT才是两个上升沿的时间间隔
(可以用主从触发模式自动完成)
二十二,输入捕获通道
1,滤波器的输入是TI1,即CH1的引脚
2,输出的TI1F是滤波后的信号
3,FDTS是滤波器的采样时钟来源
4,CCMR1寄存器里的ICF位可以控制滤波器的参数
5,滤波器工作原理:
5.1 以采样频率对输入信号进行采样,
当连续N个值都为高电平,输出才为高电平
当连续N个值都为低电平,输出才为低电平
5.2 ,如果信号出现高频抖动,导致连续采样N个值不全都一样
那输出就不会变化这样就可以达到滤波的效果
5.3 采样频率越低,采样个数N越大,滤波效果就越好。
6, 滤波后的信号,通过边缘检测器,捕获上升沿或下降沿
7,用CCER寄存器里的CC1P位,可以选择极性
8, 最终,得到T11FP1触发信号,通过数据选择器,进入通道1后续的捕获电路
9,共四种连接方式
10,CC1S位可以对数据选择器进行选择
11,ICPS位,可以配置这里的分频器
12,CC1E位,控制输出使能或失能
13,TI1FP1和TIF_ED可以通向从模式控制器
二十三,主从触发模式
1,主模式:可以将定时器内部的信号,映射到TRGO引脚,触发别的外设
2,从模式:接收其他外设或者自身外设的一些信号,
用于控制自身定时器的运行,也就是被别的信号控制
3,触发源选择:选择从模式的触发信号源的(可以认为是从模式的一部分)
选择指定的一个信号,得到TRGI,TRGI去触发从模式
4,让TI1FP1信号自动触发CNT清零,实现硬件全自动测量选择下面的路
二十四,输入捕获基本结构
1,时基单元配置好,启动定时器,CNT会在预分频后的时钟驱动下,不断自增
2,经过预分频之后这个位置的时钟频率,就是驱动CNT的标准频率fc
(标准频率=72M/预分频系数)
3,ARR一般设置为最大65535,那CNT最大也是65535
二十五,PWMI基本结构
1,两个通道同时捕获一个引脚,可以同时测量周期和占空比
二十六,输入捕获模式测频率
1,ARR给100-1,这样PSC决定频率,CCR决定占空比
2,PWM_SETPrescaler(720-1); //频率=72M/(PSC+1)/(ARR+1)
PWM_SetCompare1(50); //Duty = CCR/(ARR+1)
3,初始化IC对照基本结构来
3.1 RCC开钟,开GPIO和TIM
3.2 GPIO初始化,把GPIO配置成输入模式(一般选择上拉输入或者浮空输入模式)
3.3 配置时基单元,让CNT计数器在内部时钟的驱动下自增运行
3.4 配置输入捕获单元,
3.5 选择从模式触发源(TI1FP1),调用库函数就行
3.6 选择触发后执行Reset操作,调用库函数就行
3.7 最后调用TIM_Cmd函数,开启定时器
4,库函数介绍
4.1 IC_Init 初始化输入捕获单元(单一配置一个通道),四个通道共用一个函数,
TIM_OC4Init,每个通道单独占一个函数
4.2 TIM_PWMIConfig 初始化输入捕获单元(快速配置两个通道),
4.3 TIM_ICStructlnit,可以给输入捕获结构体赋一个初始值
4.4 TIM_SelectlnputTrigger,选择输入触发源TRGI(对应从模式的触发源选择)
4.5 TIM_SelectOutputTrigger,选择输出触发源TRGO(对应主模式输出的触发源)
4.6 TIM_SelectSlaveMode,选择从模式(对应从模式选择部分)
4.7 TIM SetlC1, 2. 3. 4Prescaler,分别单独配置通道1、2、3、4的分频器
4.8 TIM_GetCapture1,2,3,4,和SetCompare1,2,3,4对应,
都是读写CCR寄存器
输出比较模式下,CCR是只写的,要用SetCompare写入
输入捕获模式下,CCR是只读的,要用GetCapture读出
5,attention:滤波器和分频器都是计次的
5.1 滤波器计次,不会改变信号的原有频率,一般滤波器的采样频率会远高于信号频率
所以它只会滤除高频噪声,使信号更平滑
5.1 分频器就是对信号本身进行计次了,会改变频率
6,TIM_ICPSC_DIV1每次触发都有效,不分频
二十七,PWIM模式测频率占空比
1,开两个通道,图1 效果等于图2
只需要传入一个通道参数,在函数里,会自动把剩下的一个通道初始化成相反配置
该模式只支持通道1,2
二十八,编码器接口简介
1,CH3,CH4不能接编码器
二十九,正交编码器
1,一般有两个信号输出引脚,一个是A相,一个是B相
2,转得越快,方波的频率越高,方波的频率代表速度
3,正转时,A相提前B相90度。反转时,A相滞后B相90度。这两个定义是相对的
4,用正交信号相比较单独定义一个方向引脚的好处:
4.1 正交信号精度更高,因为A、B相都可以计次,相当于计次频率提高了一倍
4.2 正交信号可以抗噪声,因为正交信号的两个信号是交替跳变的,
所以可以设计一个抗噪声电路,
如果一个信号变,另一个不变,就是产生噪声,此时计次值是不会变化的
5,当出现某一个边沿时,判断另一相的高低电平,在正转表就是正转,在反转表就是反转
三十,编码器接口基本结构
1输入捕获的前两个通道,通过GPIO口接入编码器的A、B相
2 然后通过滤波器和边沿检测极性选择,产生TIFP1和TIFP2,通向编码器接口,
3 编码器接口通过预分频器控制CNT计数器的时钟
4 同时,编码器接口还根据编码器的旋转方向,控制CNT的计数方向
5 编码器正转时,CNT自增,编码器反转时,CNT自减
三十一,工作模式
1,TI1FP1和TI2FP2接的是编码器的A、B相
2, 在A相和B相的上升沿或下降沿触发计数
3,向上计数还是向下计数,取决于另一相的电平状态(即此处的相对信号的电平)
4,有效边沿,三种模式:仅在A相边沿计数,仅在B相边沿计数,AB相边沿都计数
tips:正向的都向上计数,反向的都向下计数
三十二,实例图
1,下图两个引脚都不反向
2,极性的变化对计数的影响,下图为TI1反相,TI2不反相
三十三,编码器测速
1,初始化Encoder,根据编码器接口基本结构配置
1.1 RCC开钟,开GPIO和TIM
1.2 配置GPIO,把PA6,PA7配成输入模式
1.3 配置时基单元:预分频器选择不分频,自动重装一般给最大65535只需要CNT执行计数就行
1.4 配置输出捕获单元(这里只有滤波器和极性两个参数有用)
1.5 配置编码器接口模式:调用库函数就可以
1.6 调用TIM_Cmd,启动定时器
2,电路完成后,CNT就会随着编码器自增自减。
如果想量出编码器位置,直接读出CNT的值
如果想测量编码器的速度和方向,需要每隔一段固定的闸门时间,取出一次CNT,再把CNT清零,这就是测频法测量速度了
3,库函数介绍
TIM_EncoderInterfaceConfig 定时器编码器接口配置
(参数1:定时器,参数2:编码器模式,参数3:通道1的电平极性,参数4:通道2的电平极性)
4,不需要定时器内部时钟配置, 因为编码器接口会托管时钟
编码器接口就是一个带方向控制的外部时钟,所以内部时钟没有用
5,不需要计数器模式,因为计数方向会被编码器接口托管
6,自动重装值,给65536-1,即满量程计数,这样的计数范围是最大的,方便换算为负数 7,预分频器,改成1-1,预分频器给0,就是不分频。编码器的时钟,直接驱动计数器 8,TIM_EncoderInterfaceConfig要在TIM_ICInit后面,否则会被覆盖
9,反转改负数,强制转换类型
10,修改极性,即正反转与增减对应情况
10.1硬件:A,B两根线换一下
10.2 软件:任意修改一个极性,修改两个就还是不变
11,实现编码器测速:在固定的闸门读一次CNT,然后把CNT清零
需要定义一个临时变量
12,该处用Delay_ms(1000);实现闸门时间,最好不要在主循环加入过长的 Delay
作者:nosaes