梁工 发表于 2024-8-19 18:15:13

huatlwangl 发表于 2024-8-19 16:15
STC8H1K08 TSSOP20中我绘制的电路板中4路PWM用的P1.1、P1.2、P1.5、P3.4,那我需要怎么来修改呢 ...

那你程序要改为PWMA,P1.1(PWM1N)、P1.2(PWM2P)、P1.5(PWM3N)、P3.4(PWM4P)。

huatlwangl 发表于 2024-8-20 15:42:47

梁工 发表于 2024-8-19 18:15
那你程序要改为PWMA,P1.1(PWM1N)、P1.2(PWM2P)、P1.5(PWM3N)、P3.4(PWM4P)。 ...

梁工,有效果了,但是我现在步进电机只响不动

梁工 发表于 2024-8-20 15:59:40

huatlwangl 发表于 2024-8-20 15:42
梁工,有效果了,但是我现在步进电机只响不动

步进电机是很容易驱动的。电机响?你的PWM频率多少?超过20KHz不会有响声。输出SPWM变化就能拖动电机。

huatlwangl 发表于 2024-8-21 10:09:10

梁工 发表于 2024-8-20 15:59
步进电机是很容易驱动的。电机响?你的PWM频率多少?超过20KHz不会有响声。输出SPWM变化就能拖动电机。 ...

我自己尝试写的,没用PWM,先用的IO 对2相 A+A- B+ B-分别置高电平循环 驱动电机

梁工 发表于 2024-8-21 10:43:08

huatlwangl 发表于 2024-8-21 10:09
我自己尝试写的,没用PWM,先用的IO 对2相 A+A- B+ B-分别置高电平循环 驱动电机 ...

那要控制好速度,电机启动时速度比较低(因为有惯性)。你这是无细分的驱动,一般电机是200脉冲一圈,用400Hz以下的速度给脉冲试试,很好驱动的。

huatlwangl 发表于 2024-8-21 11:10:40

梁工 发表于 2024-8-21 10:43
那要控制好速度,电机启动时速度比较低(因为有惯性)。你这是无细分的驱动,一般电机是200脉冲一圈,用4 ...

谢谢梁工,转动起来了,400Hz以下爱,但是仍然感觉电机有轻微抖动和噪音。还有我不太明白细分是什么意思,步进电机不是一个脉冲就1.8度吗?
我这个项目是需要步进电机按键或者遥控控制转动90度,45度,-90度。
所以我理解的是否不需细分,直接50个脉冲转动90度。
麻烦梁工指导

梁工 发表于 2024-8-21 11:44:15

huatlwangl 发表于 2024-8-21 11:10
谢谢梁工,转动起来了,400Hz以下爱,但是仍然感觉电机有轻微抖动和噪音。还有我不太明白细分是什么意思 ...

1.8度有抖动是正常的,步进电机低速、步进角大时是间歇动作,所以抖动。
细分,就是将1.8度一步分成更多步,比如分成8步,则每步就是0.225度,步进角更精细,抖动感就会弱很多了。就比如爬楼梯,15cm一级,明显的步伐波动,假设变成1cm一级,那步伐波动就小了,假设变成1mm,那基本就是连续的斜坡了(对应的就是用模拟、连续的正弦波、余弦波驱动步进电机了)。
将矢量分解成sin值和cos值,转为PWM,加到电枢上,就能做到细分,而力矩依旧不变(因为sqrt(sinA*sinA+cosA*cosA)=1)。

不是是否解释清楚?

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度,但是实际怎么一直实现不了
页: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14
查看完整版本: 51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序