问题描述
我正在尝试使用顺时针和逆时针方向旋转直流电机
两个按钮(实际上有三个,另一个是按钮3进入手动模式)和
电机轴上还附有标志,由电感传感器检测。
这是我的步骤,
- 所以首先,我会根据 4 个拨码开关值生成一些延迟
- 延迟后,电机开始顺时针旋转,直到检测到标志
(此步骤和以上步骤均发生在
main
函数中) - 一旦找到标志,就会产生一个中断(INT2)并停止和启动电机 逆时针方向持续 5 秒并停止(此步骤发生在 ISR 中)。
- 现在控制来自 ISR 到
main()
并在while(1)
中等待进入手动模式 - 所以当 button3 被按下 3 秒时,我们通过调用它进入手动模式 函数 Manual_mode()。
- 在手动模式功能下,我们将按住 CW 或 ccw 方向旋转电机 分别是 button1 或 button2。 @H_404_22@
问题:一切正常,但是当控制从 ISR 返回到无限循环时 我进入手动模式,电机自动启动(在 CW 方向),然后按下按钮 1 或按钮 2。
板:dsPIC33EP512GM604 使用带有 xC16 编译器的 MPLABx。
主要功能
void main(void)
{
SYstem_Initialize();
LED_initialize();
switch_initialize();
configureINT();
//start_motor:
if(DIP1_SW == 0 && DIP2_SW == 0 && DIP3_SW == 0 && DIP4_SW == 0)
{
D8_LED = 1;
__delay_ms(2000);
TP6 = 1;
TP5 = 0;
__delay_ms(2000);
L2 = 0;
L6 = 1;
}
else if (DIP1_SW == 1 && DIP2_SW == 0 && DIP3_SW == 0 && DIP4_SW == 0)
{
__delay_ms(15000);
D8_LED = 1;
__delay_ms(2000);
TP6 = 1;
TP5 = 0;
__delay_ms(2000);
L2 = 0;
L6 = 1;
}
else
{
__delay_ms(225000);
D8_LED = 1;
__delay_ms(2000);
TP6 = 1;
TP5 = 0;
__delay_ms(2000);
L2 = 0;
L6 = 1;
}
while(1)
{
if (MOTVALID_pressed == isMOTVALIDpressed_3sec()) // if MOTVALID pressed for 3SEC,than
enter Manual Mode.
{
Manual_mode();
}
}
}
void Manual_mode ()
{
D7_LED = 1;
__delay_ms(500);
D7_LED = 0;
__delay_ms(500);
D7_LED = 1;
__delay_ms(500);
D7_LED = 0;
__delay_ms(500);
while(1)
{
if (!MOTCW) // Turn the motor while button is pressed
{
D8_LED = 1;
__delay_ms(2000);
TP6 = 1;
TP5 = 0;
__delay_ms(2000);
L2 = 0;
L6 = 1;
break;
}
else if (!MOTccw)
{
D8_LED = 1;
__delay_ms(2000);
TP6 = 0;
TP5 = 0;
__delay_ms(2000);
L2 = 1;
L6 = 0;
break;
}
else
{
D8_LED = 0;
D7_LED = 1;
TP5 = 1;
TP6 = 0;
L2 = 0;
L6 = 0;
break;
}
}
}
ISR 功能
void __attribute__ ((interrupt,no_auto_psv)) _INT2Interrupt(void)
{
if (IFS1bits.INT2IF == 1)
{
INTCON2bits.GIE = 0;
D8_LED = 0;
D7_LED = 0;
TP5 = 1;
TP6 = 0;
L2 = 0;
L6 = 0;
D7_LED = 1;
__delay_ms(1000); // 1 SEC DELAY FOR STOPPING MOTOR
D7_LED = 0;
D8_LED = 1;
__delay_ms(2000); // TURN THE MOTOR IN REVERSE DIRECTION FOR 5SEC
TP6 = 0;
TP5 = 0;
__delay_ms(2000);
L2 = 1;
L6 = 0;
__delay_ms(5000);
D7_LED = 1;
D8_LED = 0;
TP5 = 1;
TP6 = 0;
L2 = 0;
L6 = 0;
}
IFS1bits.INT2IF = 0;
}
我想我错过了一些东西。谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)