梁工
发表于 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