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 输入检测的更多相关文章

  1. STM32的PWM输入模式设置并用DMA接收数据

    参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The ...

  2. STM32之PWM波形输出配置总结

    一.   TIMER分类: STM32中一共有11个定时器,其中TIM6.TIM7是基本定时器:TIM2.TIM3.TIM4.TIM5是通用定时器:TIM1和TIM8是高级定时器,以及2个看门狗定时器 ...

  3. 【转载】 stm32之PWM

    发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...

  4. stm32之PWM学习

    下图是一个STM32普通PWM形成的图形原理说明 自动重装载寄存器(ARR)用于确定波形的频率(即周期).捕获比较寄存器(CCRx)(用于确定占空比的) PWM的工作过程如下:首先ARR寄存器里面的值 ...

  5. STM32之PWM君

    PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总 ...

  6. stm32之PWM

    PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计 ...

  7. 【STM32】PWM DAC基本原理(实验:PWM实现DAC)

    虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,并且STM32还有其他的很多型号是没有DAC的.通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加. 不过S ...

  8. stm32之PWM博客好文收藏

    https://www.cnblogs.com/jiwangbujiu/p/5616376.html STM32F103 使用TIM3产生四路PWM https://www.cnblogs.com/c ...

  9. 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 ...

随机推荐

  1. oracle关闭

    Alert log 要每天查看 abort 关闭冷备会无法使用

  2. xmpp之配置Xcode(1)

    介绍 ios上的XMPPFramework你能够在Xcode/iPhoneXMPP 目录找到,它只是实现了XMPP的一小部分功能. 下面主要介绍在开发XMPPFramework ios应用之前的配置工 ...

  3. EXP-00083: 调用 EXFSYS.DBMS_EXPFIL_DEPASEXP.schema_info_exp 时出现前一问题

    select owner,object_name,object_type,status from dba_objects where object_name = 'LT_EXPORT_PKG'; 如果 ...

  4. angular4打包以后,刷新报404

    项目打包以后,上传到服务器,可以正常的切换页面,但是一旦刷新就会报404,找不到页面,其解决方法是:在app.module.ts里面引入下面的模块: import {HashLocationStrat ...

  5. Tensorflow学习笔记(1):tf.slice()函数使用

    tensorflow 当中的一个常用函数:Slice() def slice(input_, begin, size, name=None) 函数的功能是根据begin和size指定获取input的部 ...

  6. 字符串--P1308 统计单词数

    题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...

  7. HDU - 2018 - 母牛的故事(dp)

    题意: 如题 思路: 递推的思想,牛只能在第4年才能开始生小牛,对于 第n年有多少牛 = n-1年的牛数量 + 新出生的牛的数量 新出生的牛的数量 = 已经出生满4年的牛的数量 = n-3年时候牛的数 ...

  8. sscanf 与 sscanf_s

    sscanf 与 sscanf_s 之间的Details sscanf sscanf函数想必大家用的很熟练吧 sscanf函数原型: sscanf(const char* src,format,... ...

  9. js的title提示

    $(function() { //先在页面创建一个层 var jqtip = $("<div id='jqtip20130719'" + "style='paddi ...

  10. Code128条形码如何计算其宽度?如何得出其校验位?

    原文链接 Code128条形码是一个非常高密的字母数字条码,能够存储需要的编码数据,它可以编码所有128个ASCII码字符,它使用最少的空间. 在Code128符号体系中,每个数据字符编码都是由11个 ...