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