huatlwangl 发表于 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;       
                        }
                }
        }

梁工 发表于 2024-10-16 10:41:49

huatlwangl 发表于 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再启动反转
}

huatlwangl 发表于 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();       
}



huatlwangl 发表于 2024-10-16 15:24:06

梁工,感谢您的指导,终于成功了

huatlwangl 发表于 2024-10-16 15:28:20

huatlwangl 发表于 2024-10-16 15:24
梁工,感谢您的指导,终于成功了

自己犯了很低级的错误,想想就搞笑

Wddz 发表于 2024-10-17 08:48:15

huatlwangl 发表于 2024-10-16 15:28
自己犯了很低级的错误,想想就搞笑

什么错误

huatlwangl 发表于 2024-10-17 11:16:46

Wddz 发表于 2024-10-17 08:48
什么错误

梁工说的重复检测

huatlwangl 发表于 2024-10-17 11:25:34

梁工 发表于 2024-10-16 10:41
没有注释看不懂,也没空去猜,按键不需要这么复杂:
每个20~50ms扫描一次,比如P10是按键输入,按下低电 ...

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

梁工 发表于 2024-10-17 12:01:11

huatlwangl 发表于 2024-10-17 11:25
梁工,请教下如何更改4个PWM通道的周期

这么明显的注释。。。。



huatlwangl 发表于 2024-10-17 14:35:08

梁工 发表于 2024-10-17 12:01
这么明显的注释。。。。

梁工,因为我第一次接触,在您的指导下,艰难完成了这个控制。我的意思是,我看您给的例程只设置了一个通道的占空比,其他三个通道都为零吗?2.这个目标频率值得什么频率?是步进电机转的频率还是发脉冲的频率?
页: 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21
查看完整版本: 51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序