---
# System prepended metadata

title: 答速度波動過大時警報機制
tags: [sandal]

---


目前聽起來，應該是存在這個機制，只是有些行為不如預期。

error 相關的東西都在 Error.c

和 速度相關的應該是 `SPEED_TRACK` 這一項，主要就是被用在 `void		RunAwaySafe()` 

```c=15424
void		RunAwaySafe()
{
	if (u_bRunAwayPro)
	{
		if (_IQabs(SpeedPID.qErr) > u_qRunAwaySpeed && GetEnableFlag())
		{
			Disable();
			SetDriveError(AUSTONE_SPEED_TRACK);
		}
	}

}
```
這是一個叫 `u_bRunAwayPro` 功能，如果有開啟，一但error 太大就跳error。`runaway`(失控)

另一個則是 `ErrorCheckByTask()`
```c=9196
	if (GetEnableFlag() && ABS(SpeedPID.qErr) > u_qSpeedTrack)
	{
		if (++wSpeedCount > DBVALUE(MOTOR_SPEEDTRACKCOUNT).wData && DBVALUE(MOTOR_SPEEDTRACKCOUNT).wData != 0)
		{
			SetDriveError(AUSTONE_SPEED_TRACK);
			wSpeedCount = 0;
		}
    }
```
這裡個差異是有用到database 的數值 `MOTOR_SPEEDTRACKCOUNT`，看起來就是1ms中斷裡，如果速度有N次沒追上（共N\*1ms），就發警報。


```c=1732
	{{500},			_WORD,	51537,	STATUSWRITE,	2,	0,			65535,		NULL,				SetSpeedTrackCount},	//AUSTON_PARAMETER_MOTOR_SPEEDTRACKCOUNT,
```

# 結論
請在新的線段才使用新的速度去做規劃。如果直接把正在走的規劃速度\*N，那一定是會有速度的斷點，導致符合error。


