智能车制作

标题: K60定时时间问题 [打印本页]

作者: 我就喜欢吃猪皮    时间: 2015-1-30 10:31
标题: K60定时时间问题
我用k60定时1ms中断电机就不转 程序会跑飞 2ms以上就没问题 这是什么原因
[attach]74167[/attach]
这是时钟频率的有关设置
作者: 1224091496    时间: 2015-1-30 11:04
中断处理函数超时?
作者: 我就喜欢吃猪皮    时间: 2015-1-30 11:32
1224091496 发表于 2015-1-30 11:04
中断处理函数超时?

不知道 中断里也没写多少东西

作者: 我就喜欢吃猪皮    时间: 2015-1-30 11:59
我在程序里加了printf函数电机就转了 这是什么原理 。。。
作者: 1224091496    时间: 2015-1-30 12:17
你把中断函数贴一下
作者: 我就喜欢吃猪皮    时间: 2015-1-30 13:00
1224091496 发表于 2015-1-30 12:17
你把中断函数贴一下

void PIT1_IRQHandler(void)
{
  static u8 TimeCount ;
  static unsigned char TimerCnt20ms = 0;
  PIT_Flag_Clear(PIT1);       //清中断标志位
   TimeCount ++ ;
  TimerCnt20ms++ ;



  if(TimeCount%1 == 0 ){
     TIME0flag_1ms = 1;

}
  if(TimeCount%5 == 0 ){
     TIME0flag_5ms = 1;

  }
  if(TimeCount%10 == 0 ){
     TIME0flag_10ms = 1;
  }
  if(TimeCount%20 == 0 ){
     TimerCnt20ms = 0;
     TIME0flag_20ms = 1;  
  }
  if(TimeCount%40 == 0 ){

     TIME0_40ms = 1;
  }

  if(TimeCount == 180)
  {
    TimeCount = 0 ;

  }



}


作者: 1224091496    时间: 2015-1-30 13:14
电机哪里控制的啊
作者: 我就喜欢吃猪皮    时间: 2015-1-30 13:23
1224091496 发表于 2015-1-30 13:14
电机哪里控制的啊

在main函数里
while(1)   
    {  
     if(TIME0flag_1ms == 1)
      {
        TIME0flag_1ms = 0 ;        
        PWMOUT();  
      }


作者: Greece    时间: 2015-1-30 14:16
程序在1ms内没执行完,加printf会强行往后拖时间
作者: 我就喜欢吃猪皮    时间: 2015-1-30 14:21
Greece 发表于 2015-1-30 14:16
程序在1ms内没执行完,加printf会强行往后拖时间

但我1ms的程序写的很短 应该不会没执行完

作者: 机遇    时间: 2015-1-30 14:29
pwmout 程序呢
作者: 我就喜欢吃猪皮    时间: 2015-1-30 14:36
机遇 发表于 2015-1-30 14:29
pwmout 程序呢

void PWMOUT()
{
  //turnPWM=0;
  rightPWMOUT=-turnPWM;//;
  leftPWMOUT=turnPWM;//;
  if(rightPWMOUT>=80) rightPWMOUT=80;
  if(rightPWMOUT<-80) rightPWMOUT=-80;
  if(leftPWMOUT>=80) leftPWMOUT=80;
  if(leftPWMOUT<-80) leftPWMOUT=-80;
  if(rightPWMOUT>=0)
  {
    FTM_PWM_init(FTM0,CH0,3000,6+rightPWMOUT);  
    FTM_PWM_init(FTM0,CH1,3000,0);  
  }
  if(rightPWMOUT<0)
  {
    FTM_PWM_init(FTM0,CH0,3000,0);  
    FTM_PWM_init(FTM0,CH1,3000,6-rightPWMOUT);  
  }
  if(leftPWMOUT>=0)
  {
    FTM_PWM_init(FTM0,CH2,3000,6+leftPWMOUT);  
    FTM_PWM_init(FTM0,CH3,3000,0);  
  }
    if(leftPWMOUT<0)
    {
      FTM_PWM_init(FTM0,CH2,3000,0);  
      FTM_PWM_init(FTM0,CH3,3000,6-leftPWMOUT);  
    }
}


作者: 机遇    时间: 2015-1-30 14:39
本帖最后由 机遇 于 2015-1-30 14:42 编辑
我就喜欢吃猪皮 发表于 2015-1-30 14:36
void PWMOUT()
{
  //turnPWM=0;

第一 建议在赋值的时候做参数临界保护 而不是 像你这样通过表达式参数传递 很容易跑飞的
第二 PWM 赋定值 试试 能不能跑飞

作者: 1224091496    时间: 2015-1-30 15:05
ls说的对而且你赋值的为什么要用初始化的函数,效率会很低的。
回归正题:
我觉得虽然你说中断很短,但是我还是怀疑你的中断超时导致一直被响应,从而不会执行while函数。我觉得你可以试试不清中断标志位(这样中断应该只会被响应一次,我是这么认为的不对请指正)再跑一下。如果还不行的话,不设中断,直接置位TIME0flag_1ms看看转吗。至于printf的问题,不知道你加在哪,没有思路。
(你还可以在线调试一下啊!!)
作者: 我就喜欢吃猪皮    时间: 2015-1-30 15:21
机遇 发表于 2015-1-30 14:39
第一 建议在赋值的时候做参数临界保护 而不是 像你这样通过表达式参数传递 很容易跑飞的
第二 PWM 赋定值 ...

好的 我回去试试

作者: 我就喜欢吃猪皮    时间: 2015-1-30 15:21
1224091496 发表于 2015-1-30 15:05
ls说的对而且你赋值的为什么要用初始化的函数,效率会很低的。
回归正题:
我觉得虽然你说中断很短,但是 ...

知道了 我去试试





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2