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

改后程序
页: 12 13 14 15 16 17 18 19 20 21 [22] 23
查看完整版本: 51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序