STM32:TIMER PWM 输入检测
PWM输入检测是输入捕获的一个特例,可以测量频率与占空比
与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。
注意:只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。
//Timer4 CH2测周期,CH1测占空比,PB7引脚来输入
//这个捕捉的周期的范围是1-65535us,如果需要测更高频率的话更改里面的两种方式:
//1,TIM_TimeBaseStructure.TIM_Prescaler =(72-1);更改分配系数调整精度
//溢出计数也可以使用
void TIM4_CH2_CH1_PB7_PWMInPut_Init(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM4_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //Open TIM4 clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //open gpioB clock GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //GPIO??
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 0xffff; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =(-); //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = ; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 /*配置中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM4_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM4, &TIM4_ICInitStructure); //PWM输入配置 TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2); //选择有效输入端
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset); //配置为主从复位模式
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);
TIM_ITConfig(TIM4, TIM_IT_CC2|TIM_IT_Update, ENABLE); //中断配置 TIM_ClearITPendingBit(TIM4, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
TIM_Cmd(TIM4, ENABLE);
}
TIM4_CH2_CH1_PB7_PWMInPut_Init
void TIM4_IRQHandler(void)
{ if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
{
// LED1_Toggle();
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
} if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET)
{ TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
} if(TIM_GetITStatus(TIM4,TIM_IT_CC2)!=RESET)
{ printf("TIM4 frequency=%d , duty=%d \r\n",(/TIM_GetCapture2(TIM4)),(*TIM_GetCapture1(TIM4)/TIM_GetCapture2(TIM4)));
TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);
} if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!=RESET)
{
TIM_ClearITPendingBit(TIM4,TIM_IT_CC4);
} }
TIM4_IRQHandler
注意,如果用CH2测量频率,CH1测量占空比的话,只需要设置CH2,开启CC2中断即可,测量频率的CHX设置为上升沿捕获,
设置函数为: TIM_PWMIConfig(TIM4, &TIM4_ICInitStructure);
而不是TIM_ICInit(TIM4, &TIM4_ICInitStructure);如果选择这个函数初始化的话还需要设置CH1。
同样如果是CH2测量频率的话TIM_TS_TI2FP2,TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2); //选择有效输入端
如果CH1测量频率则为TIM_TS_TI1FP1
下面是TIMER3 配置CH1频率,CH2占空比
//Timer3 CH1测周期,CH2测占空比,PA6引脚来输入
//这个捕捉的周期的范围是1-65535us,如果需要测更高频率的话更改里面的两种方式:
//1,TIM_TimeBaseStructure.TIM_Prescaler =(72-1);更改分配系数调整精度
//溢出计数也可以使用
void TIM3_CH1_CH2_PA6_PWMInPut_Init(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM3_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA0 清除之前设置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6); TIM_TimeBaseStructure.TIM_Period = 0xffff; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =(-); //设置用来作为TIMx时钟频率除数的预分频值 1Mhz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = ; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //pwm输入模式ch1配置
TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1映射到TI1上
TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 //CC1S=01
TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_PWMIConfig(TIM3, &TIM3_ICInitStructure); //PWM输入配置
// TIM_ICInit(TIM3, &TIM3_ICInitStructure); // //pwm输入模式ch2配置
// TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择输入端 IC2映射到TI1上
// TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获
// TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI; //映射到TI1上 //CC2S=10
// TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
// TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
// TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); //选择有效输入端
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); //配置为主从复位模式
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE ); //使能指定的TIM3中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
TIM3_CH1_CH2_PA6_PWMInPut_Init
void TIM3_IRQHandler(void)
{ if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
LED2_Toggle();
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
} if(TIM_GetITStatus(TIM3,TIM_IT_CC1)!=RESET)
{
printf("TIM3 frequency=%d , duty=%d \r\n",(/TIM_GetCapture1(TIM3)),(*TIM_GetCapture2(TIM3)/TIM_GetCapture1(TIM3)));
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
} if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
} }
TIM3_IRQHandler
STM32:TIMER PWM 输入检测的更多相关文章
- STM32的PWM输入模式设置并用DMA接收数据
参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The ...
- STM32之PWM波形输出配置总结
一. TIMER分类: STM32中一共有11个定时器,其中TIM6.TIM7是基本定时器:TIM2.TIM3.TIM4.TIM5是通用定时器:TIM1和TIM8是高级定时器,以及2个看门狗定时器 ...
- 【转载】 stm32之PWM
发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...
- stm32之PWM学习
下图是一个STM32普通PWM形成的图形原理说明 自动重装载寄存器(ARR)用于确定波形的频率(即周期).捕获比较寄存器(CCRx)(用于确定占空比的) PWM的工作过程如下:首先ARR寄存器里面的值 ...
- STM32之PWM君
PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总 ...
- stm32之PWM
PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计 ...
- 【STM32】PWM DAC基本原理(实验:PWM实现DAC)
虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,并且STM32还有其他的很多型号是没有DAC的.通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加. 不过S ...
- stm32之PWM博客好文收藏
https://www.cnblogs.com/jiwangbujiu/p/5616376.html STM32F103 使用TIM3产生四路PWM https://www.cnblogs.com/c ...
- STM32 Timer : Base Timer, Input Capture, PWM, Output Compare
http://www.cs.indiana.edu/~geobrown/book.pdf An example of a basic timer is illustrated in Figure 10 ...
随机推荐
- 牛客多校Round 4
Soved:3 rank:133 A.Ternay String 欧拉降幂一下 但是反复求phi会超时 但mod是同一个就可以记忆化一下 #include <bits/stdc++.h> ...
- 全局唯一的支付和订单id生成算法
数据库存储的是两个Long类型的复合主键.显示到页面的是一个27位的数字单号 package com.yunyihenkey.common.idworker; /** * * @desc * @aut ...
- Luogu P1349 广义斐波那契数列
解题思路 既然广义斐波那契,而且数据范围这么大,那么我们使用矩阵快速幂来进行求解.大家都知道斐波那契的初始矩阵如下 $$\begin{bmatrix}1&1\\1&0\end{bmat ...
- python_ 学习笔记(基础语法)
python的注释 使用(#)对单行注释 使用('''或者""")多行注释,下面的代码肯定了python的牛逼 print("python是世界上最好的语言吗? ...
- 来说一说chrome扩展和chrome插件到底有什么区别?
想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去搜索到chrome插件. 想讨论chrome ...
- 【Codeforces 1036C】Classy Numbers
[链接] 我是链接,点我呀:) [题意] 让你求出只由3个非0数字组成的数字在[li,ri]这个区间里面有多少个. [题解] 只由3个非0数字组成的数字在1~10^18中只有60W个 dfs处理出来之 ...
- Ubuntu16.04再次装机记
个人的吐槽 整个国庆假期(9天),基本上都在搭建PHP环境中耗费了. 是这样的——来大学报到前,想着大学里用个Dev-C++应该够了,于是把Ubuntu删了,腾出了100G的空间.到了CSU,加了团委 ...
- [CH#56]过河(贪心)
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2356%20-%20%E5%9B%BD%E5%BA%86%E8%8A%82%E6%AC%A2%E4%B9%90% ...
- Memcached启动提示:cann't run as root without the -u switch
如果没有带 -u root 的话就会报: can't run as root without the -u switch 解决方法: 带-u root就行了. 出现的原因: 1.可能在root用户下启 ...
- HDFS v1.0学习笔记
hdfs是一个用于存储大文件的分布式文件系统,是apache下的一个开源项目,使用java实现.它的设计目标是可以运行在廉价的设备上,运行在大多数的系统平台上,高可用,高容错,易于扩展. 适合场景 存 ...