之前是用的延时驱动步进电机,但是要求我的电机转的慢,所以整个延时导致对我的程序影响大,现在想换
tiM4的pwm驱动步进电机,用以前驱动直流电机的改,但是不成功,请大神帮忙看看,或者分享一个DEMO,谢谢啦!!
==================================这是以前控制双电机的驱动=======================================
/**************************************************************
* Function : 控制双电机的方向,占空比,速度
* Description : 电机驱动控制程序(new)
* Input : motorL, motorR, left_motor1,left_motor2,right_motor1,right_motor2 (控制前进后退与方向,占空比)
* Output : None
* Return : None
* Others : left_motor1,left_motor2,right_motor1,right_motor2
代表控制电机的对应的pwm值(0~1000,也可以调档)
* Author : Draway
****************************************************************/
void CtrlMotor(Direction motorL,u16 left_motor1,u16 left_motor2,Direction motorR,u16 right_motor1,u16 right_motor2)
{
if(motorL==RUN_FORWARD)//左轮前进
{
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
}
else if(motorL==RUN_BACKWARD)//左轮后退
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
}
else if(motorL==STOP)//左轮停转
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
}
if(motorR==RUN_FORWARD)//右轮前进
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}
else if(motorR==RUN_BACKWARD)//右轮后退
{
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
}
else if(motorR==STOP) //右轮后退
{
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
}
TIM_SetCompare1(TIM4,left_motor1);
TIM_SetCompare2(TIM4,left_motor2);
TIM_SetCompare3(TIM4,right_motor1);
TIM_SetCompare4(TIM4,right_motor2);
}
================================这是我改的驱动步进电机驱动================================================
/**************************************************************
* Function : 控制步进电机的方向,占空比,速度
* Description : 电机驱动控制程序(new)
* Input : motorL, motorR, left_motor1,left_motor2,right_motor1,right_motor2 (控制前进后退与方向,占空比)
* Output : None
* Return : None
* Others : left_motor1,left_motor2,right_motor1,right_motor2
代表控制电机的对应的pwm值(0~1000,也可以调档)
* Author : Draway
* Date : 2016年1月21日
****************************************************************/
void CtrlMotor_BJ(Direction motor)
{
if(motor==RUN_FORWARD)//前进
{
Coil_A1
TIM_SetCompare1(TIM4,FAST_F);
TIM_SetCompare2(TIM4,END_F);
TIM_SetCompare3(TIM4,END_F);
TIM_SetCompare4(TIM4,END_F);
Coil_AB1
TIM_SetCompare1(TIM4,FAST_F);
TIM_SetCompare2(TIM4,FAST_F);
TIM_SetCompare3(TIM4,END_F);
TIM_SetCompare4(TIM4,END_F);
Coil_B1
TIM_SetCompare1(TIM4,END_F);
TIM_SetCompare2(TIM4,FAST_F);
TIM_SetCompare3(TIM4,END_F);
TIM_SetCompare4(TIM4,END_F);
Coil_BC1
TIM_SetCompare1(TIM4,END_F);
TIM_SetCompare2(TIM4,FAST_F);
TIM_SetCompare3(TIM4,FAST_F);
TIM_SetCompare4(TIM4,END_F);
Coil_C1
TIM_SetCompare1(TIM4,END_F);
TIM_SetCompare2(TIM4,END_F);
TIM_SetCompare3(TIM4,FAST_F);
TIM_SetCompare4(TIM4,END_F);
Coil_CD1
TIM_SetCompare1(TIM4,END_F);
TIM_SetCompare2(TIM4,END_F);
TIM_SetCompare3(TIM4,FAST_F);
TIM_SetCompare4(TIM4,FAST_F);
Coil_D1
TIM_SetCompare1(TIM4,END_F);
TIM_SetCompare2(TIM4,END_F);
TIM_SetCompare3(TIM4,END_F);
TIM_SetCompare4(TIM4,FAST_F);
Coil_DA1
TIM_SetCompare1(TIM4,FAST_F);
TIM_SetCompare2(TIM4,END_F);
TIM_SetCompare3(TIM4,END_F);
TIM_SetCompare4(TIM4,FAST_F);
// GPIO_SetBits(GPIOB,GPIO_Pin_6);
// GPIO_ResetBits(GPIOB,GPIO_Pin_7);
}
else if(motor==RUN_BACKWARD)//后退
{
Coil_A1
Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
Coil_D1
Coil_CD1
Coil_C1
Coil_BC1
Coil_B1
Coil_AB1
// GPIO_SetBits(GPIOB,GPIO_Pin_7);
// GPIO_ResetBits(GPIOB,GPIO_Pin_6);
}
else if(motor==STOP)//电机停转
{
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
TIM_SetCompare1(TIM4,END_F);
TIM_SetCompare2(TIM4,END_F);
TIM_SetCompare3(TIM4,END_F);
TIM_SetCompare4(TIM4,END_F);
}
// //尽量统一用库函数操作
// TIM_SetCompare1(TIM4,left_motor1);
// TIM_SetCompare2(TIM4,left_motor2);
// TIM_SetCompare3(TIM4,right_motor1);
// TIM_SetCompare4(TIM4,right_motor2);
}
///=====================/步进电机宏定义===============================
//#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
//#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
//#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
//#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
//#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
//#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
//#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
//#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
//#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
====================延时可以正常步进驱动电机程序=============================
//正转
void motor_go(u16 data)
{
Coil_A1
delay_motor(data); //延时参数
Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
delay_motor(data); //延时参数 //改变这个参数可以调整电机转速 ,
Coil_B1
delay_motor(data); //延时参数
Coil_BC1
delay_motor(data);
Coil_C1
delay_motor(data);
Coil_CD1
delay_motor(data);
Coil_D1
delay_motor(data);
Coil_DA1
delay_motor(data);
}
/通用定时器4中断初始化
void Timer4_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = 10; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到10000为1000ms (1s)
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig( //使能或者失能指定的TIM中断
TIM4, //TIM4
TIM_IT_Update | //TIM 中断源
TIM_IT_Trigger, //TIM 触发中断源
ENABLE //使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM4, ENABLE); //使能TIMx外设
}
//定时TIM4中断 用于驱动步进电机
void TIM4_IRQHandler(void) //TIM4中断
{
u16 SYS_TIME4=0; //定时器驱动最小位
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 这里用time4_flag代替了之前的条件(之前条件用宏定义)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
SYS_TIME4++;
if(0<=SYS_TIME4<N)
{ Coil_A1 printf("yes_time4-1 ");SYS_TIME4++;}
else if(N<=SYS_TIME4<2*N)
{Coil_AB1 SYS_TIME4++;printf("yes_time4-3 ");} //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
else if(2*N<=SYS_TIME4<3*N)
{ Coil_B1 printf("yes_time4-3 ");}
else if(3*N<=SYS_TIME4<4*N)
{ Coil_BC1}
else if(4*N<=SYS_TIME4<5*N)
{ Coil_C1 }
else if(5*N<=SYS_TIME4<6*N)
{ Coil_CD1}
else if(6*N<=SYS_TIME4<7*N)
{ Coil_D1}
else if(7*N<=SYS_TIME4<8*N)
{ Coil_DA1}
else if(SYS_TIME4>=8*N) //
{
SYS_TIME4=0;
printf("yes_time4 ");
//TIM_Cmd(TIM4,DISABLE); //使能TIMx外设 关定时器
}
}
}
一周热门 更多>