初级会员

- 积分
- 103
- 金钱
- 103
- 注册时间
- 2015-11-28
- 在线时间
- 30 小时
|
这代码控制步进电机,设置的好好地,但是步进电机只慢速动五下,不知道为什么、求告知。我设置的明明是以600r/min的速度转,然后发送3200个脉冲转一定距离啊,尝试好几天了,不知道是代码错了还是步进电机有点问题
#include "bujin.h"
#include "led.h"
/****************************
**TIM2μÄí¨μà1ê1óÃμÄμ¥Âö3åÄ£ê½
**TIM1ê1óÃÃÅ¿ØÄ£ê½à′êä3ö WM
**
****************************/
//TIM2per:֨װÖμ
//Compare1:±è½Ï2¶»ñ1μÄÔ¤Ïè×°ÔØÖμ
void Motor_Init(u16 TIM2per, u16 TIM1per, u16 TIM1Compare1)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//ê1Äü¶¨ê±Æ÷2μÄê±Öó
RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//ê1Äü¶¨ê±Æ÷1μÄê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ê1ÄüGPIOAê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ê1Äü¸′óÃIOê±Öó
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//¸′óÃíÆíìêä3ö
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;//1ü½ÅéèÖÃÎaPA0
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//TIM21¤×÷Ôúμ¥Âö3åÄ£ê½ÏÂ
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//ûóDê±Öó·Ö¸î
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//ÏòéϼÆêyÄ£ê½
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200;//Ô¤·ÖÆμÖμ£¬Ã¿100us¼Æêyò»′Î
TIM_TimeBaseInitStruct.TIM_Period = TIM2per;//֨װÖμ
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
//TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!zhuyi !!!!!!!!!!!!11!!!!!
TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Repetitive);//éèÖÃTIM2Ôúμ¥Âö3åÄ£ê½Ï£¬ÇòÎaμ¥ò»Âö3壬ÔúÏÂò»ê¼t¸üDÂê±í£Ö1
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//ê1ÄüTIM2μÄí¨μà1Ô¤×°ÔØ¼Ä′æÆ÷
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref);
//TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single)£»
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//ÏòéϼÆêy£¬ò»μ©TIMx_CNT<TIMx_CCR1í¨μà1ÎaÎTD§μçÆ½£¬·ñÔòÎaóDD§μçÆ½
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1êä3öê1Äü
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//óDD§μçÆ½Îa¸ß
TIM_OCInitStruct.TIM_Pulse = 1;//±è½Ï2¶»ñ1μÄÔ¤×°ÔØÖμ
TIM_OC1Init(TIM2,&TIM_OCInitStruct);
TIM_Cmd(TIM2,DISABLE);//Ïè2»ê1ÄüTIM2
//TIM11¤×÷Ôú′óÄ£ê½ÏÂμÄ WMêä3öÄ£ê½
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//ûóDêÇê±Öó·Ö¸î
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//ÏòéϼÆêy
TIM_TimeBaseInitStruct.TIM_Prescaler = 720;//Ô¤·ÖÆμÖμ,10us¼Æêyò»′Î
TIM_TimeBaseInitStruct.TIM_Period = TIM1per;//֨װÖμ
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//TIM1ÎaÃÅ¿ØÄ£ê½
TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);//ê1ÄüTIM1Ö÷′óÄ£ê½
TIM_SelectInputTrigger(TIM1,TIM_TS_ITR1);//Äú2¿′¥·¢£¬′óTIM2′¥·¢
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//ÏòéϼÆêyò»μ©TIMx_CNT<TIMx_CCR1í¨μàÎTD§
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1êä3öê1Äü
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//óDD§¸ßμçÆ½
TIM_OCInitStruct.TIM_Pulse = TIM1Compare1;//±è½Ï2¶»ñ1μÄ×°ÔØÖμ
TIM_OC1Init(TIM1,&TIM_OCInitStruct);
TIM_Cmd(TIM1,ENABLE);//ê1ÄüTIM1
}
//éèÖà WMμÄêä3ö
//Cycle:ÎaÖüÆú£¬μ¥λus
//Pulse_Num:ÎaÂö3å¸öêy£¨D¡óú3200)
void TIM1_TIM2_PWM(u16 Cycle, u16 Pulse_Num)
{
u16 TIM1per = 0;
u32 Time = 0;
//¸Ä±äTIM1μÄ֨װÖμ¾í¸Ä±äáËÂö3åμÄÆμÂ꣬ÕaàïéèÖÃÕ¼¿Õ±èÎa50%
//¸Ä±äTIM2μÄÔ¤·ÖÆμÖμoí֨װÖμ¾í¸Ä±äáËÂö3åμĸöêy
Time = Cycle * Pulse_Num;
Time /= 100; //Ô¤·ÖÆμÎa7200,100us¼Æêyò»′Î
TIM1per = Cycle/10; //Ô¤·ÖÆμÎa720,10us¼Æêyò»′Î
TIM_SetAutoreload(TIM2, Time+1);//éèÖÃTIM2֨װÖμ
TIM_SetAutoreload(TIM1, TIM1per-1);//éèÖÃTIM1μÄ֨װÖμ
TIM_SetCompare1(TIM1,TIM1per/2);//éèÖÃÕ¼¿Õ±èÎa50%
TIM_Cmd(TIM2,ENABLE);//ê1ÄüTIM2
}
int main(void)
{
SystemInit();
delay_init(72); //Ñóê±3õê¼»ˉ
NVIC_Configuration();
//TIM_CtrlPWMOutputs(TIM1, ENABLE);
Motor_Init(10,5,2);
TIM1_TIM2_PWM(500,3200);
while(1)
{
delay_us(100);
}}
|
|