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年电子设计竞赛的同学有所帮助,谢谢
STM32F103控制两个步进电机按照一定转速比运动的更多相关文章
- iOS不得姐项目--推荐关注模块(一个控制器控制两个tableView),数据重复请求的问题,分页数据的加载,上拉下拉刷新(MJRefresh)
一.推荐关注模块(一个控制器控制两个tableView) -- 数据的显示 刚开始加载数据值得注意的有以下几点 导航控制器会自动调整scrollView的contentInset,最好是取消系统的设置 ...
- Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个
(function ($) { $.messageBox = function (message) { $.messager.show({ title:'消息框提示', msg:message, sh ...
- css控制两个表格的边线重合
控制两个表格的边线重合 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互
我有个简单的应用需求: 1. 该应用随时会监听键盘的输入: 2. 当输入指定键时会控制相机录制的启动和关闭. 监听键盘是一个事件循环,相机录制也是一个循环录制的过程.我试着用 Python 启动两个进 ...
- stm32电机控制之控制两路直流电机
小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下: 由以上框图可知,STM32通过定时器模块输出PWM波来控制两个直流电机的转动 ...
- stm32电机控制之控制两路直流电机!看完你会了吗
手头上有一个差分驱动的小车,使用两个直流电机驱动,要实现小车的在给定速度下运动,完成直线行驶,转向,加速,刹车等复杂运动. 使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制, ...
- 使用STM32控制TMC5160驱动步进电机
首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...
- linux驱动初探之杂项设备(控制两个GPIO口)
关键字:linux驱动.杂项设备.GPIO 此驱动程序控制了外接的两个二极管,二极管是低电平有效. 上一篇博客中已经介绍了linux驱动程序的编写流程,这篇博客算是前一篇的提高篇,也是下一篇博客(JN ...
- 一个鼠标键盘控制两台甚至多台主机的方法--Synergy
在多台主机,不同系统中操作.避免了更换键鼠的麻烦.即使下面图中的功能. 鼠标同时在三台或者多台主机之间进行移动,而且是无缝滑动,鼠标直接从左滑倒右,而且支持,这台电脑复制,另一台黏贴.非常的方便实用. ...
随机推荐
- 老了,问题定位难了,xml编码解析
同样一个程序,在A机器好用,在B机器不好用,怀疑过jdk版本位数问题,怀疑过其他. 最后,突然发现出错的全是xml中文,想到是不是编码问题,一看环境变量果真一个gbk,一个utf-8,再一看 程序,没 ...
- android fragment传递参数_fragment之间传值的两种方法
在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...
- Android原型界面设计工具
第 1 页:原型界面制作工具Lumzy 第 2 页:在线工具Mockingbird 第 3 页:开源UI工具The Pencil Project 第 4 页:JS开发工具包Dojo 第 5 ...
- Bring Your Charts to Life with HTML5 Canvas and JavaScript
Bring Your Charts to Life with HTML5 Canvas and JavaScript Bring Your Charts to Life with HTML5 Canv ...
- Redis 3.0集群 Window搭建方案
Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...
- python 性能优化
1.优化循环 循环之外能做的事不要放在循环内,比如下面的优化可以快一倍 2.使用join合并迭代器中的字符串 join对于累加的方式,有大约5倍的提升 3.使用if is 使用if is True比i ...
- Oracle游标动态赋值
1. oracle游标动态赋值的小例子 -- 实现1:动态给游标赋值 -- 实现2:游标用表的rowtype声明,但数据却只配置表一行的某些字段时,遍历游标时需fetch into到精确字段 CREA ...
- hibernate Restrictions用法
QBC常用限定方法 Restrictions.eq --> equal,等于. Restrictions.allEq --> 参数为Map对象,使用key/value进行多个等于的比对,相 ...
- Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8372924 在前面一篇文章中,我们分析了And ...
- Android开发最佳学习路线图
为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们 ...