编码器学习STM32(2)

2018-12-29 23:16

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


编码器学习STM32(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:县农业局XX年食品安全工作总结

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: