亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? motors.c

?? 老外開發的機器人的底層單片機代碼。比較有參考價值哦!
?? C
?? 第 1 頁 / 共 2 頁
字號:
//  Motor & motion control     Motors.c					// Rev 12/31/05

//Copyright (C) 2005 Alex Brown	rbirac@cox.net
//This program is free software; See license at the end of this file for details.

/*
  performs all computing of basic forward motion and steering commands and
  computes required PWM and drives the two motors.
  
  scaling:  acceleration can handle +/- 32767 mm/sec^2 (3+ g's)
  			velocity                +/- 32767 mm/sec (+/- 117 Km/h)
			distance				+/- 35 Km
*/
#include "Microcontroller.h"	  //for registers, config data & stdio
#include <stdlib.h>				  //for abs()

extern int  time;				  //from Microcontroller.c
extern long enc0;   		      //drive wheel encoder, normally left wheel
extern long enc1;   		      //drive wheel encoder, normally right wheel
extern long odomLlast,odomRlast;  //temporary values of previous odom data
extern long DistActL, DistActR;	  //actual distances wheels have moved in mm
extern int  hdgdeg;	  			  //gyro direction of robot in deg*10
extern int Compass;				  //compass direction of robot in deg*10
extern int Speed;
extern int USBtimeout;			  //time since last message from laptop

// Motor Constants with defaults. Normally set by laptop download
// default to zero so motors are stable on power up
  //Left motor constants
  int PwmBaseL  = 0;	   //motor start threshold
  int KvL       = 0;	   //velocity gain (feedforward)
  int KaccL     = 0;	   //acceleration gain (feedforward)
  int KdistL    = 0;	   //distance error gain (proportional)
  int RCoffsetL = 0;	   //center offset for RC motor output
  
  //Right motor constants
  int PwmBaseR  = 0;	   //motor start threshold
  int KvR       = 0;	   //velocity gain
  int KaccR     = 0;	   //acceleration gain
  int KdistR    = 0;	   //distance error gain
  int RCoffsetR = 0;	   //center offset for RC motor output
  
  //Common constants
  int PWMmax    = 0;	   //max duty cycle value
  
// Steering constants.  Normally set by laptop download  
  int PivotConv = 3000;    // converts degrees of rotation to wheel distance

// Motor test
  int testvalueL; 		   // these values used for test in BITE.c
  int testvalueR;
  int PWMtestOn = 0;
  
//MotorCmd globals
    int   AccMax;		    	     //accel/decel max value. 
	int   Vmax;		    		     //velocity max speed 
	long  DistTarget;  		         //+ to move forward, - for reverse
	int	  Vtarget;					 //current velocity target
	int   AccCmd,AccCmdL,AccCmdR;    //accel/decel cmd  + for forward (mm/sec^2)
	int	  Vcmd,VcmdL,VcmdR;		     //velocity cmd + for forward  (mm/sec)   
	long  DistCmd,DistCmdL,DistCmdR; //distance cmd + for forward  (mm)  
	int   DistErrL, DistErrR;	     //distance error each wheel (DistCmd-DistAct)
	long  DistToGo;					 //distance from current position to target
	int   DecelFlag;		         //1 = decel to distance target
	int   StopFlag;					 //1 = stopped at end of forward command
	long  V1 = 0;			    	 //long of Vcmd for intermediate calcs.
	long  D1 = 0;			    	 //long of DistCmd for intermediate calcs
	int   MotorMode; 		         // see MotorExec()
	int   FwdModeDone;  			 //Motion status word  0 = in progress,
				        			 //	 1 = done  2... = status message
  //steering globals	
	int			TAccMax;			 //turn accel/decel max value (mm/sec^2)
    int         TurnRateMax;		 //turn velocity max value    (mm/sec)
	long		TurnTarget;			 //turn distance target       (mm)
	int			TRtgt;				 //current turn velocity target
	int			TAccCmd;			 //turn accel/decel command
	int			TurnRateCmd;		 //turn velocity command
	long		TurnCmd;			 //turn distance command
	long		TurnToGo;  			 //distance to end of turn
	int			TurnDecelFlag;		 //1 = deceleration in progress
	int			TurnStopFlag;		 //1 = stopped at end of turn 
	long		TV1;				 //long version of TurnRateCmd for calcs.
	long		TD1;				 //long version of TurnCmd for calcs.
    int			TurnType;			 //type of turn in progress
	int         TurnModeDone;	   	 //0: in progress, 1: done, 2.. messages
	long 		SteeringCmd;		 //turn distance command passed to motorexec
	int			SteerAccCmd;		 //turn accel command passed to motorexec
	int			SteerVcmd;			 //turn velocity command passed to motorexec
	
	long 		HdgTarget;
	long		TurnIC;
	long		TurnTargetOld;
	int			HdgErr;
	
  //motor globals
	int	   		pwmL, pwmR;		   //range +/- 100 %
	int 		MotorType;	   	   //hbridge mode = 0, RC mode = 1 else -1
	
// function prototypes
    void MotorCmd(void);	//compute forward motion commands
	void Steering(void);	//compute steering commands
	void MotorHB(void);		//drive motor H bridge output
	void MotorRC(void);		//drive motor RC output

//-----------------------------------------------------------------------------	
void MotorExec()
  {
//printf("mo   %d  %d\n",time,MotorMode);
    switch (MotorMode)
	 {
	   case 0: 		  //stop			 //yes, these two cases are identical, but
	     Steering();  					 //they didn't used to be, & might not in
	     MotorCmd();					 //the future.
 		 AccCmdL = AccCmd + SteerAccCmd;
		 AccCmdR = AccCmd - SteerAccCmd;
		 VcmdL = Vcmd + SteerVcmd;
		 VcmdR = Vcmd - SteerVcmd;
		 DistCmdL =  DistCmd + TurnIC + SteeringCmd;
		 DistCmdR =  DistCmd - TurnIC - SteeringCmd;
	     break;

	   case 1: 		  //forward motion
	     Steering();
	     MotorCmd();	
 		 AccCmdL = AccCmd + SteerAccCmd;
		 AccCmdR = AccCmd - SteerAccCmd;
		 VcmdL = Vcmd + SteerVcmd;
		 VcmdR = Vcmd - SteerVcmd;
		 DistCmdL =  DistCmd + TurnIC + SteeringCmd;
		 DistCmdR =  DistCmd - TurnIC - SteeringCmd;
	     break;
	 }  	
    //calculate errors between commanded and actual distances  
    DistErrL = DistCmdL - DistActL;			       
    DistErrR = DistCmdR - DistActR;
	if(MotorType == 1)
	  MotorRC();
	else if(MotorType == 0)
	  MotorHB();  
  }
  	
 /*---------------------------------------------------------------------------
 Fractional gain multiplier
  returns a signed integer which is the product of the first and second 
  parameters divided by 1000.  Effectively, this gives the ability to 
  muliply a number by +/- 32.000.  Overflows are limited to max integer.
        e.g.  gain (500,1500)  gives 750
*/
int gain (int inp,int k)
  {	long tmp;
    tmp = (long)inp * k/1000;
	if (tmp> 32767) tmp =  32767;
	if (tmp<-32767) tmp = -32767;
	return (tmp);
  }	
  
 /*---------------------------------------------------------------------------
*/
void Steering(void)
{
	long		TAccTemp;  //used to calc turn decel rate
	long 		TAccTemp2; //used to calc turn accel rate
	
  	 switch(TurnType)
	 {
	   case 1:	 //Turn specified degrees at specified rate
	   		if(TurnTarget != TurnTargetOld) //reset decel/stop if target changed
	 		{
	 		  TurnDecelFlag = 0;
	 		  TurnStopFlag = 0;
	   		  TurnTargetOld = TurnTarget;
	 		}
	 
	 		//Set turn rate polarity based on direction to TurnTarget
	 		if(TurnTarget >= TurnCmd) TRtgt =  TurnRateMax;
	 		else                      TRtgt = -TurnRateMax;
	  		// set turnrate to zero if no laptop messages being received
	  		if(USBtimeout == USBtimeoutLimit) TRtgt = 0;
	 
	 		//Calculate deceleration necessary to stop by TurnTarget
	 		TurnToGo = TurnTarget - TurnCmd;
	 		if(TurnToGo == 0) TurnToGo = 1;  //avoid divide by zero
	 		TAccTemp = -(long) TurnRateCmd * TurnRateCmd /TurnToGo /2;
	 
	 		//Set turn decel flag if calc decel exceeds TAccMax
	 		if(abs(TAccTemp) > TAccMax) TurnDecelFlag = 1;
	 
	 		//if in decel, use calculated value of accel, else ramp to TurnRateMax
	 		if(TurnDecelFlag) TAccCmd = TAccTemp;
	 		else
	 		{  TAccTemp2 = (long)TRtgt * 61 - TV1;
	    	   if(TAccTemp2 > 32676) TAccTemp2 = 32767;  //fix overflow
			   if(TAccTemp2 <-32676) TAccTemp2 =-32767;
			   TAccCmd = (int)TAccTemp2;
			   if(TAccCmd > TAccMax) TAccCmd =  TAccMax;
			   if(TAccCmd <-TAccMax) TAccCmd = -TAccMax;
	 		}
	 	
			//or is it time to stop?
			if(abs(TurnToGo)<2)
			{  TurnStopFlag = 1;
	   		   TurnModeDone = 1;
			}	
			if (TurnStopFlag)
			{  TAccCmd = 0;
	   		   TurnRateCmd = 0;
	   		   TV1 = 0;
			}
		
	 		TV1 = TV1 + TAccCmd;
	 		TurnRateCmd = TV1 / 61;
	 		TD1 = TD1 + TurnRateCmd;
	 		TurnCmd = TD1 / 61;
//	printf("Mot  %d  %d  %ld\n",TAccCmd,TurnRateCmd,TurnCmd);
			break;

	   case 5:	 // Stop at specified acceleration
	 
	 
			// is it time to stop?
			if(abs(TurnRateCmd) < 10)
			{  TurnStopFlag = 1;
	   		   TurnModeDone = 1;
			}	
			
	 		//Set decel polarity based on existing turn rate
	 		if(TurnRateCmd > 0) TAccCmd =  -TAccMax;
	 		else                TAccCmd =  +TAccMax;
			if(abs(TV1) < abs(TAccCmd)) TAccCmd = -TV1;
		
			if (TurnStopFlag)
			{  TAccCmd = 0;
	   		   TurnRateCmd = 0;
	   		   TV1 = 0;
			}
		
	 		TV1 = TV1 + TAccCmd;
	 		TurnRateCmd = TV1 / 61;
	 		TD1 = TD1 + TurnRateCmd;
	 		TurnCmd = TD1 / 61;
//	printf("Mot  %d  %d  %ld\n",TAccCmd,TurnRateCmd,TurnCmd);
			break;

	case 10:
		   	HdgErr = HdgTarget - hdgdeg;
			if(HdgErr >  1800) HdgErr -= 3600;
			if(HdgErr < -1800) HdgErr += 3600;
			
			TAccCmd = 0;
			TurnRateCmd = 1 * HdgErr;
			if(TurnRateCmd >  TurnRateMax) TurnRateCmd =  TurnRateMax;
			if(TurnRateCmd < -TurnRateMax) TurnRateCmd = -TurnRateMax;
			TD1 = TD1 + TurnRateCmd;
			TurnCmd = TD1 / 61;
			break;


	 }
	 
		 
	 SteerAccCmd = (int)((long)TAccCmd * PivotConv / 11460);
	 SteerVcmd   = (int)((long)TurnRateCmd * PivotConv / 11460);
	 SteeringCmd = TurnCmd * PivotConv / 11460;
	 
//printf("Mo steer %d  %d %ld\n",SteerAccCmd,SteerVcmd,SteeringCmd);	 		

}  

void MotorCmd(void)
{  
   long AccTemp;  //used to calc decel rate
   long AccTemp2; //used to calc accel rate 
/*
  //calculate errors between commanded and actual distances  
    DistErrL = DistCmdL - DistActL;			       
    DistErrR = DistCmdR - DistActR;
*/	
   //Set max speed polarity depending on direction to target distance
	  if(DistTarget >= DistCmd) Vtarget =  Vmax;
	  else 			   			Vtarget = -Vmax;
	  // set speed to zero if no laptop messages being received
	  if(USBtimeout == USBtimeoutLimit) Vtarget = 0;
	  
   //Calculate deceleration necessary to stop by target distance
	  DistToGo = DistTarget - DistCmd;
	  if(DistToGo == 0) DistToGo = 1;   //limit to avoid divide by zero
	  AccTemp = -(long) Vcmd * Vcmd / DistToGo / 2;

   // set deceleration flag if calculated decel exceeds AccMax
	  if(abs(AccTemp) > AccMax) DecelFlag = 1;
	  
   // if in stop mode,rather than forward, just set to max decel
	  if((MotorMode == 0) && (StopFlag == 0)) 
	  {  if(Vcmd > 0) AccTemp = -AccMax; 
	     else         AccTemp =  AccMax;
	  } 
	  
   // if in decel, use calculated value, else ramp up to Vmax
	  if(DecelFlag)  AccCmd = AccTemp;
	  else
	  {  AccTemp2 = (long)Vtarget * 61 - V1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区五区视频在线观看| 欧美日韩免费视频| 久久久一区二区| 国内精品久久久久影院薰衣草| 日韩欧美激情四射| 久久精品理论片| 久久久久久久综合狠狠综合| 国产91精品一区二区麻豆网站| 久久久久国产一区二区三区四区| 国产高清在线观看免费不卡| 中文字幕欧美三区| 91啪在线观看| 婷婷开心激情综合| 精品日韩一区二区三区免费视频| 国产在线国偷精品产拍免费yy| 日本一区二区三级电影在线观看 | 亚洲欧洲制服丝袜| 欧美午夜片在线看| 秋霞电影网一区二区| 久久久av毛片精品| 一本一道久久a久久精品 | 精品一区二区三区久久| 欧美精品一区在线观看| jvid福利写真一区二区三区| 亚洲精品成人a在线观看| 91精品国产综合久久小美女| 国产在线国偷精品产拍免费yy| 日韩美女精品在线| 欧美一级片在线| 成人激情电影免费在线观看| 五月天婷婷综合| 国产无遮挡一区二区三区毛片日本| www.66久久| 捆绑调教一区二区三区| 中文字幕一区二区三区在线播放 | 中文字幕国产一区| 91麻豆精品国产91久久久久| 东方aⅴ免费观看久久av| 亚洲国产aⅴ天堂久久| 久久蜜桃一区二区| 欧美久久一区二区| 波多野洁衣一区| 日韩av高清在线观看| 国产精品日日摸夜夜摸av| 欧美精品在线观看播放| 丁香亚洲综合激情啪啪综合| 天天综合色天天综合| 成人欧美一区二区三区小说| 精品美女一区二区三区| 在线观看日韩电影| 国产成人99久久亚洲综合精品| 视频一区免费在线观看| 亚洲色图19p| 国产亚洲女人久久久久毛片| 欧美一激情一区二区三区| av电影天堂一区二区在线| 久久99精品久久久久久国产越南 | www国产精品av| 欧美日韩日本视频| 91免费版在线| 国产白丝网站精品污在线入口| 老司机一区二区| 日韩中文字幕1| 亚洲线精品一区二区三区八戒| 国产精品无码永久免费888| 日韩精品一区二区三区视频| 欧美丰满一区二区免费视频| 在线免费一区三区| 97久久精品人人做人人爽| 国产v综合v亚洲欧| 国产一区二区三区最好精华液| 日韩av一区二区在线影视| 午夜精品久久久| 午夜精品久久久久久久久久久| 一二三区精品视频| 一区二区三区在线视频观看58| 日韩美女视频19| 亚洲三级视频在线观看| 中文字幕一区二区三区av| 国产精品每日更新| 亚洲日本在线a| 亚洲图片激情小说| 一区二区欧美精品| 亚洲成人中文在线| 日本亚洲天堂网| 男男成人高潮片免费网站| 老司机午夜精品| 国产精品系列在线观看| 国产精品 日产精品 欧美精品| 国产成人综合网| av高清久久久| 欧美午夜片在线观看| 欧美精选一区二区| 欧美va天堂va视频va在线| 久久久综合网站| 日本一区二区久久| 亚洲人123区| 午夜电影一区二区| 紧缚捆绑精品一区二区| 国产一区二区0| av一区二区久久| 欧美体内she精高潮| 日韩一级黄色片| 久久女同精品一区二区| 亚洲视频在线一区二区| 性久久久久久久| 国产自产v一区二区三区c| av电影在线观看完整版一区二区| 在线精品视频免费观看| 欧美一区二区三区四区五区| 久久五月婷婷丁香社区| 综合激情网...| 日韩av电影免费观看高清完整版| 国产在线国偷精品免费看| 99久久久国产精品免费蜜臀| 在线播放/欧美激情| 久久久美女毛片| 亚洲午夜激情网站| 韩国精品免费视频| 91浏览器在线视频| 欧美videofree性高清杂交| 国产精品久久久久一区二区三区共| 亚洲午夜一区二区| 国产一区二区精品久久99| 色八戒一区二区三区| 精品三级av在线| 亚洲一区在线观看网站| 精品伊人久久久久7777人| 色综合亚洲欧洲| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲综合色丁香婷婷六月图片| 久久精品久久精品| 在线视频你懂得一区| 久久久国产一区二区三区四区小说 | 美美哒免费高清在线观看视频一区二区| 国产成人丝袜美腿| 欧美一区二区三区在线电影| 亚洲欧美一区二区三区极速播放| 蜜乳av一区二区| 在线观看精品一区| 国产日韩欧美精品在线| 日本成人在线网站| 欧洲人成人精品| 亚洲天天做日日做天天谢日日欢 | 国产在线精品一区二区三区不卡 | 国产盗摄女厕一区二区三区| 欧美卡1卡2卡| 亚洲自拍偷拍九九九| 从欧美一区二区三区| 日韩美女天天操| 日本欧美一区二区在线观看| 91久久精品一区二区三| 亚洲欧洲99久久| 国产aⅴ综合色| 久久亚区不卡日本| 极品少妇一区二区三区精品视频| 欧美视频中文字幕| 亚洲柠檬福利资源导航| 97se亚洲国产综合自在线观| 久久午夜电影网| 国产一区二区三区香蕉| 欧美大片免费久久精品三p| 丝袜亚洲另类欧美| 欧美日韩亚洲综合一区| 亚洲国产婷婷综合在线精品| 欧美在线观看18| 一区二区免费在线| 欧美亚洲愉拍一区二区| 亚洲综合色视频| 91久久香蕉国产日韩欧美9色| 亚洲视频一二区| 色一情一伦一子一伦一区| 亚洲精品v日韩精品| 欧美亚洲一区二区在线| 亚洲国产成人91porn| 欧美精品 国产精品| 日韩成人av影视| 精品国产伦一区二区三区观看方式| 久久精品国产亚洲aⅴ| 久久久久久久综合日本| 东方欧美亚洲色图在线| 18欧美亚洲精品| 日本久久一区二区| 亚洲国产sm捆绑调教视频| 91麻豆精品91久久久久同性| 美日韩黄色大片| 久久久精品蜜桃| 99久久精品免费看| 亚洲国产视频a| 日韩一区二区三区电影 | 久久亚洲综合色一区二区三区| 国产一区二区影院| 综合自拍亚洲综合图不卡区| 欧美性猛交xxxx乱大交退制版| 无吗不卡中文字幕| 久久色中文字幕| 成人久久18免费网站麻豆 | 国产乱子伦视频一区二区三区| 国产精品沙发午睡系列990531| 91美女在线看|