找回密码
 立即注册
楼主: 梁工

51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序

  [复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-8-21 14:19:47 | 显示全部楼层
梁*** 发表于 2024-8-21 11:44
1.8度有抖动是正常的,步进电机低速、步进角大时是间歇动作,所以抖动。
细分,就是将1.8度一步分成更多 ...

非常清楚,感谢梁工,现在遇到这样的问题,输给驱动芯片的四路脉冲均为127hz,但是经过驱动芯片后到MOS管上波形的频率差异就大了,有500hz、有300hz、有200hz的请问这是什么问题呢?

点评

上示波器波形图。  详情 回复 发表于 2024-8-21 14:31
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-8-21 14:31:31 | 显示全部楼层
huatl*** 发表于 2024-8-21 14:19
非常清楚,感谢梁工,现在遇到这样的问题,输给驱动芯片的四路脉冲均为127hz,但是经过驱动芯片后到MOS管 ...

上示波器波形图,显示驱动信号、电机端信号。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-8-21 16:05:53 | 显示全部楼层
梁*** 发表于 2024-8-21 14:31
上示波器波形图,显示驱动信号、电机端信号。

#include "STC8Hxxx.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
#define     MAIN_Fosc       24000000L   //定义主时钟

/*************  功能说明    **************
程序使用
AIN1-P1.1
AIN2-P1.2
BIN1-P1.5
BIN2-P3.4
驱动步进电机
******************************************/
//typedef     unsigned char   u8;
//typedef     unsigned int    u16;
//typedef     unsigned long   u32;

sbit A1F = P1^1;
sbit A2F = P1^2;
sbit B1F = P1^5;
sbit B2F = P3^4;
sbit SLEEP = P1^4;
sbit DECAY = P1^0;
sbit up = P3^2;
sbit down = P3^3;
sbit slow_down = P3^5;


sbit nFAULT = P1^3;

#define Coil_A1F {A1F=1;A2F=0;B1F=0;B2F=0;}//A相通电,其他相断电
#define Coil_A2F {A1F=0;A2F=1;B1F=0;B2F=0;}//B相通电,其他相断电
#define Coil_B1F {A1F=0;A2F=0;B1F=1;B2F=0;}//C相通电,其他相断电
#define Coil_B2F {A1F=0;A2F=0;B1F=0;B2F=1;}//D相通电,其他相断电
#define Coil_OFF {A1F=0;A2F=0;B1F=0;B2F=0;}//全部断电

unsigned int Step;
unsigned int Speed;

//delay_ms(unsigned char ms);
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-3-9
// 备注:
//========================================================================
void delay_ms(unsigned int ms)
{
     unsigned int i;
     do{
          i = MAIN_Fosc / 10000;
          while(--i);   //10T per loop
     }while(--ms);
//                {while(ms--);}
}
/******************** 驱动函数 **************************/
void Driver()
{
        if(Step == 4) Step = 0;
        switch(Step)
        {
                case 0:         A1F = 1;A2F = 0;B1F = 0;B2F = 0; break;
                case 1:         A1F = 0;A2F = 0;B1F = 1;B2F = 0; break;
                case 2:         A1F = 0;A2F = 1;B1F = 0;B2F = 0; break;
                case 3:         A1F = 0;A2F = 0;B1F = 0;B2F = 1; break;
        }
        Step++;
}
/******************** 主函数 **************************/
void main(void)
{
    int i  = 0;
        P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能

    P1M1 = 0x00;   
        P1M0 = 0xff;   //设置P1推挽输出
    P3M1 = 0x2c;                                           //           0 0 1 0 1 1 0 0
        P3M0 = 0xd3;   //设置P3推挽输出和高阻输入           1 1 0 1 0 0 1 1
       
        Speed=20; //调整速度        1900-                 2000 2200 2400 较快 有抖动2500较慢
        DECAY = 0;
//        nFAULT = 0;
        SLEEP = 1;
        while(1)  
        {         
                if(up == 0)
                {
                        if(up == 1)
                        {
                                for(i=0;i<50;i++)
                                {
                                        Driver();
                                        delay_ms(Speed);
                                }       
                        }       
                }
        }
}

其中P3.2 P3.3 P3.5为按键开关,想实现按下up键,电机转90度,但是实际怎么一直实现不了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-8-21 16:22:00 | 显示全部楼层
梁*** 发表于 2024-8-21 14:31
上示波器波形图,显示驱动信号、电机端信号。

图片如下

驱动的四路脉冲输入

驱动的四路脉冲输入

电机A+端

电机A+端

电机A-端

电机A-端

电机B+端

电机B+端

电机B-端

电机B-端

点评

我要看两个通道同时显示的波形,通道1(通步通道)为MCU驱动信号,通道2为电机端信号,没有同步显示我看不出来的。  详情 回复 发表于 2024-8-21 16:48
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-8-21 16:48:03 | 显示全部楼层

我要看两个通道同时显示的波形,通道1(通步通道)为MCU驱动信号,通道2为电机端信号,没有同步显示我看不出来的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-8-27 10:42:38 | 显示全部楼层
梁*** 发表于 2024-8-21 16:48
我要看两个通道同时显示的波形,通道1(通步通道)为MCU驱动信号,通道2为电机端信号,没有同步显示我看 ...

#include "STC8Hxxx.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
#define     MAIN_Fosc       24000000L   //定义主时钟

/*************  功能说明    **************
程序使用
AIN1-P1.1
AIN2-P1.2
BIN1-P1.5
BIN2-P3.4
驱动步进电机
******************************************/
//typedef     unsigned char   u8;
//typedef     unsigned int    u16;
//typedef     unsigned long   u32;

sbit A1F = P1^1;
sbit A2F = P1^2;
sbit B1F = P1^5;
sbit B2F = P3^4;
sbit SLEEP = P1^4;
sbit DECAY = P1^0;
sbit up = P3^2;
sbit down = P3^3;
sbit slow_down = P3^5;


sbit nFAULT = P1^3;

#define Coil_A1F {A1F=1;A2F=0;B1F=0;B2F=0;}//A相通电,其他相断电
#define Coil_A2F {A1F=0;A2F=1;B1F=0;B2F=0;}//B相通电,其他相断电
#define Coil_B1F {A1F=0;A2F=0;B1F=1;B2F=0;}//C相通电,其他相断电
#define Coil_B2F {A1F=0;A2F=0;B1F=0;B2F=1;}//D相通电,其他相断电
#define Coil_OFF {A1F=0;A2F=0;B1F=0;B2F=0;}//全部断电

unsigned int Step;
unsigned int Speed;

//delay_ms(unsigned char ms);
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-3-9
// 备注:
//========================================================================
void delay_ms(unsigned int ms)
{
     unsigned int i;
     do{
          i = MAIN_Fosc / 10000;
          while(--i);   //10T per loop
     }while(--ms);
//                {while(ms--);}
}
/******************** 驱动函数 **************************/
void Driver()
{
        if(Step == 4) Step = 0;
        switch(Step)
        {
                case 0:         A1F = 1;A2F = 0;B1F = 0;B2F = 0; break;
                case 1:         A1F = 0;A2F = 0;B1F = 1;B2F = 0; break;
                case 2:         A1F = 0;A2F = 1;B1F = 0;B2F = 0; break;
                case 3:         A1F = 0;A2F = 0;B1F = 0;B2F = 1; break;
        }
        Step++;
}
/******************** 主函数 **************************/
void main(void)
{
    int i  = 0;
        P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能

    P1M1 = 0x00;   
        P1M0 = 0xff;   //设置P1推挽输出
    P3M1 = 0x2c;                                           //           0 0 1 0 1 1 0 0
        P3M0 = 0xd3;   //设置P3推挽输出和高阻输入           1 1 0 1 0 0 1 1
      
        Speed=20; //调整速度        1900-                 2000 2200 2400 较快 有抖动2500较慢
        DECAY = 0;
//        nFAULT = 0;
        SLEEP = 1;
        while(1)  
        {         
                if(up == 0)
                {
                        if(up == 1)
                        {
                                for(i=0;i<50;i++)
                                {
                                        Driver();
                                        delay_ms(Speed);
                                }      
                        }      
                }
        }
}

其中P3.2 P3.3 P3.5为按键开关,想实现按下up键,电机转90度,但是实际怎么一直实现不了,不是一个脉冲1.8度吗。我这里发了循环50次,不是应该转90度吗

点评

那你实际转了多少度?有细分的话,还要乘以细分数。  详情 回复 发表于 2024-8-27 12:06
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-8-27 12:06:26 | 显示全部楼层
huatl*** 发表于 2024-8-27 10:42
#include "STC8Hxxx.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
#define     MAIN_Fosc    ...

那你实际转了多少度?有细分的话,还要乘以细分数。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-8-27 15:20:35 | 显示全部楼层
梁*** 发表于 2024-8-27 12:06
那你实际转了多少度?有细分的话,还要乘以细分数。

抖一下,等我把i改大,转的角度也大了,i改4000多就90度左右
for(i=0;i<50;i++)
{
        Driver();
         delay_ms(Speed);
}

点评

一般的两相步进电机是200步360度,即步角度为1.8度。如果无细分,则50步就是90度。如果是2细分,就要100步,4细分就要200步,8细分就要400步。  详情 回复 发表于 2024-8-27 15:43
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-8-27 15:43:10 | 显示全部楼层
huatl*** 发表于 2024-8-27 15:20
抖一下,等我把i改大,转的角度也大了,i改4000多就90度左右
for(i=0;i

一般的两相步进电机是200步360度,即步角度为1.8度。如果无细分,则50步就是90度。如果是2细分,就要100步,4细分就要200步,8细分就要400步。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-8-27 15:46:02 | 显示全部楼层
梁*** 发表于 2024-8-27 15:43
一般的两相步进电机是200步360度,即步角度为1.8度。如果无细分,则50步就是90度。如果是2细分,就要100 ...

我没有细分吧,就是上面的程序
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:36 , Processed in 0.342742 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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