微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32在定时器中控制步进电机

STM32在定时器中控制步进电机

时间:11-21 来源:互联网 点击:
写WEB程序的时候,发现如果加上步进电机控制的话,就会出现问题。原因是如果把电机控制放在uip循环中处理的话,因为控制电机涉及到时间问题。所以必须解决,想到的方法就是多任务的思想。把步进电机的处理放在定时器中断里面。这样的话就能避免问题了。顺便学习了库函数操作定时器。这里用到的定时器功能简单,只需要产生更新中断。

下面是定时器初始化代码

  1. //定时器3初始化
  2. //arr:定时重装值
  3. //psc:分频值
  4. voidTIM3_Init(uint16_tarr,uint16_tpsc)
  5. {
  6. TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
  7. NVIC_InitTypeDefNVIC_InitStructure;
  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3时钟
  9. //定时器3配置,重载值、分频值、分频系数、计数模
  10. TIM_TimeBaseStructure.TIM_Period=arr;
  11. TIM_TimeBaseStructure.TIM_Prescaler=psc;
  12. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_div1;
  13. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  14. TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  15. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许定时更新中断
  16. //中断配置
  17. NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  18. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  19. NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
  20. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  21. NVIC_Init(&NVIC_InitStructure);
  22. TIM_Cmd(TIM3,ENABLE);//使能定时器3
  23. }

定时器中断处理函数

  1. voidTIM3_IRQHandler(void)
  2. {
  3. staticuint8_ti;//相序计数器
  4. if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
  5. {
  6. TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  7. Motorcw(i);//电机正转
  8. i++;
  9. if(i==4)
  10. i=0;
  11. }
  12. }

电机正传代码函数

  1. voidMotorcw(uint8_ti)
  2. {
  3. GPIO_Write(GPIOC,phasecw[i]);
  4. }

这样的话就不能干扰到uip的正常事件处理了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top