版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在输入捕获模式下,当检测到ICx信号上升/下降边沿时,计数器的当前值被存储在捕获比较寄存器TIMx_CCRx中。当捕获事件发生时,相应的CCxIF 标志(TIMx_SR 寄存器) 被置1。如果中断或者DMA功能被使能,就会产生中断或者DMA请求。如果捕获发生时,CCxIF标志已经被置位,这时过采样标志CCxOF就会被置位。向CCxIF写0或者读去TIM_CCRx中的数据,将清除捕获标志。CCxOF位只能通过手动写入0进行清除。假如我设置为上升沿捕获,那么当一个上升沿到来的时候,定时器当前的计数值(TIMx_CNT)就会写入TIMx_CCRx中。我们读取这个数据。等到下一个上升沿到了时,就会有另
2、一个计数器值TIMx_CNT记录。根据这两个数据值差,我们能算出来输入数据的周期。当然,我们还有处理定时器溢出这个问题,定时器溢出了就不准了。如果要测占空比,就需要同时捕获上升沿和下降沿。相邻两个上升沿之间的计数是输入的周期,相邻两次捕获(一个上升沿一个下降沿)之间的时间是占或者空的时间。根据这个可以计算占空比或者PPM之类的东西。【实验内容】本次实验,使用TIM4产生一个1K的频率输出,用TIM1进行捕获。并测出频率计算TIM1 的时基单元配置:关于TIM1的时基设置问题前文已经讨论过了。这里只有一点需要明确的,就是为了尽量减少更新事件,将TIM_Period设置到最大即0xFFFF。定时器
3、时钟设置成2M,这样定时器的更新频率就是30Hz,不会造成两次捕获之间产生多次更新。TIM1的完整配置代码如下:void TIM1_ICConfig(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);/ /时基初始化 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; /死区控制用。 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_U
4、p; /计数器方向 TIM_TimeBaseInitStructure.TIM_Prescaler = 84-1; /Timer clock = sysclock /(TIM_Prescaler+1) = 2M TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; /Period = (TIM counter clock / TIM outpu
5、t clock) - 1 = 40Hz TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICPrescaler
6、= TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM1,&TIM_ICInitStructure); TIM_Cmd(TIM1,ENABLE);TIM4的配置就是基本的输出配置,没什么可说的。代码如下:void TIM4_OCConfig(void) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); TIM_TimeBaseInitSt
7、ructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Prescaler = 0; TIM_TimeBaseInitStructure.TIM_RepetitionCounter =0; TIM_TimeBaseInitStructure.TIM_Period = 42000-1; /周期:42M
8、/(42000)= 1K TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 10000; TIM_OCInitStructure.TIM_O
9、CPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OC1Init(TIM4,&TIM_OCInitStructure); TIM_Cmd(TIM4,ENABLE);这个输出频率,在示波器上可以看到的:之后就是在主函数里边进行测量了:CaptureNumber = 0; while(1) if(TIM_GetFlagStatus(TIM1,TI
10、M_FLAG_CC1)=SET) TIM_ClearFlag(TIM1,TIM_FLAG_CC1); if(CaptureNumber = 0) counter = TIM_GetCapture1(TIM1); /第一次捕获
11、 CaptureNumber = 1; else if(CaptureNumber = 1) /处理第二次捕获
12、60; if(TIM_GetFlagStatus(TIM1,TIM_FLAG_Update) != SET)/两次捕获间没有发生溢出的处理 Time = TIM_GetCapture1(TIM1); Time = Time - count
13、er; else TIM_ClearFlag(TIM1,TIM_FLAG_Update); /产生了更新事件
14、0; Time = 0xFFFF - counter + TIM_GetCapture1(TIM1)+1; /如果有更新事件产生时候的计算方式 CaptureNumber = 0; if(Time!=0)
15、; freq= 2000000/Time; /计算频率 freq = freq; /避免变量freq被编译器优化掉
16、 通用定时器作为输入捕获的使用。我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率。 STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(
17、比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。我们用到 TIM5_CH1 来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候 TIM5_CNT 的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的 TIM5_CNT 值。这样,前后两次 TIM5_CNT 之差,就是高电平的脉宽,同时 TIM5 的计数频率
18、我们是知道的,从而可以计算出高电平脉宽的准确时间。输入捕获的配置步骤:1)开启 TIM5 时钟和 GPIOA 时钟,配置 P A0 为下拉输入。要使用 TIM5,我们必须先开启 TIM5 的时钟。这里我们还要配置 P A0 为下拉输入,因为我们要捕获 TIM5_CH1 上面的高电平脉宽,而 TIM5_CH1 是连接在 PA0 上面的。RCC_APB1PeriphClockCmd(RCC_APB1Periph
19、_TIM5, ENABLE); /使能 TIM5 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /使能 GPIOA 时钟2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。在开启了 TIM5 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来设置输入捕获的自动重装载值和计数频率
20、。 这在库函数中是通过 TIM_TimeBaseInit 函数实现的点击(此处)折叠或打开1. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;2. TIM_TimeBaseStructure.TIM_Period = arr; /设定计数器自动重装值 3. TIM_TimeBaseStructure.TIM_Prescaler =psc; /设置预分频值 4. TIM_TimeBaseStructure.TIM_ClockDivision
21、= TIM_CKD_DIV1; / TDTS = Tck_tim5. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM 向上计数模式6. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);3)设置 TIM5 的输入比较参数,开启输入捕获输入比较参数的设置包括映射关系,滤波,分频以及捕获方式等。这里我们需要设置通道 1为输入模式,且 IC1 映射到
22、;TI1(通道 1)上面,并且不使用滤波(提高响应速度)器,上升沿捕获。库函数是通过 TIM_ICInit 函数来初始化输入比较参数的:void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);同样,我们来看看参数设置结构体 TIM_ICInitTypeDef 的定义:点击(此处)折叠或打开1. typedef struct2. 3. uint16_t TIM_C
23、hannel; /设置通道4. uint16_t TIM_ICPolarity; /设 置 输 入 信 号 的 有效 捕获 极性 5. uint16_t TIM_ICSelection; /设置映射关系6. uint16_t TIM_ICPrescaler; /设置 输入捕获分频系数7. uint16_t TIM_ICFilter; /设置滤波器
24、长度8. TIM_ICInitTypeDef;配置代码是:点击(此处)折叠或打开1. TIM_ICInitTypeDef TIM5_ICInitStructure; 2. TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /选择输入端 IC1 映射到 TI1 上3. TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; /上升沿捕获4. TIM5_ICInitStructure.TIM_ICSel
25、ection = TIM_ICSelection_DirectTI; /映射到 TI1 上5. TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /配置输入分频,不分频 6. TIM5_ICInitStructure.TIM_ICFilter = 0x00;/IC1F=0000 配置输入滤波器 不滤波7. TIM_ICInit(TIM5, &TIM5_ICInitStructure);4)使能捕获和更新中断(设置 TI
26、M5 的 DIER 寄存器)因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否则结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。 这里我们使用定时器的开中断函数 TIM_ITConfig 即可使能捕获和更新中断:TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/允许更新中断和捕获中断5)设置中断分组,编写中
27、断服务函数设置中断分组主要是通过函数 NVIC_Init()来完成。分组完成后,我们还需要在中断函数里面完成数据处理和捕获设置等关键操作,从而实现高电平脉宽统计。在中断服务函数里面,跟以前的外部中断和定时器中断实验中一样,我们在中断开始的时候要进行中断类型判断,在中断结束的时候要清除中断标志位。使用到的函数分别为 TIM_GetITStatus()函数和 TIM_ClearITPendingBit()函数。if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/判断是否为更新中断
28、if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)/判断是否发生捕获事件TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);/清除中断和捕获标志位6)使能定时器(设置 TIM5 的 CR1 寄存器) 最后,必须打开定时器的计数器开关, 启动 TIM5 的计数器,开始输入捕获。 TIM_Cmd(TIM5,ENABLE );
29、160; /使能定时器 5例程:点击(此处)折叠或打开1. #include "timer.h"2. #include "led.h"3. #include "usart.h"4.5. /*6. * 定时器5通道1输入捕获配置7. */8. void TIM5_Cap_Init(u16 arr,u16 psc)9. 10. GPIO_InitTypeDef GPIO_InitStructure;11. TIM_TimeBaseInitTypeDef TIM_Tim
30、eBaseStructure;12. TIM_ICInitTypeDef TIM5_ICInitStructure;13. NVIC_InitTypeDef NVIC_InitStructure;14.15. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); /*使能TIM5时钟*/16. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /*使能GPIOA时钟*/17.18. GPIO_InitStructure.GPIO_Pi
31、n = GPIO_Pin_0; /*/19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; /*PA0 输入*/20. GPIO_Init(GPIOA,&GPIO_InitStructure);21. GPIO_ResetBits(GPIOA,GPIO_Pin_0); /*PA0 下拉*/22.23. /*初始化定时器5 TIM5*/24. TIM_TimeBaseStructure.TIM_Period = arr; /*设定计数器自动重装
32、值 */25. TIM_TimeBaseStructure.TIM_Prescaler = psc; /*预分频器 */26. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*设置时钟分割:TDTS = Tck_tim*/27. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*TIM向上计数模式*/28. TIM_TimeBaseInit(TIM5,&TI
33、M_TimeBaseStructure); /*根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位*/29.30. /* 初始化TIM5输入捕获参数 */31. TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /*CC1S=01 选择输入端 IC1映射到TI1上*/32. TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
34、0;/*上升沿捕获*/33. TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /*映射到TI1上*/34. TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /*配置输入分频,不分频*/35. TIM5_ICInitStructure.TIM_ICFilter = 0; /*IC1F=0000 配置输入滤波器 不滤波*/36. TIM_ICInit(TIM5,&am
35、p;TIM5_ICInitStructure);37.38. /*中断分组初始化*/39. NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; /*TIM5中断*/40. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; /*先占优先级2级*/41. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /*从优先
36、级0级*/42. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/43. NVIC_Init(&NVIC_InitStructure);44.45. TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/*允许更新中断 ,允许CC1IE捕获中断*/46. TIM_Cmd(TIM5,ENABLE); /*使能定时器5*/47. 48.49. u8 TIM5CH1_CAPTURE_STA=0; &
37、#160;/输入捕获状态50. u16 TIM5CH1_CAPTURE_VAL; /输入捕获值51.52. /*53. * 定时器5中断服务程序54. */55. void TIM5_IRQHandler(void)56. 57. if(TIM5CH1_CAPTURE_STA&0X80)=0)/还未成功捕获58. 59. if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET)60. 61. if(TIM5CH1_CAPTUR
38、E_STA&0X40)/已经捕获到高电平了62. 63. if(TIM5CH1_CAPTURE_STA&0X3F)=0X3F)/高电平太长了64. 65. TIM5CH1_CAPTURE_STA|=0X80;/标记成功捕获了一次66. TIM5CH1_CAPTURE_VAL=0XFFFF;67. else TIM5CH1_CAPTURE_STA+;68. 69. 70.71. if(TIM_GetITStatus(TIM5,TIM_IT_CC1) !=RESET)72. 73. if(TIM5CH1_CAPTURE_STA & 0
39、x40)74. 75. TIM5CH1_CAPTURE_STA|=0X80; /标记成功捕获到一次上升沿76. TIM5CH1_CAPTURE_VAL = TIM_GetCounter(TIM5);77. TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); /CC1P=0 设置为上升沿捕获78. 79. else80. 81. TIM5CH1_CAPTURE_STA=0;
40、160; /清空82. TIM5CH1_CAPTURE_VAL=0;83.84. TIM_SetCounter(TIM5,0);85. TIM5CH1_CAPTURE_STA|=0X40; /标记捕获到了上升沿86. TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); /CC1
41、P=1 设置为下降沿捕获87. 88. 89.90. 91. TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update); /*清除中断标志位*/92. 点击(此处)折叠或打开1. extern u8 TIM5CH1_CAPTURE_STA; /输入捕获状态
42、 2. extern u16 TIM5CH1_CAPTURE_VAL; /输入捕获值3. int main(void)4. 5. u32 temp=0;6. delay_init(); /延时函数初始化7. NVIC_Configuration();
43、 /设置NVIC中断分组2:2位抢占优先级,2位响应优先级8. uart_init(9600); /串口初始化为96009. LED_Init(); /LED端口初始化10.11. TIM5_Cap_Init(0XFFFF,72-1); /以1Mhz的频率计数12. while(1)13. 14
44、. delay_ms(10);15.16. if(TIM5CH1_CAPTURE_STA&0X80)/成功捕获到了一次上升沿17. 18. temp=TIM5CH1_CAPTURE_STA&0X3F;19. temp*=65536;/溢出时间总和20. temp+=TIM5CH1_CAPTURE_VAL;/得到总的高电平时间21. printf("HIGH:%d usrn",temp);/打印总的高点平时间22. TIM5CH1_CAPTURE_STA=0;/开启下一次捕获23. 24. 25. 以下笔记始发于观海听涛,原创人Apache,转载请说明输入捕获
45、作为定时器的一个功能,在工业测速上有很大的应用。STM32的一些定时器具有四个外部通道,可利用一个定时器采集外部四路脉冲频率,节约硬件资源和软件代码如需要测量一个或多个外部方波脉冲频率,频率低于单片机运行频率,可如下操作:(以TIM4为例)初始化:(省略GPIO配置,将TIM4的四个通道引脚配置为上拉或浮空输入,省略定时器RCC配置,省略中断NVIC配置)1. void TIM_Configuration(void) 2. TIM_ICInitTypeDef 3. TIM_ICInitStructure;4. TIM_TimeBaseI
46、nitTypeDef 5. TIM_TimeBaseStructure; / TIM4 时基 6. TIM_DeInit(TIM4); 7. TIM_TimeBaseStructure.TIM_Period = 0xffff; /自动重装值 TIM_TimeBaseStructure.TIM_Prescaler = 719; /预分频值, 使TIMx_CLK=1MHz 8. TIM_TimeBaseStructure.TIM_
47、ClockDivision = 9. TIM_CKD_DIV1; /输入时钟不分频 10. TIM_TimeBaseStructure.TIM_CounterMode = 11. TIM_CounterMode_Up; /向上计数 12. TIM_TimeBaseInit(TIM4, &TIM_TimeBas
48、eStructure); /TIM4_TimeBase 13. / TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; /输入捕捉方式14. TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;/| 15. TIM_Channel_2; /输入通
49、道16. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; /捕捉上升沿17. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /捕捉中断18. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /捕捉不分频19. TIM_ICInit
50、Structure.TIM_ICFilter = 0x0; /捕捉输入不滤波20. TIM_ICInit(TIM4, &TIM_ICInitStructure);21. TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;/| TIM_Channel_2; /输入通道22. TIM_ICInitStructure.TIM_I
51、CPolarity = TIM_ICPolarity_Rising; /捕捉上升沿23. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /捕捉中断24. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /捕捉不分频25. TIM_ICInitStructure.TIM_ICFilter =
52、0x0; /捕捉输入不滤波26. TIM_ICInit(TIM4, &TIM_ICInitStructure);27. TIM_ICInitStructure.TIM_Channel = TIM_Channel_3 ;/| TIM_Channel_2; /输入通道28. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarit
53、y_Rising; /捕捉上升沿29. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /捕捉中断30. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /捕捉不分频31. TIM_ICInitStructure.TIM_ICFilter = 0x0;
54、 /捕捉输入不滤波32. TIM_ICInit(TIM4, &TIM_ICInitStructure);33. TIM_ICInitStructure.TIM_Channel = TIM_Channel_4 ;/| TIM_Channel_2; /输入通道34. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
55、160;/捕捉上升沿35. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /捕捉中断36. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /捕捉不分频37. TIM_ICInitStructure.TIM_ICFilter = 0x0; /捕捉输入不滤波38.
56、0; TIM_ICInit(TIM4, &TIM_ICInitStructure);39. /* TIM enable counter */40. TIM_Cmd(TIM4, ENABLE);41. /* Enable the CC2 Interrupt Request */42. TIM_ITConfig(TIM4, 43. TIM_IT_CC1, ENABLE);44. TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE
57、);45. TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);46. TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);复制代码其中:TIM_TimeBaseStructure.TIM_Period = 0xffff;为自动重装值,与普通单片机一样TIM_TimeBaseStructure.TIM_Prescaler = 719; 预分频值, 使TIMx_CLK=100KHz ,系统时钟运行于72M时720分频,定时器运行于100KHZ,即10us每分度TIM_ICInitStructure.TIM_IC
58、Mode = TIM_ICMode_ICAP; 此句选择定时器为输入捕获模式,但在我的库函数下未定义,所以注释掉,未影响程序执行TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;配置通道1TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;上升沿捕获TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;捕获中断TIM_ICInitStructure.TIM_ICFilter = 0x0;不滤波TIM_ICInit
59、(TIM4, &TIM_ICInitStructure);将配置应用以上每个通道都需要将整个配置再写一遍,使用与'|'是无效的。TIM_Cmd(TIM4, ENABLE);使能定时器4 TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE); TIM_ITConfig(TIM4, TIM_IT_CC4,
60、ENABLE);打开四个通道的捕获中断以上将TIM配置完成,下面是中断内代码:1. void 2. TIM4_IRQHandler(void) /频率缓冲区计数 3. static u16 this_time_CH1 = 0; 4. static u16 5. last_time_CH1 = 0; 6. static u8 capture_number_CH1 = 0;7. vu16 8. tmp16_CH1;9. static u16 this_
61、time_CH2 = 0; 10. static u16 last_time_CH2 = 0; 11. static u8 capture_number_CH2 = 0;12. vu16 tmp16_CH2;13. static u16 this_time_CH3 = 0; 14. static u16 last_time_CH3 = 0; 15. static u8 capture_number_CH3 = 0;16. vu16 tmp16_CH3;17. static u16 this_time_CH4 = 0; 18. static u1
62、6 last_time_CH4 = 0; 19. static u8 capture_number_CH4 = 0;20. vu16 tmp16_CH4;21. if(TIM_GetITStatus(TIM4, TIM_IT_CC1) = SET) 22. TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); 23. if(capture_number_CH1 = 0)
63、60; 24. capture_number_CH1 = 1; 25. last_time_CH1 = TIM_GetCapture1(TIM4); 26. else if(capture_number_CH1 = 1)
64、 27. capture_number_CH1 = 0; 28. this_time_CH1 = TIM_GetCapture1(TIM4); 29. if(this_time_CH1 > last_time_CH1)
65、; 30. tmp16_CH1 = (this_time_CH1 - last_time_CH1); else 31. tmp16_CH1 = (0xFFFF - last_time_CH1) + this_time_CH1); /TIM2
66、32. counter clock = 1MHz 33. FreqBufcnt = (1000000L * 100) / 34. tmp16; 35. /*100为扩大显示量程 36. Freq_Value0=tmp16_CH1; 37. if(TIM_GetITStatus(TIM4, TIM_IT_CC2) = SET) &
67、#160;38. TIM_ClearITPendingBit(TIM4, TIM_IT_CC2); 39. if(capture_number_CH2 = 0) 40. capture_number_CH2 = 1;41. last_time_CH2 = TIM_GetCapture2(TIM4); 42. else if(capture_number_CH2 = 1)
68、;43. capture_number_CH2 = 0; 44. this_time_CH2 = TIM_GetCapture2(TIM4); 45. if(this_time_CH2 > last_time_CH2 46. tmp16_CH2 = (this_time_CH2 - last_time_CH2); else 47. tmp16_CH2 = (0xFFFF - last_time_CH2) + this_time_CH2); /TIM2 48. count
69、er clock = 1MHz 49. FreqBufcnt = (1000000L * 100) / 50. tmp16; 51. /*100为扩大显示量程 52. Freq_Value1=tmp16_CH2; 53. if(TIM_GetITStatus(TIM4, TIM_IT_CC3) = SET) 54. TIM_ClearITPendingBi
70、t(TIM4, TIM_IT_CC3); 55. if(capture_number_CH3 = 0) 56. capture_number_CH3 = 1; 57. last_time_CH3 = TIM_GetCapture3(TIM4); 58. else if(capture_number_CH3 = 1)59. capture_number_CH3 = 0;60. this_time
71、_CH3 = TIM_GetCapture3(TIM4); 61. if(this_time_CH3 > last_time_CH3) 62. tmp16_CH3 = (this_time_CH3 - last_time_CH3); else 63. tmp16_CH3 = (0xFFFF - last_time_CH3) + this_time_CH3); /TIM2 64. counter clock = 1MHz
72、/ 65. FreqBufcnt = (1000000L * 100) / 66. tmp16; 67. /*100为扩大显示量程 68. Freq_Value2=tmp16_CH3; 69. 70. if(TIM_GetITStatus(TIM4, TIM_IT_CC4) = SET)
73、 71. 72. TIM_ClearITPendingBit(TIM4, TIM_IT_CC4); 73. if(capture_number_CH4 = 0) 74. capture_number_CH4 = 1; 75. last_time_CH4 = TIM_GetCapture4(TIM4); 76. else if(capture_number_CH4 = 1) 77. capture_number_CH4 = 0; 78. this_time_CH4 = TIM_GetCaptu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 圆周接力课件教学课件
- 2024乙丙双方关于智能家居系统安装与维护的合同
- 2024保险合同保险标的及属性规定
- 2024年司机配驾汽车租赁合同标准版
- 2024年度工程建设项目融资担保合同
- 2024年居住区绿化托管协议
- 2024年广告制作委托合同
- 2024年展览厅知识产权保护合同
- 2024国有土地使用权合同解释国有土地使用权收购合同
- 2024年度汽车销售业绩奖励合同
- 皮带通廊及皮带机施工方案
- 龙湖物业岗位说明书
- 标识标牌安装施工设计方案
- 蓝天救援队队员风险告知书
- 《工程勘察设计收费管理规定》计价格2002-10号文
- 宿舍消防疏散图
- 站场明敷接地扁钢安装技术要求
- 《个人防护用品PPE》ppt课件
- 国际贸易SimTrade外贸实习报告
- 导师带徒实施办法6、30
- 《Fishing with Grandpa》RAZ分级阅读绘本pdf资源
评论
0/150
提交评论