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年电子设计竞赛的同学有所帮助,谢谢