1输入捕获作为定时器的一个功能.docx_第1页
1输入捕获作为定时器的一个功能.docx_第2页
1输入捕获作为定时器的一个功能.docx_第3页
1输入捕获作为定时器的一个功能.docx_第4页
1输入捕获作为定时器的一个功能.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

输入捕获作为定时器的一个功能,在工业测速上有很大的应用。STM32的一些定时器具有四个外部通道,可利用一个定时器采集外部四路脉冲频率,节约硬件资源和软件代码如需要测量一个或多个外部方波脉冲频率,频率低于单片机运行频率,可如下操作:(以TIM4为例)初始化:(省略GPIO配置,将TIM4的四个通道引脚配置为上拉或浮空输入,省略定时器RCC配置,省略中断NVIC配置)1.2. void TIM_Configuration(void)3. 4. 5. TIM_ICInitTypeDef6. TIM_ICInitStructure;7. TIM_TimeBaseInitTypeDef8. TIM_TimeBaseStructure; / TIM4 时基9. 10. TIM_DeInit(TIM4);11. TIM_TimeBaseStructure.TIM_Period =12. 0xffff; 13. /自动重装值14. TIM_TimeBaseStructure.TIM_Prescaler =15. 719; 16. /预分频值, 使TIMx_CLK=100K=10us17. 18. TIM_TimeBaseStructure.TIM_ClockDivision =19. TIM_CKD_DIV1; 20. /输入时钟不分频21. TIM_TimeBaseStructure.TIM_CounterMode =22. TIM_CounterMode_Up; 23. /向上计数24. TIM_TimeBaseInit(TIM4,25. &TIM_TimeBaseStructure);26. 27. /TIM4_TimeBase28. /TIM_ICInitStructure.TIM_ICMode =29. TIM_ICMode_ICAP; 30. /输入捕捉方式31. TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;/|32. TIM_Channel_2; /输入通道33. 34. TIM_ICInitStructure.TIM_ICPolarity =35. TIM_ICPolarity_Rising; /捕捉上升沿36. 37. TIM_ICInitStructure.TIM_ICSelection =38. TIM_ICSelection_DirectTI; /捕捉中断39. 40. TIM_ICInitStructure.TIM_ICPrescaler =41. TIM_ICPSC_DIV1; /捕捉不分频42. 43. TIM_ICInitStructure.TIM_ICFilter =44. 0x0; /捕捉输入不滤波45. TIM_ICInit(TIM4, &TIM_ICInitStructure);46. TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;/|47. TIM_Channel_2; /输入通道48. 49. TIM_ICInitStructure.TIM_ICPolarity =50. TIM_ICPolarity_Rising; /捕捉上升沿51. 52. TIM_ICInitStructure.TIM_ICSelection =53. TIM_ICSelection_DirectTI; /捕捉中断54. 55. TIM_ICInitStructure.TIM_ICPrescaler =56. TIM_ICPSC_DIV1; /捕捉不分频57. 58. TIM_ICInitStructure.TIM_ICFilter =59. 0x0; /捕捉输入不滤波60. TIM_ICInit(TIM4, &TIM_ICInitStructure);61. TIM_ICInitStructure.TIM_Channel = TIM_Channel_3 ;/|62. TIM_Channel_2; /输入通道63. 64. TIM_ICInitStructure.TIM_ICPolarity =65. TIM_ICPolarity_Rising; /捕捉上升沿66. 67. TIM_ICInitStructure.TIM_ICSelection =68. TIM_ICSelection_DirectTI; /捕捉中断69. 70. TIM_ICInitStructure.TIM_ICPrescaler =71. TIM_ICPSC_DIV1; /捕捉不分频72. 73. TIM_ICInitStructure.TIM_ICFilter =74. 0x0; /捕捉输入不滤波75. TIM_ICInit(TIM4, &TIM_ICInitStructure);76. TIM_ICInitStructure.TIM_Channel = TIM_Channel_4 ;/|77. TIM_Channel_2; /输入通道78. 79. TIM_ICInitStructure.TIM_ICPolarity =80. TIM_ICPolarity_Rising; /捕捉上升沿81. 82. TIM_ICInitStructure.TIM_ICSelection =83. TIM_ICSelection_DirectTI; /捕捉中断84. 85. TIM_ICInitStructure.TIM_ICPrescaler =86. TIM_ICPSC_DIV1; /捕捉不分频87. 88. TIM_ICInitStructure.TIM_ICFilter =89. 0x0; /捕捉输入不滤波90. TIM_ICInit(TIM4, &TIM_ICInitStructure);91. /* TIM enable counter */92. TIM_Cmd(TIM4, ENABLE);93. /* Enable the CC2 Interrupt Request */94. TIM_ITConfig(TIM4,95. TIM_IT_CC1, ENABLE);96. TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);97. 98. TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);99. TIM_ITConfig(TIM4, TIM_IT_CC4,100. ENABLE);101. 复制代码其中:TIM_TimeBaseStructure.TIM_Period = 0xffff;为自动重装值,与普通单片机一样TIM_TimeBaseStructure.TIM_Prescaler = 719; 预分频值, 使TIMx_CLK=100KHz ,系统时钟运行于72M时720分频,定时器运行于100KHZ,即10us每分度捕获一次TIM_ICInitStructure.TIM_ICMode = 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(TIM4, &TIM_ICInitStructure);将配置应用以上每个通道都需要将整个配置再写一遍,使用与|是无效的。TIM_Cmd(TIM4, ENABLE);使能定时器4TIM_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, ENABLE);打开四个通道的捕获中断以上将TIM配置完成,下面是中断内代码:1.2. void3. TIM4_IRQHandler(void)4. 5. 6. /频率缓冲区计数7. static u16 this_time_CH1 = 0;8. static u169. last_time_CH1 = 0;10. static u8 capture_number_CH1 = 0;11. vu1612. tmp16_CH1;13. static u16 this_time_CH2 = 0;14. static u16 last_time_CH2 = 0;15.16. static u8 capture_number_CH2 = 0;17. vu16 tmp16_CH2;18. static u16 this_time_CH3 = 0;19. static u16 last_time_CH3 = 0;20.21. static u8 capture_number_CH3 = 0;22. vu16 tmp16_CH3;23. static u16 this_time_CH4 = 0;24. static u16 last_time_CH4 = 0;25.26. static u8 capture_number_CH4 = 0;27. vu16 tmp16_CH4;28.29. if(TIM_GetITStatus(TIM4, TIM_IT_CC1) = SET)30.31. 32. 33. TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);34. if(capture_number_CH1 = 0)35.36. 37.38. 39. capture_number_CH1 = 1;40.41. 42. last_time_CH1 = TIM_GetCapture1(TIM4);43.44. 45.46. else if(capture_number_CH1 = 1)47.48. 49.50. 51. capture_number_CH1 = 0;52.53. 54. this_time_CH1 = TIM_GetCapture1(TIM4);55. 56. if(this_time_CH1 last_time_CH1)57.58. 59.60. 61. tmp16_CH1 = (this_time_CH1 - last_time_CH1);62.63. 64.65. else66.67. 68.69. 70. tmp16_CH1 = (0xFFFF - last_time_CH1) + this_time_CH1);71.72. 73. /TIM274. counter clock = 1MHz75.76. / 77. FreqBufcnt = (1000000L * 100) /78. tmp16; 79. /*100为扩大显示量程80. Freq_Value0=tmp16_CH1;81.82. 83. 84. if(TIM_GetITStatus(TIM4, TIM_IT_CC2) = SET)85.86. 87. 88. TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);89. if(capture_number_CH2 = 0)90.91. 92.93. 94. capture_number_CH2 = 1;95.96. 97. last_time_CH2 = TIM_GetCapture2(TIM4);98.99. 100.101. else if(capture_number_CH2 = 1)102.103. 104.105. 106. capture_number_CH2 = 0;107.108. 109. this_time_CH2 = TIM_GetCapture2(TIM4);110. 111. if(this_time_CH2 last_time_CH2)112.113. 114.115. 116. tmp16_CH2 = (this_time_CH2 - last_time_CH2);117.118. 119.120. else121.122. 123.124. 125. tmp16_CH2 = (0xFFFF - last_time_CH2) + this_time_CH2);126.127. 128. /TIM2129. counter clock = 1MHz130.131. / 132. FreqBufcnt = (1000000L * 100) /133. tmp16; 134. /*100为扩大显示量程135. Freq_Value1=tmp16_CH2;136.137. 138. 139. 140.141. if(TIM_GetITStatus(TIM4, TIM_IT_CC3) = SET)142.143. 144. 145. TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);146. if(capture_number_CH3 = 0)147.148. 149.150. 151. capture_number_CH3 = 1;152.153. 154. last_time_CH3 = TIM_GetCapture3(TIM4);155.156. 157.158. else if(capture_number_CH3 = 1)159.160. 161.162. 163. capture_number_CH3 = 0;164.165. 166. this_time_CH3 = TIM_GetCapture3(TIM4);167. 168. if(this_time_CH3 last_time_CH3)169.170. 171.172. 173. tmp16_CH3 = (this_time_CH3 - last_time_CH3);174.175. 176.177. else178.179. 180.181. 182. tmp16_CH3 = (0xFFFF - last_time_CH3) + this_time_CH3);183.184. 185. /TIM2186. counter clock = 1MHz187.188. / 189. FreqBufcnt = (1000000L * 100) /190. tmp16; 191. /*100为扩大显示量程192. Freq_Value2=tmp16_CH3;193.194. 195. 196.197.198. if(TIM_GetITStatus(TIM4, TIM_IT_CC4) = SET)199.200. 201. 202. TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);203. if(capture_number_CH4 = 0)204.205. 206.207. 208. capture_number_CH4 = 1;209.210. 211. last_time_CH4 = TIM_GetCapture4(TIM4);212.213. 214.215. else if(capture_number_CH4 = 1)216.217. 218.219. 220. capture_number_CH4 = 0;221.222. 223. this_time_CH4 = TIM_GetCapture4(TIM4);224. 225. if(this_time_CH4 last_time_CH4)226.227. 228.229. 230. tmp16_CH4 = (this_time_CH4 - last_time_CH4);231.232. 233.234. else235.236. 237.238. 239. tmp16_CH4 = (0xFFFF - last_time_CH4) + this_time_CH4);240.241. 242. /TIM2243. co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论