嵌入式 > 嵌入式开发 > 详情

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

发布时间:2024-03-26 发布时间:
|
写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的正常事件处理了。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
占先式内核(只带延时服务)