①①592 2024-06-22 01:18 采纳率: 66.7%
浏览 0
已结题

请问怎样才能进中断而直流小电机不停止旋转?(语言-c语言)

在用dsp288335的时候,直流电机旋转的代码写在main函数里,我想用ecap配合光电传感器捕捉电机旋转速度。但是一进ecap中断电机就停下来了,我在ecap中断里也加入了电机旋转代码,但电机还是停下了
电机代码如下:

switch(key)
{
                    case KEY1_PRESS: DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL;break;
                    case KEY2_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETH;break;
                    case KEY3_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETL;break;
}

这是我ecap的中断程序

__interrupt void ecap1_isr(void)//eCAP1中断服务函数
{

   ECap1IntCount++;
   DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL;//电机旋转在这里
   ECap1PassCount++;
    t1 = ECap1Regs.CAP1;
       t2 = ECap1Regs.CAP2;
       t3 = ECap1Regs.CAP3;
       t4 = ECap1Regs.CAP4;
       T1 = t3 - t1;//两个下降沿对应时间之差,即周期
       T2 = t2 - t1;//占空比对应时间

    T1_buf[0]=T1/10+0x30;
    T1_buf[1]=T1%10+0x30;
    T1_buf[2]='\0';
    LCD1602_DispStringEx(2,12,T1_buf);

       if(ECap1PassCount > 100)
       {
           T1_temp = T1;
           T2_temp = T2*100;
           freq = (150000/T1_temp)*1000;
           duty = T2_temp/T1_temp;
           ECap1PassCount = 0;
       }


   ECap1Regs.ECCLR.bit.CEVT4 = 1;
   ECap1Regs.ECCLR.bit.INT = 1;
   ECap1Regs.ECCTL2.bit.REARM = 1;

   // Acknowledge this interrupt to receive more interrupts from group 4
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
```c

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-22 01:18
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在中断服务函数(ISR)中控制电机的旋转,当进入中断时电机停止旋转可能是因为你在中断中重置了电机控制状态或是因为某些其他原因。另外,如果ecap的中断频率过高,可能会影响电机的正常运行。对于你的问题,我有以下几点建议:

    1. 确保电机控制代码的执行:在ecap的中断服务程序中,确保电机控制代码(如设置电机状态)在执行时不会被其他代码打断或干扰。这可能意味着需要将电机控制代码放在中断服务程序的开始部分,并确保其执行完成后再退出中断服务程序。
    2. 避免频繁的中断:如果ecap的中断频率过高,可能会导致电机控制不稳定。你可以尝试调整ecap的配置以降低中断频率,或者在中断服务程序中添加适当的延时以避免过于频繁的中断。
    3. 检查电机驱动器的状态:确保电机驱动器在接收到控制信号时能够正确响应。有时候电机驱动器可能因为某些原因无法正确响应控制信号,导致电机停止旋转。检查电机驱动器的状态并确认其正常工作。
    4. 使用标志位控制电机旋转:在中断服务程序中设置一个标志位,然后在主程序中根据这个标志位来控制电机的旋转。这样可以确保电机的旋转不会被中断打断,同时也能确保电机在需要时能够正确旋转。例如,你可以在中断服务程序中设置标志位,然后在主程序的适当位置根据这个标志位来控制电机的旋转。

    关于你的代码,我建议你在主程序中设置一个全局变量来控制电机的旋转状态,然后在中断服务程序中更新这个变量。然后在主程序中根据这个变量来控制电机的旋转。这样可以将电机的控制逻辑与中断服务程序分开,避免中断对电机控制的影响。

    这是一个简单的示例代码:

    volatile int motor_control_flag = 0; // 全局变量控制电机的旋转状态
    
    void main() {
        // 主程序中的电机控制逻辑
        if (motor_control_flag) { // 根据全局变量控制电机的旋转状态
            DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL; // 电机旋转代码
        }
        // 其他代码...
    }
    
    __interrupt void ecap1_isr(void) {
        // 中断服务程序中的逻辑...
        motor_control_flag = 1; // 设置全局变量以控制电机的旋转状态
        // 其他中断逻辑...
    }
    

    请注意这只是一个简单的示例,你需要根据你的实际需求来修改和扩展这个代码。希望这些建议能够帮助你解决问题!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月4日
  • 已采纳回答 6月26日
  • 创建了问题 6月22日