野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28586|回复: 5

关于STM32的电机驱动的一些疑问,求教

[复制链接]
回帖奖励 10 火花 回复本帖可获得 10 火花奖励! 每人限 1 次(中奖概率 10%)
发表于 2021-2-6 18:49:13 | 显示全部楼层 |阅读模式
材料:STM32是最小核心系统版,ULN2003加28Y的五线步进电机
目的:while循环和步进电机互不干扰彼此进程。就是电机无论反转正转都影响不了while循环

初次实验:电机驱动函数放进while循环测试电机运行,实验成功。加入按键,在外部中断服务函数加入电机驱动函数。出现每次按下按键必须等电机转完一圈才能执行while循环。

尝试解决:加入定时器,我把驱动函数放入定时器中断服务函数,程序直接卡死。后来发现因为设定的是1秒(9999,7199),一秒中断一下执行电机驱动,电机转完都三四秒,一直在启动启动。

                   之后我发现驱动函数用了delay_us,我就尝试把delay用定时器替换,电机可以运转,但替换后发现还是不行,每次要等电机转完才执行while。
                           
               我又查了查定时器时间设定,改成5秒,放入中断服务函数,好像又不行(我都记不清了,脑子一团浆糊)。又发现,其实定时器一直在不断计数,每到中断就执行。
               我想要的是,我让电机工作就工作,到条件自动开启和手动开启,其它时间就关闭。
                我又把定时器时钟先暂时关闭,等我要用再让它使能。
                           
                            又是白忙活
              我也是最近才学习stm32,实在没辙了,或许以上的办法有纰漏(其实是可行的,但我才疏学浅未完全搞懂),不知道这里有没有能人大佬指点一波,人多力量大,想i想办法怎么实现这个按键控制电机的同时和while循环不冲突。
              或者大家有什么类似的项目源码给我参考一下,哪怕只告诉我一下函数结构。



回复

使用道具 举报

 楼主| 发表于 2021-2-6 18:54:25 | 显示全部楼层
这是电机驱动代码
  1. void motor_control_F(int n)//反转
  2. {
  3.                         IN1_HIGH;
  4.                         Delay_us(n);
  5.                         IN4_LOW;
  6.                         Delay_us(n);
  7.                         IN3_HIGH;
  8.                         Delay_us(n);
  9.                         IN1_LOW;
  10.                         Delay_us(n);
  11.                         IN3_HIGH;
  12.                         Delay_us(n);
  13.                         IN2_LOW;
  14.                         Delay_us(n);
  15.                         IN4_HIGH;
  16.                         Delay_us(n);
  17.                         IN3_LOW;
  18.                         Delay_us(n);
  19. }

  20. void Motor_Ctrl_Off(void){
  21.         GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
  22. }

  23. void Motor_Ctrl_Angle_FAN(int angle,int n){
  24.         u16 j;
  25.         for(j=0;j<64*angle/45;j++)
  26.         {
  27.                 motor_control_F(n);
  28.         }
  29. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-6 18:57:05 | 显示全部楼层
这是TIM3中断服务函数,我不知道吧TIM3_OFF()写进这里有没有问题,反正是试了没用
  1. void TIM3_IRQHandler(void)   //TIM3中断
  2. {
  3.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
  4.                 {
  5.                         TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
  6. //                        if(OnOff)//如果OnOff = 1 就启动电机
  7. //                        {
  8. //                                LED1=!LED1;
  9. //                                motor_configuration();
  10. //                                Motor_Ctrl_Angle_FAN(360,1000);//电机反转,关闭窗帘
  11. //                                Motor_Ctrl_Off();
  12. //                          TIM3_OFF();
  13. //                        }
  14. //                        else
  15. //                        {
  16. //                                LED1=1;
  17. //                                Motor_Ctrl_Angle_FAN(360,2100);//电机反转,关闭窗帘
  18. //                        }
  19.                 }
  20. }

  21. //开启定时器6
  22. void TIM3_ON()
  23. {
  24.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  25. }

  26. //关闭定时器6
  27. void TIM3_OFF()
  28. {
  29.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,DISABLE);
  30. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-6 18:58:06 | 显示全部楼层
147852369 发表于 2021-2-6 18:54
这是电机驱动代码

这里的Delay是定时器2替换的
回复 支持 反对

使用道具 举报

发表于 2021-2-7 15:33:00 | 显示全部楼层
你的电机驱动函数不要放到中断里面,中断需要尽快执行完毕

电机驱动函数还是放到while循环里,用if判断一个自定义的全局标志位来控制电机,中断检测到按键按下,标志位就为1,否则为0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 15:35:16 | 显示全部楼层
问题已解决,把持续电平触发放进中断服务函数里。(听说pwm驱动更好,但本人水平有限未完全掌握)
  1. void TIM3_IRQHandler(void)
  2. {
  3.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
  4.         {
  5.                 TIM3_count++;
  6.                 if(TIM3_count>7)
  7.                 {
  8.                         TIM3_count=0;
  9.                 }
  10.                 if(TIM3_count==0)
  11.                 {
  12.                         IN1_LOW;
  13.                         IN2_LOW;
  14.                         IN3_LOW;
  15.                         IN4_HIGH;

  16.                 }
  17.                 else if(TIM3_count==1)
  18.                 {
  19.                         IN1_LOW;
  20.                         IN2_LOW;
  21.                         IN3_HIGH;
  22.                         IN4_HIGH;

  23.                 }
  24.                 else if(TIM3_count==2)
  25.                 {
  26.                         IN1_LOW;
  27.                         IN2_LOW;
  28.                         IN3_HIGH;
  29.                         IN4_LOW;

  30.                 }
  31.                 else if(TIM3_count==3)
  32.                 {
  33.                         IN1_LOW;
  34.                         IN2_HIGH;
  35.                         IN3_HIGH;
  36.                         IN4_LOW;

  37.                 }
  38.                 else if(TIM3_count==4)
  39.                 {
  40.                         IN1_LOW;
  41.                         IN2_HIGH;
  42.                         IN3_LOW;
  43.                         IN4_LOW;;

  44.                 }
  45.                 else if(TIM3_count==5)
  46.                 {
  47.                         IN1_HIGH;
  48.                         IN2_HIGH;
  49.                         IN3_LOW;
  50.                         IN4_LOW;

  51.                 }
  52.                 else if(TIM3_count==6)
  53.                 {
  54.                         IN1_HIGH;
  55.                         IN2_LOW;
  56.                         IN3_LOW;
  57.                         IN4_LOW;

  58.                 }
  59.                 else if(TIM3_count==7)
  60.                 {
  61.                         IN1_HIGH;
  62.                         IN2_LOW;
  63.                         IN3_LOW;
  64.                         IN4_HIGH;

  65.                 }
  66.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
  67.         }
  68. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 00:30 , Processed in 0.028883 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表