OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4238|回复: 3

关于步进电机的PWM驱动问题?没有输出?请用过的帮忙看看啦

[复制链接]

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
发表于 2016-1-21 17:47:34 | 显示全部楼层 |阅读模式
之前是用的延时驱动步进电机,但是要求我的电机转的慢,所以整个延时导致对我的程序影响大,现在想换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);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
 楼主| 发表于 2016-1-22 19:25:58 | 显示全部楼层
新写的步进电机驱动,用一个定时器,但是为什么程序不能只能在第一相序,原子哥能帮忙看看么?等急用,感谢[img][/img]
回复 支持 反对

使用道具 举报

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
 楼主| 发表于 2016-1-22 19:26:56 | 显示全部楼层

//LED IO初始化
void MOTOR_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB端口时钟
       
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;                                 //6,7,8,9 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);                                                 

}


//定时TIM4中断  用于驱动步进电机
void TIM4_IRQHandler(void)   //TIM4中断
{
        static u16 SYS_TIME4=0;  //定时器驱动最小位

        printf("SYS_TIME4=%d\n",SYS_TIME4);
       
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否
                {               
                        SYS_TIME4++;
                        if(0<=SYS_TIME4<N)
                        {
                                Coil_A1
                                printf("yes_time4-1\n");
                        }
                        else if(N<=SYS_TIME4<2*N)
                        {
                                Coil_AB1
                                printf("yes_time4-2\n");
                        }  
                        else if(2*N<=SYS_TIME4<3*N)            
                        {
                                Coil_B1
                                printf("yes_time4-3\n");
                        }      
                        else if(3*N<=SYS_TIME4<4*N)
                        {
                                Coil_BC1
                                printf("yes_time4-4\n");
                        }
                        else if(4*N<=SYS_TIME4<5*N)
                        {
                                Coil_C1
                                printf("yes_time4-5\n");
                        }      
                        else if(5*N<=SYS_TIME4<6*N)
                        {
                                Coil_CD1
                                printf("yes_time4-6\n");
                        }
                        else if(6*N<=SYS_TIME4<7*N)
                        {
                                Coil_D1
                                printf("yes_time4-7\n");
                        }      
                        else if(7*N<=SYS_TIME4<8*N)
                        {
                                Coil_DA1
                                printf("yes_time4-8\n");
                        }
                        else if(SYS_TIME4>=8*N)  //
                        {
                                SYS_TIME4=0;
                                printf("yes_time4-END\n");
                                //TIM_Cmd(TIM4,DISABLE);  //使能TIMx外设 关定时器
                        }
                        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
                }               
}




//通用定时器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外设
                                                         
}
回复 支持 反对

使用道具 举报

5

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2015-12-26
在线时间
54 小时
发表于 2016-1-23 09:48:01 | 显示全部楼层
示波器看了吗,有波没。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 13:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表