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

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

 火.. [复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2026-01-28 10:43:59
已绑定手机

7

主题

9

回帖

91

积分

注册会员

积分
91
发表于 2025-12-2 09:31:55 | 显示全部楼层
这个有电路图吗?

点评

下载附件,解压缩,工程目录里有电路图。  详情 回复 发表于 2025-12-2 13:38
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-03-06 09:14:52

84

主题

7283

回帖

1万

积分

超级版主

积分
15618
发表于 2025-12-2 13:38:24 | 显示全部楼层
zzx*** 发表于 2025-12-2 09:31
这个有电路图吗?

下载附件,解压缩,工程目录里有电路图。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-12-27 15:48:59
已绑定手机

3

主题

13

回帖

49

积分

新手上路

积分
49
发表于 2025-12-26 12:24:34 | 显示全部楼层
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_CCR1H = (u8)(CCAP1_tmp>>8);        // 计数器比较值, 匹配时刻
                        PWMA_CCR1L = (u8)CCAP1_tmp;
                        if(P_M1_PULSE)        //产生了完整的一个脉冲
                        {
                                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;        //设置目标频率, 开始减速
                                }
                        }
                }
                else  P_M1_PULSE = 1;
        }
/*    梁工  这样一直加 不考虑溢出吗 或者临界点 CCAP1_tmp += f1_period;

点评

我使用16位计数器,溢出自然就丢弃了,不存在临界点问题。 使用十六进制描述就清楚了: 比如 CCAP1_tmp值为0xfffa(即四进制65530), f1_period为0x03e8(即十进制1000),则: CCAP1_tmp + f1_period = 0xfffa + 0x0  详情 回复 发表于 2025-12-26 15:50
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-03-06 09:14:52

84

主题

7283

回帖

1万

积分

超级版主

积分
15618
发表于 2025-12-26 15:50:59 | 显示全部楼层
tlbx*** 发表于 2025-12-26 12:24
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
        u8        sr1;

我使用16位计数器,溢出自然就丢弃了,不存在临界点问题。
使用十六进制描述就清楚了:
比如 CCAP1_tmp值为0xfffa(即四进制65530), f1_period为0x03e8(即十进制1000),则:
CCAP1_tmp + f1_period = 0xfffa + 0x03e8 = 0x103e2,由于变量CCAP1_tmp是16位的,所以
CCAP1_tmp += f1_period 会将0x103e2截断为0x03e2(十进制994)并放在CCAP1_tmp中,再传给CCR1。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-12-27 15:48:59
已绑定手机

3

主题

13

回帖

49

积分

新手上路

积分
49
发表于 2025-12-26 23:00:03 | 显示全部楼层
梁*** 发表于 2025-12-26 15:50
我使用16位计数器,溢出自然就丢弃了,不存在临界点问题。
使用十六进制描述就清楚了:
比如 CCAP1_tmp值 ...

明白了 谢谢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:373
  • 最近打卡:2026-03-05 08:50:49
已绑定手机

6

主题

331

回帖

1623

积分

金牌会员

积分
1623
发表于 2026-1-3 20:16:10 | 显示全部楼层
学习
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-6 18:17 , Processed in 0.123210 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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