huatlwangl
发表于 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:31
huatlwangl 发表于 2024-8-21 14:19
非常清楚,感谢梁工,现在遇到这样的问题,输给驱动芯片的四路脉冲均为127hz,但是经过驱动芯片后到MOS管 ...
上示波器波形图,显示驱动信号、电机端信号。
huatlwangl
发表于 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度,但是实际怎么一直实现不了
huatlwangl
发表于 2024-8-21 16:22:00
梁工 发表于 2024-8-21 14:31
上示波器波形图,显示驱动信号、电机端信号。
图片如下
梁工
发表于 2024-8-21 16:48:03
huatlwangl 发表于 2024-8-21 16:22
图片如下
我要看两个通道同时显示的波形,通道1(通步通道)为MCU驱动信号,通道2为电机端信号,没有同步显示我看不出来的。
huatlwangl
发表于 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:26
huatlwangl 发表于 2024-8-27 10:42
#include "STC8Hxxx.h" //包含此头文件后,不需要再包含"reg51.h"头文件
#define MAIN_Fosc ...
那你实际转了多少度?有细分的话,还要乘以细分数。
huatlwangl
发表于 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);
}
梁工
发表于 2024-8-27 15:43:10
huatlwangl 发表于 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步。
huatlwangl
发表于 2024-8-27 15:46:02
梁工 发表于 2024-8-27 15:43
一般的两相步进电机是200步360度,即步角度为1.8度。如果无细分,则50步就是90度。如果是2细分,就要100 ...
我没有细分吧,就是上面的程序