77范文网 - 专业文章范例文档资料分享平台

编码器学习STM32(2)

来源:网络收集 时间:2018-12-29 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.

53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.

/*中断分组初始化*/

NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; /*TIM5中断*/

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; /*先占优先级2级*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /*从优先级0级*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/ NVIC_Init(&NVIC_InitStructure);

TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/*允许更新中断 ,允许CC1IE捕获中断*/ TIM_Cmd(TIM5,ENABLE); /*使能定时器5*/ }

u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 /**

* 定时器5中断服务程序 */

void TIM5_IRQHandler(void) {

if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获 {

if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET) {

if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了 {

if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 {

TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }else TIM5CH1_CAPTURE_STA++; } }

if(TIM_GetITStatus(TIM5,TIM_IT_CC1) !=RESET) {

if(TIM5CH1_CAPTURE_STA & 0x40) {

TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿 TIM5CH1_CAPTURE_VAL = TIM_GetCounter(TIM5);

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 } else

80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92.

{

TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0;

TIM_SetCounter(TIM5,0);

TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } } }

TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update); /*清除中断标志位*/ }

点击(此处)折叠或打开 1.

2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.

extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 int main(void) {

u32 temp=0;

delay_init(); //延时函数初始化

NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化

TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 while(1) {

delay_ms(10);

if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 {

temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=65536;//溢出时间总和

temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间 printf(\打印总的高点平时间 TIM5CH1_CAPTURE_STA=0;//开启下一次捕获 } } }

以下笔记始发于观海听涛,原创人Apache,转载请说明

输入捕获作为定时器的一个功能,在工业测速上有很大的应用。STM32的一些定时器具有四个外部通道,可利用一个定时器采集外部四路脉冲频率,节约硬件资源和软件代码

extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态

如需要测量一个或多个外部方波脉冲频率,频率低于单片机运行频率,可如下操作:(以TIM4为例)

初始化:(省略GPIO配置,将TIM4的四个通道引脚配置为上拉或浮空输入,省略定时器RCC配置,省略中断NVIC配置)

1. void TIM_Configuration(void){ 2. TIM_ICInitTypeDef 3. TIM_ICInitStructure; 4. TIM_TimeBaseInitTypeDef

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_ClockDivision = 9. TIM_CKD_DIV1; //输入时钟不分频

10. TIM_TimeBaseStructure.TIM_CounterMode = 11. TIM_CounterMode_Up; //向上计数

12. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //TIM4_TimeBase

13. // TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //输入捕捉方式 14. TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//| 15. TIM_Channel_2; //输入通道

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_ICInitStructure.TIM_ICFilter = 0x0; //捕捉输入不滤波 20. TIM_ICInit(TIM4, &TIM_ICInitStructure);

21. TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;//| TIM_Channel_2; //输入通道 22. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //捕捉上升沿 23. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //捕捉中断 24. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //捕捉不分频 25. TIM_ICInitStructure.TIM_ICFilter = 0x0; //捕捉输入不滤波 26. TIM_ICInit(TIM4, &TIM_ICInitStructure);

27. TIM_ICInitStructure.TIM_Channel = TIM_Channel_3 ;//| TIM_Channel_2; //输入通道 28. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //捕捉上升沿 29. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //捕捉中断

30. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //捕捉不分频 31. TIM_ICInitStructure.TIM_ICFilter = 0x0; //捕捉输入不滤波 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; //捕捉上升沿 35. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //捕捉中断 36. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //捕捉不分频 37. TIM_ICInitStructure.TIM_ICFilter = 0x0; //捕捉输入不滤波 38. 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); 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_ICMode = TIM_ICMode_ICAP; 此句选择定时器为输入捕获模式,但在我的库函数下未定义,所以注释掉,未影响程序执行

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;配置通道1 TIM_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);使能定时器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, 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_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 u16 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) { 24. capture_number_CH1 = 1; 25. last_time_CH1 = TIM_GetCapture1(TIM4); }

26. else if(capture_number_CH1 == 1) 27. capture_number_CH1 = 0;

28. this_time_CH1 = TIM_GetCapture1(TIM4); 29. if(this_time_CH1 > last_time_CH1) {

30. tmp16_CH1 = (this_time_CH1 - last_time_CH1); } else { 31. tmp16_CH1 = ((0xFFFF - last_time_CH1) + this_time_CH1); } //TIM2 32. counter clock = 1MHz

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库编码器学习STM32(2)在线全文阅读。

编码器学习STM32(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/400673.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: