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

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

  [复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-16 10:09:11 | 显示全部楼层
梁*** 发表于 2024-10-16 09:50
按键按下(边沿检测),检测到一次按下,就算你按季个小时,都是只检测到一次按下的动作,这是按键检测最 ...

梁工,您说的是这个意思吗?
        if (up == 1)
        {
            up_no_press_number ++;   
                if(up_no_press_number>=4)
                {       
                        if(up == 0)
                        {
                                up_press_number++
                                if(up_press_number >= 4)flag_up = 0;       
                        }
                }
   else
   {
            up_press_number++;
                if(up_press_number>=4)
                {       
                        if(up == 1)
                        {
                                up_no_press_number++
                                if(up_no_press_number >= 4)flag_up = 1;       
                        }
                }
        }

点评

没有注释看不懂,也没空去猜,按键不需要这么复杂: 每个20~50ms扫描一次,比如P10是按键输入,按下低电平,不按为高电平: bit B_KeyStateTmp, B_KeyState; B_KeyStateTmp = B_KeyState; //暂存上次键状态 B_Ke  详情 回复 发表于 2024-10-16 10:41
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-10-16 10:41:49 | 显示全部楼层
huatl*** 发表于 2024-10-16 10:09
梁工,您说的是这个意思吗?
        if (up == 1)
        {

没有注释看不懂,也没空去猜,按键不需要这么复杂:
每个20~50ms扫描一次,比如P10是按键输入,按下低电平,不按为高电平:
bit   B_KeyStateTmp, B_KeyState;

B_KeyStateTmp = B_KeyState;  //暂存上次键状态
B_KeyState = ~P10;    //保存本次键状态(取反为正逻辑,按下为高,不按为低)
if(!B_KeyStateTmp && B_KeyState)    //键按下检测
{
    //启动电机正转90度
}
if(B_KeyStateTmp && !B_KeyState)    //键释放检测
{
    //启动电机反转之前正转的脉冲数,如果正在正转,先停止电机,延时几十ms再启动反转
}
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-16 11:30:17 | 显示全部楼层
梁*** 发表于 2024-10-16 10:41
没有注释看不懂,也没空去猜,按键不需要这么复杂:
每个20~50ms扫描一次,比如P10是按键输入,按下低电 ...

感谢梁工指导,我是这样更改的,最终代码和效果如下:(仍然存在转动一圈后不停下,继续转动,且转动步数不一致的情况)

void Key_scan()
{
        B_KeyStateTmp = B_KeyState;  //暂存上次键状态
        B_KeyState = ~up;    //保存本次键状态(取反为正逻辑,按下为高,不按为低)
        if(!B_KeyStateTmp && B_KeyState)    //键按下检测
        {
            flag_up = 0;//启动电机正转90度
        }
        if(B_KeyStateTmp && !B_KeyState)    //键释放检测
        {
            flag_up = 1;//启动电机反转之前正转的脉冲数,如果正在正转,先停止电机,延时几十ms再启动反转
        }       
}



void timer0_ISR(void) interrupt TIMER0_VECTOR
{
        B_1ms = 1;        //标志1ms时隙
        ms_flag++;
        if(ms_flag>=20)
        {       
                ms_flag = 0;
                Key_scan();
        }
}



if((flag_up == 0)&&(flag_down == 1)&&(flag_slow_down == 1)) //正转
{  
                                Flag_jushengState=1;//进入举升标志位  =1进入举升  =0举升回转结束
                                if(!B_M1_RunEn)         f1 = 200;
                                B_M1_DIR = 0;
                                f1_set = 65000;
                                M1_PulseCnt = 12800;
                                RunMotor1();       
}



IMG_9067.MP4

12.26 MB, 下载次数: 163

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-16 15:24:06 来自手机 | 显示全部楼层
梁工,感谢您的指导,终于成功了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-16 15:28:20 | 显示全部楼层
huatl*** 发表于 2024-10-16 15:24
梁工,感谢您的指导,终于成功了

自己犯了很低级的错误,想想就搞笑
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 00:44:09

6

主题

81

回帖

2118

积分

金牌会员

积分
2118
发表于 2024-10-17 08:48:15 | 显示全部楼层
huatl*** 发表于 2024-10-16 15:28
自己犯了很低级的错误,想想就搞笑

什么错误
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-17 11:16:46 | 显示全部楼层

梁工说的重复检测
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-17 11:25:34 | 显示全部楼层
梁*** 发表于 2024-10-16 10:41
没有注释看不懂,也没空去猜,按键不需要这么复杂:
每个20~50ms扫描一次,比如P10是按键输入,按下低电 ...

梁工,请教下如何更改4个PWM通道的周期

点评

这么明显的注释。。。。 [attachimg]60139[/attachimg]  详情 回复 发表于 2024-10-17 12:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-10-17 12:01:11 | 显示全部楼层
huatl*** 发表于 2024-10-17 11:25
梁工,请教下如何更改4个PWM通道的周期

这么明显的注释。。。。

截图202410171201071799.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-17 14:35:08 | 显示全部楼层
梁*** 发表于 2024-10-17 12:01
这么明显的注释。。。。

梁工,因为我第一次接触,在您的指导下,艰难完成了这个控制。我的意思是,我看您给的例程只设置了一个通道的占空比,其他三个通道都为零吗?2.这个目标频率值得什么频率?是步进电机转的频率还是发脉冲的频率?

点评

你要先弄懂步进电机细分驱动的原理,才好理解怎么用PWM来做细分驱动。 4路PWM频率是一样的,但是各路PWM的占空比不同,根据转角用正弦、余弦分解成两个电枢的PWM占空比,每个电枢用H桥来实现驱动。步进电机转速是改  详情 回复 发表于 2024-10-17 16:06
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 09:02 , Processed in 0.166078 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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