新手入门
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2015-10-23
- 在线时间
- 2 小时
|
10金钱
完整代码请下载附件。
问题描述:
在stm32f10x_it.c中有这样一段程序(如下TIM1的中断服务函数),意思就是根据各通道比较值发生中断,然后在中断服务函数里调用电机驱动程序。如:MotorXDriveInTimer();
[mw_shl_code=c,true]void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
//100us
//GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
//LED_FLASH(1000);
capture = TIM_GetCapture1(TIM1);
TIM_SetCompare1(TIM1, capture + TIM1CCR1_Val);
}
else if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);
/* Pin PC.07 toggling with frequency = 109.8 Hz */
//GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));
capture = TIM_GetCapture2(TIM1);
TIM_SetCompare2(TIM1, capture + TIM1CCR2_Val);
}
else if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC3);
//X-------------------------------------------------
MotorXDriveInTimer(); //IN 10us/140us
//LED_FLASH(1);
capture = TIM_GetCapture3(TIM1);
TIM_SetCompare3(TIM1, capture + TIM1CCR3_Val);
}
else
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);
//Y-------------------------------------------------
MotorYDriveInTimer();
capture = TIM_GetCapture4(TIM1);
TIM_SetCompare4(TIM1, capture + TIM1CCR4_Val);
}
}[/mw_shl_code]
在MotorXDriveInTimer(); 中有三个函数,如下。
[mw_shl_code=c,true]void MotorXDriveInTimer(void)
{
Motor1PointerControl();
Motor1DynamicPostionGap();
Motor1PostionControlSpeed();
}[/mw_shl_code]
在第一个函数Motor1PointerControl();中有一个用TIM2的四个通道输出PWM波的定义,不知道这四个通道是干嘛的?求指教。程序如下:
[mw_shl_code=c,true]static void Motor1PointerControl(void) //100us*32 == 3.2ms LOOP in Time0
{
static u16 iStop = 0;
//----------------------------------------------------------------------DmxFinedataUser
if ((Motor1_postion_Current == Motor1_postion_user)&&(!MotorXSpeedPos))//&&(DmxFinedataUser==CounterFinedataCurrent))
{
Motor1_user_postion_gap = 0;
Motor1_dynamic_postion_gap = 0;
LineFlag = 2;//YES; //1 ¼óËù 0 ¼õËù 2 ÔèËù (í£Ö1)
//StopFlag = 1;
//------------------------------------------------------------
if (iStop > 100) //655us/2*500
{
TIM2->CCR1 = (SinData[MotorPositionPointer])>>2;
TIM2->CCR2 = (CyclePWM-SinData[MotorPositionPointer])>>2;
TIM2->CCR3 = (CosData[MotorPositionPointer])>>2;
TIM2->CCR4 = (CyclePWM-CosData[MotorPositionPointer])>>2;
//LED_FLASH(1);
}
else
{
iStop++;
}
//----------------STOP AND AUTO TURN BACK---------------------
//Motor1_StopAutoBACK();
//------------------------------------------------------------
}
else //---(Motor1_postion_Current != Motor1_postion_user)---
{
//Motor1_Arrive_Flag = 0; //μç»úí£Ö1 óû§é趨λÖÃÎ′μ½′ï ±ê¼Ç
//------------------------------------------------------------
iStop = 0;
//StopFlag = 0;
TIM2->CCR1 = SinData[MotorPositionPointer];
TIM2->CCR2 = CyclePWM-SinData[MotorPositionPointer];
TIM2->CCR3 = CosData[MotorPositionPointer];
TIM2->CCR4 = CyclePWM-CosData[MotorPositionPointer];
//---------Õy·′×a¿ØÖÆ-----------------------------------------
if (Motor1_dir == 1) //óû§óû¿ØÖÆ·½Ïò ÎaÕyÏòê±
Motor1_dir_Current = 1;
else //óû§óû¿ØÖÆ·½Ïò Îa·′Ïòê±
Motor1_dir_Current = 0;
//------------------------------------------------------------
if (Motor1_dir_Current == YES) //¿ØÖÆ2½½øμç»ú ÕyÏòDy×a
{
//2»¼óÔòí£Ö1×a¶ˉ Ëø¶¨×′ì¬
MotorPositionPointer += 8;
CounterMotorXStepPostionCurrent += 1;
//--------------------------------------------------
if (MotorPositionPointer >= 512) MotorPositionPointer = 0;
}
else //¿ØÖÆ2½½øμç»ú ·′ÏòDy×a
{
MotorPositionPointer -= 8;
CounterMotorXStepPostionCurrent -= 1;
//--------------------------------------------------
if (MotorPositionPointer <= 0) MotorPositionPointer = 512;
}
}
//---------------------------------------------------------------------------------------------------------------
Motor1_postion_Current = CounterMotorXStepPostionCurrent;
//μ±Ç°×′ì¬Õì2a 2¢′æèë×′쬼Ä′æÆ÷ ′æèëμ±Ç°×′ì¬
//---------------------------------------------------------------------------------------------------------------
}[/mw_shl_code]
代码较多,附件会上传完整工程文件,本人是学生,在自学STM32控制三轴步进电机,现在很迷惑,纠结了很久了,还望大神指点一下。
具体问题我再描述一下:
1. 我没看到有引脚复用的定义,请问控制步进电机的脉冲输出在哪里?应该是TIM1输出脉冲控制电机吧,但是输出到哪里了呢?
2. TIM2的四个通道输出PWM波是干嘛的?为什么要四个通道输出?
这个程序也是在本论坛里下载的,但是我看的不是太懂,可能大神们觉得简单,但是作为新人学起来还是有点吃力,虚心求教,望大神指教!
感谢原子哥的open平台!
|
|