当前位置:首页 > 芯闻号 > 充电吧
[导读]       这个暑假没有回家,在学校准备九月份的电子设计竞赛。今天想给大家分享一下STM32定时器控制两个步进电机按照一定速度比转动的问题。       这次做的05年的电子设计竞赛题目,运动悬挂系

       这个暑假没有回家,在学校准备九月份的电子设计竞赛。今天想给大家分享一下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年电子设计竞赛的同学有所帮助,谢谢

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

一直以来,步进电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来步进电机的相关介绍,详细内容请看下文。

关键字: 电机 步进电机

伺服电机是一种能够精确控制位置、速度和加速度的电动机。它通过内置的反馈系统,能够根据控制信号实时调整输出力矩和转速,从而实现精确的运动控制。伺服电机广泛应用于机械制造、自动化设备、机器人等领域。

关键字: 伺服电机 步进电机

反应式步进电机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对反应式步进电机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 电机 步进电机 反应式步进电机

一直以来,电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来电机的相关介绍,详细内容请看下文。

关键字: 电机 感应电机 步进电机

伺服电机和步进电机在控制精度、低频特性、矩频特性、过载能力、编码器类型等方面存在显著差异。

关键字: 伺服电机 步进电机 编码器

直流减速电机是一种常见的电机类型,它由直流电机和减速器组成。这种电机通常具有较大的启动转矩和较低的转速,适用于需要大扭矩和低转速的场合。直流减速电机的结构包括电机本体、减速器、输出轴和外壳。其中,电机本体是驱动力源,通过...

关键字: 直流减速电机 步进电机

步进电机控制器是一种用于控制步进电机运行状态的设备。步进电机是一种将电脉冲信号转换为角位移的电机,每个脉冲信号都会使电机转动一个固定的角度。步进电机控制器通过控制电机的转速和转向,实现对电机运行状态的精确控制。

关键字: 步进电机 电机控制

控制器是指按照预定顺序改变主电路或控制电路的接线和改变电路中电阻值来控制电动机的启动、调速、制动和反向的主令装置。它由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成,是发布命令的“决策机构”,即协调和指挥...

关键字: 控制器 步进电机

电动机是一种将电能转换为机械能的设备,它利用通电线圈(也就是定子绕组)产生旋转磁场并作用于转子(如鼠笼式闭合铝框)形成磁电动力旋转扭矩。电动机主要由定子与转子组成,通电导线在磁场中受力运动的方向跟电流方向和磁感线(磁场方...

关键字: 步进电机 普通电机

步进电机是一种将电脉冲转化为角位移的执行机构。通俗来说,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过...

关键字: 步进电机 控制脉冲
关闭
关闭