梁工
发表于 2025-7-19 15:53:30
明月清风 发表于 2025-7-19 10:37
直接驱动硬件怎么接?接驱动器怎么接?是否有图示,刚入门,还不太清楚
直接驱动硬件怎么接?
答:请参考电路。PWM通过4个半桥驱动步进电机的量相线圈。
接驱动器怎么接?
答:单片机输出脉冲频率条转速,控制脉冲数控制转角。
如果没看明白,那就先了解一下步进电机吧,如果一点基础都没有,就很难看明白。
晚风
发表于 2025-8-5 22:25:44
梁工你好,这个程序“匹配翻转输出脉冲控制步进电机驱动器-STC8H-PWMA输出”中,脉冲输出是低电平有效的,现要改成高电平输出是不是在下面这几处修改就可以了,
1.PWMA_CCER1 |= 0x07; // 开启比较输出, 低电平有效---------》改成高电平有效
2.
if(P_M1_PULSE) //产生了完整的一个脉冲 ---------》改成 if(P_M1_PULSE==0)
{
if(M1_PulseCnt != 0) // 脉冲数未完成
{
if(--M1_PulseCnt == 0) //若 脉冲数-1 == 0
{
B_M1_RunEn = 0; // 关停电机
P_M1_DIR = 1; // 转向光耦关闭
PWMA_CCMR1 = 0; //禁止取反输出脉冲
}
}
if(M1_DownCnt != 0) // 减速脉冲未完
{
if(--M1_DownCnt == 0) f1_set = 200; //设置目标频率, 开始减速
}
}
}
elseP_M1_PULSE = 1; //---------》改成 P_M1_PULSE =0;
Wddz
发表于 2025-8-6 08:21:48
晚风 发表于 2025-8-5 22:25
梁工你好,这个程序“匹配翻转输出脉冲控制步进电机驱动器-STC8H-PWMA输出”中,脉冲输出是低电平有效的, ...
刷 上测一下不就知道了吗
晚风
发表于 2025-8-6 09:50:05
用肯定是能用的,不知道准不准
梁工
发表于 2025-8-6 23:15:14
晚风 发表于 2025-8-6 09:50
用肯定是能用的,不知道准不准
要更准确就用外部晶振,数字外设,准确度跟时钟一致。
晚风
发表于 2025-8-7 10:23:42
PWMA_CCER1设置了各种值都不理想,发5个脉冲测试,两次的输出脉冲不同,后面带有一个几US的高电平,
梁工
发表于 2025-8-7 11:05:47
晚风 发表于 2025-8-5 22:25
梁工你好,这个程序“匹配翻转输出脉冲控制步进电机驱动器-STC8H-PWMA输出”中,脉冲输出是低电平有效的, ...
程序开头初始化我原来是输出1,你要改成输出0。
晚风
发表于 2025-8-7 11:14:39
初始化和PWM中断处都改了
晚风
发表于 2025-8-7 11:17:21
#define EN_LEVEL 1 // 定义驱动脉冲有效电平,0为低电平有效驱动,1为高电平有效驱动
B_M1_RunEn = 0; //停止运行
P_M1_DIR = 1; // 运行方向, 接步进电机驱动器方向输入端(一般是光耦输入, 低有效), 1:顺时针(正转), 0:逆时针(反转)
P_M1_PULSE = ~EN_LEVEL; // 驱动脉冲, 低驱动, 接步进电机驱动器脉冲输入端(一般是光耦输入, 低有效).
P1n_push_pull(0x03); // P1.0 P1.1设置为推挽输出
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
u8 sr1;
// u8 sr2;
sr1 = PWMA_SR1; //为了快速, 中断标志用一个局部变量处理
PWMA_SR1 = 0; //清除中断标志
// sr2 = PWMA_SR2; //为了快速, 中断标志用一个局部变量处理
PWMA_SR2 = 0; //清除中断标志
sr1 &= PWMA_ISR_En; //每个通道可以单独允许中断处理
if(sr1 & 0x02) //通道1中断标志
{
if(B_M1_RunEn) //电机运行中
{
if(B_f1_update) //刷新频率值
{
B_f1_update = 0;
f1_period = f1_period_set;
}
CCAP1_tmp += f1_period;
PWMA_CCR1= CCAP1_tmp; // 计数器比较值, 匹配时刻
if(P_M1_PULSE==~EN_LEVEL) //产生了完整的一个脉冲
{
if(M1_PulseCnt != 0) // 脉冲数未完成
{
if(--M1_PulseCnt == 0) //若 脉冲数-1 == 0
{
B_M1_RunEn = 0; // 关停电机
P_M1_DIR = 1; // 转向光耦关闭
PWMA_CCMR1 = 0; //禁止取反输出脉冲
P17=0;
}
}
if(M1_DownCnt != 0) // 减速脉冲未完
{
if(--M1_DownCnt == 0) f1_set = 200; //设置目标频率, 开始减速
}
}
}
elseP_M1_PULSE = ~EN_LEVEL;
}
/*
if(sr1 & 0x04) //通道2中断标志
{
CCAP2_tmp += f2_period;
PWMA_CCR2= CCAP2_tmp; // 计数器比较值, 匹配时刻
}
if(sr1 & 0x08) //通道3中断标志
{
CCAP3_tmp += f3_period;
PWMA_CCR3= CCAP3_tmp; // 计数器比较值, 匹配时刻
}
if(sr1 & 0x10) //通道4中断标志
{
CCAP4_tmp += f4_period;
PWMA_CCR4= CCAP4_tmp; // 计数器比较值, 匹配时刻
}
*/
}
P1n_push_pull(1<<7); // P17设置为推挽输出
晚风
发表于 2025-8-7 11:19:49
改后程序