找回密码
 立即注册
楼主: 梁工

51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序

 火.. [复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-09-11 19:51:37

2

主题

44

回帖

238

积分

中级会员

积分
238
发表于 2025-8-6 09:50:05 | 显示全部楼层
用肯定是能用的,不知道准不准

点评

要更准确就用外部晶振,数字外设,准确度跟时钟一致。  详情 回复 发表于 2025-8-6 23:15
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-09-15 11:00:40

76

主题

6717

回帖

1万

积分

超级版主

积分
14125
发表于 2025-8-6 23:15:14 | 显示全部楼层
晚*** 发表于 2025-8-6 09:50
用肯定是能用的,不知道准不准

要更准确就用外部晶振,数字外设,准确度跟时钟一致。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-09-11 19:51:37

2

主题

44

回帖

238

积分

中级会员

积分
238
发表于 2025-8-7 10:23:42 | 显示全部楼层
PWMA_CCER1设置了各种值都不理想,发5个脉冲测试,两次的输出脉冲不同,后面带有一个几US的高电平,
1111.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-09-15 11:00:40

76

主题

6717

回帖

1万

积分

超级版主

积分
14125
发表于 2025-8-7 11:05:47 | 显示全部楼层
晚*** 发表于 2025-8-5 22:25
梁工你好,这个程序“匹配翻转输出脉冲控制步进电机驱动器-STC8H-PWMA输出”中,脉冲输出是低电平有效的, ...

程序开头初始化我原来是输出1,你要改成输出0。

截图202508071104577729.jpg

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-09-11 19:51:37

2

主题

44

回帖

238

积分

中级会员

积分
238
发表于 2025-8-7 11:14:39 | 显示全部楼层
初始化和PWM中断处都改了

点评

我测试了下,第一个脉冲的宽度改变,应该是时序同步或加减速计算造成。 你的波形后面会有一个短脉冲,我这里测试没看到,请使用数字示波器观察比较好。 下面我修改了程序,第一次中断不输出,在第一次中断里允许输  详情 回复 发表于 2025-8-7 13:57
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-09-11 19:51:37

2

主题

44

回帖

238

积分

中级会员

积分
238
发表于 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;        //设置目标频率, 开始减速
                                }
                        }
                }
                else  P_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设置为推挽输出
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-09-11 19:51:37

2

主题

44

回帖

238

积分

中级会员

积分
238
发表于 2025-8-7 11:19:49 | 显示全部楼层
改后程序

匹配翻转输出脉冲控制步进电机驱动器-STC8H-PWMA输出.rar

198.54 KB, 下载次数: 28

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-09-11 19:51:37

2

主题

44

回帖

238

积分

中级会员

积分
238
发表于 2025-8-7 11:41:19 | 显示全部楼层
上面波形问题已解决,不知道初始化时 PWMA_CCER1 |= 0x05;        配置为高电平对不对,不太理解,希望指正

点评

对的。去哪个采纳考上面223楼的程序例子。 #define PUlseMode 0 //脉冲有效电平选择:0: 高电平有效,1:低电平有效 PWMA_CCER1 |= 0x05+0x02*PUlseMode; // 开启比较输出, 低电平有效, +0x00:高电平有效, +0x02:  详情 回复 发表于 2025-8-7 14:00
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:586
  • 最近打卡:2025-09-15 08:23:14

9

主题

103

回帖

2434

积分

金牌会员

积分
2434
发表于 2025-8-7 12:19:20 | 显示全部楼层
历害,我都不会玩PWM,ADC这些
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-09-15 11:00:40

76

主题

6717

回帖

1万

积分

超级版主

积分
14125
发表于 2025-8-7 13:57:20 | 显示全部楼层
晚*** 发表于 2025-8-7 11:14
初始化和PWM中断处都改了

我测试了下,第一个脉冲的宽度改变,应该是时序同步或加减速计算造成。
你的波形后面会有一个短脉冲,我这里测试没看到,请使用数字示波器观察比较好。

下面我修改了程序,第一次中断不输出,在第一次中断里允许输出。
Step-Motor.c 为修改后的程序。
Step-Motor-无加减速.c 为去掉加减速的程序,按设置的频率输出。

24-PWMA-匹配翻转输出脉冲控制步进电机驱动器.rar (121.23 KB, 下载次数: 31)


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-16 07:35 , Processed in 0.133740 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表