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

STM32F103控制两个步进电机按照一定转速比运动的更多相关文章

  1. iOS不得姐项目--推荐关注模块(一个控制器控制两个tableView),数据重复请求的问题,分页数据的加载,上拉下拉刷新(MJRefresh)

    一.推荐关注模块(一个控制器控制两个tableView) -- 数据的显示 刚开始加载数据值得注意的有以下几点 导航控制器会自动调整scrollView的contentInset,最好是取消系统的设置 ...

  2. Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个

    (function ($) { $.messageBox = function (message) { $.messager.show({ title:'消息框提示', msg:message, sh ...

  3. css控制两个表格的边线重合

    控制两个表格的边线重合 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  4. Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互

    我有个简单的应用需求: 1. 该应用随时会监听键盘的输入: 2. 当输入指定键时会控制相机录制的启动和关闭. 监听键盘是一个事件循环,相机录制也是一个循环录制的过程.我试着用 Python 启动两个进 ...

  5. stm32电机控制之控制两路直流电机

    小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下: 由以上框图可知,STM32通过定时器模块输出PWM波来控制两个直流电机的转动 ...

  6. stm32电机控制之控制两路直流电机!看完你会了吗

    手头上有一个差分驱动的小车,使用两个直流电机驱动,要实现小车的在给定速度下运动,完成直线行驶,转向,加速,刹车等复杂运动. 使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制, ...

  7. 使用STM32控制TMC5160驱动步进电机

    首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...

  8. linux驱动初探之杂项设备(控制两个GPIO口)

    关键字:linux驱动.杂项设备.GPIO 此驱动程序控制了外接的两个二极管,二极管是低电平有效. 上一篇博客中已经介绍了linux驱动程序的编写流程,这篇博客算是前一篇的提高篇,也是下一篇博客(JN ...

  9. 一个鼠标键盘控制两台甚至多台主机的方法--Synergy

    在多台主机,不同系统中操作.避免了更换键鼠的麻烦.即使下面图中的功能. 鼠标同时在三台或者多台主机之间进行移动,而且是无缝滑动,鼠标直接从左滑倒右,而且支持,这台电脑复制,另一台黏贴.非常的方便实用. ...

随机推荐

  1. Service、Alarm与BroadcastReceiver的使用方法

    1:定义一个服务类,在服务类中使用AlarmManager 来管理服务的运行 public class WtacService extends Service{ private AlarmManage ...

  2. Qt 自定义事件详细实例(继承QEvent,然后QCoreApplication::postEvent()、sendEvent())

    创建用户事件 创建一个自定义类型的事件,首先需要有一个事件号,其值通常大于QEvent::User.为了传递事件信息,因此必须编写自定义的事件类,该事件类从QEvent继承. 编写用户事件:编写用户事 ...

  3. 遇到的Fragment中使用setAdapter()设置ListView报空指针解决方案

    场景是这样,底部4个tab导航栏.用的fragment. 但其中一个fragmentActivity1中使用ListVIew的setAdapter()方法时,总是报NullPointerExcepti ...

  4. python每次处理一个字符的三种方法

    python每次处理一个字符的三种方法 a_string = "abccdea" print 'the first' for c in a_string: print ord(c) ...

  5. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  6. C语言的本质(32)——C语言与汇编之C语言内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  7. k-d Tree in TripAdvisor

    Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...

  8. 【LeetCode练习题】Unique Paths II

    Unique Paths II Follow up for "Unique Paths": Now consider if some obstacles are added to ...

  9. PHP 文件打开/读取

    PHP Open File - fopen() 打开文件的更好的方法是通过 fopen() 函数.此函数为您提供比 readfile() 函数更多的选项. 在课程中,我们将使用文本文件 "w ...

  10. Ice_cream's world I

    Ice_cream's world I Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...