huatlwangl 发表于 2024-10-15 11:07:36

梁工 发表于 2024-10-15 11:05
这个其实是非常简单的:
1、检测到按键按下(边沿检测),就给定90度对应的脉冲数和转向,启动电机即可。 ...

但是可能我在0-90度之间释放了按键呢,怎么给定回零脉冲

梁工 发表于 2024-10-15 11:59:13

huatlwangl 发表于 2024-10-15 11:07
但是可能我在0-90度之间释放了按键呢,怎么给定回零脉冲

根据当前转了多少脉冲,给定转回多少脉冲。步进电机控制是很简单的,没那么复杂,只要不失步,角度就是没有误差的。

huatlwangl 发表于 2024-10-15 17:30:28

梁工 发表于 2024-10-15 11:05
这个其实是非常简单的:
1、检测到按键按下(边沿检测),就给定90度对应的脉冲数和转向,启动电机即可。 ...

我试了,这样的操作后 比如我64细分,每次检测到正转按键标志位,赋值脉冲12800,会从在这样的现象:一直转动。因为我放在主程序中。每1Ms执行一次。这样就会及时脉冲数减到0,马上又会更新。

梁工 发表于 2024-10-15 17:36:42

huatlwangl 发表于 2024-10-15 17:30
我试了,这样的操作后 比如我64细分,每次检测到正转按键标志位,赋值脉冲12800,会从在这样的现象:一直 ...

还是你处理的问题,到位后,没有触发信号(按键),你居然自己又启动了,这就是你处理不当造成的。

huatlwangl 发表于 2024-10-15 22:15:48

梁工 发表于 2024-10-15 17:36
还是你处理的问题,到位后,没有触发信号(按键),你居然自己又启动了,这就是你处理不当造成的。 ...

梁工,这我不太明白,因为所需实现得功能按着按键,电机转动,转到到90度,不再转动,只要释放按键,电机就回零。
即使到位后,也没有触发信号(按键),您能给个思路吗?困扰太久了

huatlwangl 发表于 2024-10-16 09:15:07

huatlwangl 发表于 2024-10-15 22:15
梁工,这我不太明白,因为所需实现得功能按着按键,电机转动,转到到90度,不再转动,只要释放按键,电机 ...

我现在的思路是数脉冲,但是数的脉冲。怎么给呢,如果在释放按键后将数的的脉冲信号复制给总脉冲,那就会出现我上面叙述的不停下来的问题

梁工 发表于 2024-10-16 09:50:52

huatlwangl 发表于 2024-10-15 22:15
梁工,这我不太明白,因为所需实现得功能按着按键,电机转动,转到到90度,不再转动,只要释放按键,电机 ...

按键按下(边沿检测),检测到一次按下,就算你按季个小时,都是只检测到一次按下的动作,这是按键检测最基本的啊。

举个简单例子,按下键对一个变量+1(比如电子钟调整时间时),不管按下多久,都是+1,你试下实现这个功能,就能明白了。

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();       
}



页: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19
查看完整版本: 51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序