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

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

 火.. [复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2026-05-08 15:00:58
已绑定手机

8

主题

9

回帖

96

积分

注册会员

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

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

4

主题

12

回帖

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
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 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
已绑定手机

4

主题

12

回帖

49

积分

新手上路

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

明白了 谢谢
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2026-05-11 21:59:50

0

主题

5

回帖

20

积分

新手上路

积分
20
发表于 2026-4-26 14:26:31 来自手机 | 显示全部楼层
点赞点赞点赞点赞
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-07 20:26:03
已绑定手机

0

主题

34

回帖

126

积分

注册会员

积分
126
发表于 2026-5-2 12:25:27 | 显示全部楼层
梁工,你好!
可以提供一下这8个例程的正弦表吗?找了一下好像没有,就是例程里面用到的正弦表EXCEL

点评

用EXCEL做个正弦波太简单,所以我没有附在程序里,我重新写一个给您。  详情 回复 发表于 2026-5-2 22:59
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 2026-5-2 22:59:49 | 显示全部楼层
dannyz*** 发表于 2026-5-2 12:25
梁工,你好!
可以提供一下这8个例程的正弦表吗?找了一下好像没有,就是例程里面用到的正弦表EXCEL ...

用EXCEL做个正弦波太简单,所以我没有附在程序里,我重新写一个给您。
正弦波表.xls (53.5 KB, 下载次数: 10)

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-07 20:26:03
已绑定手机

0

主题

34

回帖

126

积分

注册会员

积分
126
发表于 2026-5-3 08:45:37 | 显示全部楼层
梁*** 发表于 2026-5-2 22:59
用EXCEL做个正弦波太简单,所以我没有附在程序里,我重新写一个给您。

好的,收到,谢谢
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-07 20:26:03
已绑定手机

0

主题

34

回帖

126

积分

注册会员

积分
126
发表于 2026-5-3 10:12:11 | 显示全部楼层
梁工,请教一下M1_StepCnt 这个值, 是不是利用变量类型U8加到最大溢出回0,而不需要在在最大位置设置为0,是否要在255赋值为0,或者减到0不能再减进行设置

if(B_M1_DIR == 0)      
M1_StepCnt++;        //正转, 下一步, M1_step为细分对应的步距
else            
M1_StepCnt--;        //反转, 下一步, M1_step为细分对应的步距


/========================================================================
// 函数: void timer1_ISR (void) interrupt TIMER1_VECTOR
// 描述:  timer1中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2016-5-12
//========================================================================
void timer1_ISR (void) interrupt TIMER1_VECTOR
{
        u8                area;                //区间0~3
        u8                pwm_A;                //A相spwm
        u8                pwm_B;                //B相spwm


        if(B_M1_RunEn)        //电机允许运转
        {
                pwm_A = M1_StepCnt * M1_step;        // A相步数计数, M1_step为细分对应的步距
                area  = pwm_A / 64;                                // 区间0~3
                pwm_B = pwm_A + 64;                                // B相步数计数
                pwm_A = T_SIN[pwm_A];                        // A相sPWM值
                pwm_B = T_SIN[pwm_B];                        // A相sPWM值
               
                if(area == 0)                        //0区间
                {
                        PWMA_CCR1L = pwm_A;                // A+ = sin(A)
                        PWMA_CCR2L = 0;                        // A- = 0
                        PWMA_CCR3L = pwm_B;                // B+ = cos(A) = sin(A+64)
                        PWMA_CCR4L = 0;                        // B- = 0
                }
                else if(area == 1)                //1区间
                {
                        PWMA_CCR1L = pwm_A;                // A+ = sin(A)
                        PWMA_CCR2L = 0;                        // A- = 0
                        PWMA_CCR3L = 0;                        // B+ = 0
                        PWMA_CCR4L = pwm_B;                // B- = cos(A) = sin(A+64)
                }
                else if(area == 2)                //2区间
                {
                        PWMA_CCR1L = 0;                        // A+ = sin(A)
                        PWMA_CCR2L = pwm_A;                // A- = 0
                        PWMA_CCR3L = 0;                        // B+ = 0
                        PWMA_CCR4L = pwm_B;                // B- = cos(A) = sin(A+64)
                }
                else                                        //3区间
                {
                        PWMA_CCR1L = 0;                        // A+ = sin(A)
                        PWMA_CCR2L = pwm_A;                // A- = 0
                        PWMA_CCR3L = pwm_B;                // B+ = cos(A) = sin(A+64)
                        PWMA_CCR4L = 0;                        // B- = 0
                }

                if(B_M1_DIR == 0)        M1_StepCnt++;        //正转, 下一步, M1_step为细分对应的步距
                else                                M1_StepCnt--;        //反转, 下一步, M1_step为细分对应的步距

                if(M1_PulseCnt != 0)        //总脉冲数非0减1
                {
                        if(--M1_PulseCnt == 0)        B_M1_RunEn = 0;
                }
                if(M1_DownCnt  != 0)        //减速时刻脉冲数减1
                {
                        if(--M1_DownCnt  == 0)        f1_set  = 200;
                }
        }

        if(B_f1_update)        //刷新频率数据
        {
                B_f1_update = 0;
                TR1 = 0;
                TL1 = (u8)(f1_period % 256);
                TH1 = (u8)(f1_period / 256);
                if(B_TIMER1_12T)        AUXR &= ~0x40;        //12T mode
                else                                AUXR |=  0x40;        //1T mode
                TR1 = 1;
        }
}

点评

M1_StepCnt是无符号8位的,溢出就会会到开头开始。正弦波表是256点,8位无符号的M1_StepCnt就是查表索引。  详情 回复 发表于 2026-5-3 13:39
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 07:57 , Processed in 0.077760 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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