• STM32F103控制两个步进电机按照一定转速比运动


           这个暑假没有回家,在学校准备九月份的电子设计竞赛。今天想给大家分享一下STM32定时器控制两个步进电机按照一定速度比转动的问题。

           这次做的05年的电子设计竞赛题目,运动悬挂系统。。本实验是控制两个步进电机通过一个定滑轮用线挂一个重物,并使这个重物走直线。。

           首先对定时器进行配置。

       void TIM_Configuration(void)
      {
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


    TIM_DeInit(TIM3);
     TIM_TimeBaseStructure.TIM_Period =  8;  //中断时间为  T = ( TIM_Period + 1 )*( TIM_Prescaler + 1 )/TIMxCLK(72MHZ) =  10(-6) s
        TIM_TimeBaseStructure.TIM_Prescaler =  7;

        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
     
     TIM_ClearFlag( TIM3, TIM_FLAG_Update);
     TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE); 
     
    }

     

          然后写画直线的函数,思路如下,将起点和终点的坐标作为函数的传递参数。通过计算起点和终点到两个滑轮之间的距离差可以算出两个电机在这段时间转过的距离。。因为时间是相同的,所以令两个电机的速度比等于通过计算得到的距离比即可。。具体代码如下:

     

    void Draw_Line(float x1, float y1, float x2, float y2)      
    {
     float L1, L2;        //起始点到滑轮距离之差

     float sulv;         //两个电机转速比
     
     L1 = sqrt((x1 + 15)*(x1 + 15) + (115 - y1)*(115 - y1)) - sqrt((x2 + 15)*(x2 + 15) + (115 - y2)*(115 - y2));
     L2 = sqrt((95 - x1)*(95 - x1) + (115 - y1)*(115 - y1)) - sqrt((95 - x2)*(95 - x2) + (115 - y2)*(115 - y2));

     
     if(L1>0)         //控制电机正反转
      GPIO_SetBits(GPIOA,GPIO_Pin_6);
     else
      GPIO_ResetBits(GPIOA,GPIO_Pin_6);

     if(L2>0)
      GPIO_SetBits(GPIOA,GPIO_Pin_7);
     else
      GPIO_ResetBits(GPIOA,GPIO_Pin_7);
     
     L1 = fabs(L1);
     L2 = fabs(L2); 

     countL = L1/0.0006;       //计算出走完L1、L2所需脉冲数,,0.0006是通过几组数据计算出来的。。
     countR = L2/0.0006;      

     sulv = countL*170.0 /countR;   
     suduL = sulv;
     suduR = 170;        //算出两个电机发生电平翻转产生脉冲的时间比

     count = 0;
     countLR =0;
     
     TIM_Cmd(TIM3, ENABLE);    //定时器开始计时

    }

         中断服务程序中的内容是定时器到达两个电机规定的发生电平翻转的时间的倍数是翻转电平,产生脉冲驱动电机运动。

     

    void TIM3_IRQHandler(void)
    {

     if((countLR == (countL*2)))
      TIM_Cmd(TIM3, DISABLE);    //两个电机运动完成,,关定时器


     count++;                            //开始计时
     if( !(count % suduR) )
     { 
      if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)==0)
       GPIO_SetBits(GPIOA,GPIO_Pin_4);
      else
          GPIO_ResetBits(GPIOA,GPIO_Pin_4);

      countLR++;                     //记录电平翻转次数,即脉冲数的一半
     }
       
     if( !(count % suduL) )
     { 
      if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)==0)
       GPIO_SetBits(GPIOA,GPIO_Pin_5);
      else
          GPIO_ResetBits(GPIOA,GPIO_Pin_5);
     }
     

    /*防止定时器溢出*/
     if(count == suduL*suduR)
     { 
      count=0; 
     }                      

     
     TIM_ClearFlag(TIM3, TIM_FLAG_Update);         //一定不要忘记清除中断位
    }

         以上就是我想分享给大家的,,希望对正在积极备战2013年电子设计竞赛的同学有所帮助,谢谢

  • 相关阅读:
    mysql 数据库的简单操作 2
    mysql简单操作,增删查改.
    当mysq启动时出现错误1067时应如何解决
    JS中 逻辑或 || 逻辑与 && 的使用方法总结
    编写一段程序,运行时向用户提问“你考了多少分?(0~100)”,接受输入后判断其等级并显示出来。判断依据如下:等级={优 (90~100分);良 (80~89分);中 (60~69分);差 (0~59分);}
    IF的使用
    第一个输出程序 Console.WriteLine
    Day2_and_Day3 文件操作
    linux安装VLAN,系统怎么划分VLAN打标签上交换机
    Python3.5+selenium(11)脚本模块化&参数化
  • 原文地址:https://www.cnblogs.com/james1207/p/3285499.html
Copyright © 2020-2023  润新知