⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a_dc.c

📁 无刷直流电机驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        {
        pos_change++;
        if(pos_change>5)
           pos_change=10;
        }
      
//--------------- 电流采样PID调节部分结束  ------------------------- 
//   data_save_dram();                            //数据保存至双口RAM中    
//   led_shine();                                 //闪灯子程序,作测试用!!!

//    current_uref=50;                //开环,用做试验用
/*  速度闭环测试用*/
    if(direction_flag==0)    current_uref =1000-current_uref;

    else if(direction_flag==1)   current_uref = 1000+current_uref;

    *MCRA=*MCRA&0xffc7;
	Motor_position=*PADATDIR&0x0038;
	Motor_position=Motor_position>>3;
    *MCRA=*MCRA|0x0038;     
    sequence();
	
    *EVAIFRA = 0X0080;        //清中断标志,以进行下次中断
    }				         
    asm( " clrc INTM");
    return;

}

//============================================ 

sequence()
{
   
   switch(Motor_position)
   {
      case   1:
         if(direction_flag==0)
         {
            *ACTRA = 0xdf3;          //2,5
            *CMPR3 = current_uref;
            *CMPR1 = 0;
            *CMPR2 = 0;
         }
         else 
         {
            *ACTRA = 0x3fd;          
            *CMPR1 = current_uref;
            *CMPR2 = 0;
            *CMPR3 = 0;           
         }
      break;
      
      case   2:
         if(direction_flag==0)
         {
            *ACTRA = 0xf3d;             //1,4
            *CMPR1 = current_uref;
            *CMPR2 = 0;
            *CMPR3 = 0;
         }
         else
         {
            *ACTRA = 0xfd3;
            *CMPR2 = current_uref;
            *CMPR1 = 0;
            *CMPR3 = 0;         
         }
      break;
               
      case   3:
         if(direction_flag==0)
         {
         *ACTRA = 0xd3f;                 //4,5
         *CMPR3 = current_uref;
         *CMPR1 = 0;
         *CMPR2 = 0;
      }
      else
      {
         *ACTRA = 0x3df;
         *CMPR2 = current_uref;
         *CMPR1 = 0;
         *CMPR3 = 0;
      }
      break;    
      
      case   4:
      if(direction_flag==0)
      {
         *ACTRA = 0x3df;                 //3,6
         *CMPR2 = current_uref;
         *CMPR1 = 0;
         *CMPR3 = 0;
      }
      else
      {
         *ACTRA = 0xd3f;
         *CMPR3 = current_uref;
         *CMPR1 = 0;
         *CMPR2 = 0;
      }
      break;   
      
      case   5:
      if(direction_flag==0)
      {
         *ACTRA = 0xfd3;                 //2,3
         *CMPR2 = current_uref;
         *CMPR1 = 0;
         *CMPR3 = 0;
      }
      else
      {
         *ACTRA = 0xf3d;
         *CMPR1 = current_uref;
         *CMPR2 = 0;
         *CMPR3 = 0; 
      }
      break;   
      
      case   6:
      if(direction_flag==0)
      {
         *ACTRA = 0x3fd;                //1,6
         *CMPR1 = current_uref;
         *CMPR2 = 0;
         *CMPR3 = 0;
      }
      else
      {
         *ACTRA = 0xdf3;
         *CMPR3 = current_uref;
         *CMPR1 = 0;
         *CMPR2 = 0;
      }
      break;  
      
      default:
       {
       *ACTRA=0x0fff;
       break;
       }
   }   
}
/*
//============================================
//采用了PWM_ON调制策略
//============================================
sequence()
{
    switch(Motor_position)
         {
          case 1:
              {
               if(direction_flag==0)         //6-pwm   1/6
                   {
                    *ACTRA=0x07fc;
                    *CMPR3=current_uref;
                   }
               else
                   {
                    *ACTRA=0x0cf7;
                    *CMPR1=current_uref;      //2-pwm   2/5
                    }
               break;
               }
          case 2:
              {
               if(direction_flag==0)         //2-pwm   2/3
                   {
                    *ACTRA=0x0fc7;
                    *CMPR1=current_uref;
                   }
               else
                   {
                    *ACTRA=0x0f7c;
                    *CMPR2=current_uref;      //4-pwm   1/4
                    }
               break;
               }
         case 3:
              {
               if(direction_flag==0)         //3-pwm   3/6
                   {
                    *ACTRA=0x03df;
                    *CMPR2=current_uref;
                   }
               else
                   {
                    *ACTRA=0x0d3f;
                    *CMPR3=current_uref;      //5-pwm   4/5
                    }
               break;
               }
        case 4:
              {
               if(direction_flag==0)         //4-pwm  4/5
                   {
                    *ACTRA=0x0c7f;
                    *CMPR2=current_uref;
                   }
               else
                   {
                    *ACTRA=0x07cf;
                    *CMPR3=current_uref;      //6-pwm   3/6
                    }
               break;
               }   
         case 5:
              {
               if(direction_flag==0)         //1-pwm   1/4
                   {
                    *ACTRA=0x0f3d;
                    *CMPR1=current_uref;
                   }
               else
                   {
                    *ACTRA=0x0fd3;
                    *CMPR2=current_uref;      //3-pwm    2/3
                   }
               break;
               }                                                               
         case 6:
              {
               if(direction_flag==0)         //5-pwm   2/5
                   {
                    *ACTRA=0x0df3;
                    *CMPR3=current_uref;
                   }
               else
                   {
                    *ACTRA=0x03fd;
                    *CMPR1=current_uref;      //1-pwm   1/6
                    }
               break;
               }
         default:
               {
                *ACTRA=0x0fff;
                break;
               }
         }
}

*/
//===================================================
//霍尔元件捕获中断
//===================================================
void interrupt capint()
{
   int temp=0,temp_2=0;
   temp=*PIVR;
   pos_change=0;
   switch(temp)
   {
      case 0x33:
         *EVAIFRC=*EVAIFRC;
         temp_2=*CAP1FBOT;
         *T2CNT=0;
         if(temp_2>11)
         {
            *MCRA=*MCRA&0xffc7;
            Motor_position=*PADATDIR&0x0038;
            Motor_position=Motor_position>>3; 
            *MCRA=*MCRA|0x0038; 
        	
            sequence();
         }
         *CAPFIFOA=0x1500;
      break;

      case 0x34:
         *EVAIFRC=*EVAIFRC;
         temp_2=*CAP2FBOT;
         *T2CNT=0;
         if(temp_2>11)
         {
            *MCRA=*MCRA&0xffc7;
            Motor_position=*PADATDIR&0x0038;
            Motor_position=Motor_position>>3; 
            *MCRA=*MCRA|0x0038; 
        	
            sequence();
         }
         *CAPFIFOA=0x1500;
         break;
 
      case 0x35:
         *EVAIFRC=*EVAIFRC;
         temp_2=*CAP3FBOT;
         *T2CNT=0;
         if(temp_2>11)
         {
            *MCRA=*MCRA&0xffc7;
            Motor_position=*PADATDIR&0x0038;
            Motor_position=Motor_position>>3; 
            *MCRA=*MCRA|0x0038; 
        	
            sequence();
         }
         *CAPFIFOA=0x1500;
      break;

      default:break;

      asm( " clrc INTM");
      return;
   }
}   

/*=================================================================== */
/* 空中断子程序 */

void interrupt nothing()
{
   enable();
   return;
}

/* ==================================================================== */
/* 闪灯子程序,测试用!!!! */
void led_shine()
{
   nor_flag = ~nor_flag;     
   if (nor_flag)
   {
      asm( " clrc xf");
      delay(100);
   }
   else 
   {
      asm( " setc xf");
      delay(100);
   } 
}

/* ==================================================================== */
/* 延时子程序,测试用!!!!! */
void delay (unsigned int ms)
{  
   WORD i,j,k;
   KICK_DOG;
   for (i=0;i<=ms;i++)
   {
      for(j=0;j<200;j++)
      {
         k++;
      }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -