ボールねじでテーブルを動かす装置では、軸方向荷重から求めたトルクだけでモーターを選ぶと、加速時にトルクが不足することがあります。反対に、加速時の最大値だけで連続運転の可否を判断すると、モーターの熱的な余裕を正しく評価できません。
必要なのは、次の値を分けて計算することです。
- 等速運転中の負荷トルク
- 直線移動部と回転部の慣性モーメント
- 加速・減速に必要なトルク
- 運転サイクル全体の実効トルク
- 最高速度に対応するモーター回転数
この記事では、水平に設置したボールねじ駆動テーブルを例に、軸方向荷重、リード、効率、予圧、慣性、加速時間から必要トルクを求めます。最後にPythonへ実装し、モーター候補を変えながら再計算できる形へ整理します。
計算の全体像
ボールねじのモーター選定は、負荷トルクだけを一度計算して終わる作業ではありません。
flowchart TD
A["運転条件を定義"] --> B["軸方向荷重と負荷トルク"]
B --> C["慣性と加速トルク"]
C --> D["最大・実効トルクを確認"]
D --> E["回転数と製品特性を照合"]
E --> F{"条件を満たすか"}
F -- いいえ --> A
F -- はい --> G["候補を確定"]THKは、ボールねじの駆動モーターを回転数、回転トルク、最小送り量から検討し、トルクについては等速時、加速時、減速時を分けて確認するよう示しています。さらに、最大トルクを瞬時最大トルク以下、実効トルクを定格トルク以下にする必要があります。
計算条件をそろえる
例として、減速機を使わず、水平な直動ガイド上でテーブルを動かす条件を設定します。
| 項目 | 記号 | 値 |
|---|---|---|
| テーブルとワークの総質量 | m | 80 kg |
| 案内面の摩擦係数 | μ | 0.01 |
| 運転方向の外力 | F_A | 150 N |
| ボールねじのリード | P_B | 10 mm/rev |
| ボールねじ効率 | η | 0.90 |
| 予圧ナット内部摩擦係数 | μ_0 | 0.20 |
| 予圧荷重 | F_0 | 50 N |
| 最高直線速度 | v | 0.30 m/s |
| 加速時間 | t_a | 0.20 s |
| ねじ軸質量 | m_s | 5.0 kg |
| ねじ軸半径 | r_s | 0.010 m |
| カップリング慣性 | J_c | 0.000020 kg·m² |
効率、予圧荷重、予圧トルクは、ボールねじの形式、精度、予圧方式、潤滑状態によって変わります。実設計では、メーカーの仕様値を優先します。表の値は計算手順を示すための例です。
運転方向荷重を求める
傾斜角を $\theta$ とすると、運転方向荷重は次の形で表せます。
$$F=F_A+mg(\sin\theta+\mu\cos\theta)$$
水平駆動では $\theta=0$ なので、式は次のように簡単になります。
$$F=F_A+\mu mg$$
例の条件を代入します。
$$F=150+0.01\times80\times9.807=157.85\ \mathrm{N}$$
運転方向荷重は約157.85 Nです。
ここで使う外力には、加工反力、押付力、ケーブルベアの抵抗、シール抵抗など、運転方向に作用する既知の力を含めます。ガイドの摩擦係数だけで全抵抗を代表させると、実機との差が大きくなることがあります。
等速時の負荷トルクを求める
軸方向荷重をリード $P_B$ のボールねじで駆動するとき、外部荷重によるトルクは次式で求められます。
$$T_F=\frac{FP_B}{2\pi\eta}$$
予圧による摩擦トルクを、予圧荷重 $F_0$ と予圧ナット内部摩擦係数 $\mu_0$ から見積もる場合は、次の項を加えます。
$$T_P=\frac{\mu_0F_0P_B}{2\pi}$$
したがって、等速時の負荷トルクは、
$$T_L=T_F+T_P$$
です。リード10 mm/revを0.010 m/revへ換算して代入します。
$$T_F=\frac{157.85\times0.010}{2\pi\times0.90}=0.2791\ \mathrm{N\cdot m}$$
$$T_P=\frac{0.20\times50\times0.010}{2\pi}=0.0159\ \mathrm{N\cdot m}$$
$$T_L=0.2791+0.0159=0.2950\ \mathrm{N\cdot m}$$
等速時の負荷トルクは約0.295 N·mです。
予圧トルクが製品仕様として提示されている場合は、この簡易計算よりカタログ値を優先します。また、支持軸受やシールなどの損失も別途加える必要があります。
直線移動部を回転慣性へ換算する
加速トルクを求めるには、直線移動する質量をボールねじ軸上の慣性モーメントへ換算します。
$$J_W=m\left(\frac{P_B}{2\pi}\right)^2$$
例では、
$$J_W=80\left(\frac{0.010}{2\pi}\right)^2=0.0002026\ \mathrm{kg\cdot m^2}$$
となります。
ねじ軸を一様な中実円柱として近似すると、その回転軸まわりの慣性モーメントは、
$$J_S=\frac{1}{2}m_sr_s^2$$
です。
$$J_S=\frac{1}{2}\times5.0\times0.010^2=0.0002500\ \mathrm{kg\cdot m^2}$$
モーターを除いた機構側の慣性は、直線移動部、ねじ軸、カップリングを合計して、
$$J_L=J_W+J_S+J_C$$
$$J_L=0.0002026+0.0002500+0.0000200=0.0004726\ \mathrm{kg\cdot m^2}$$
機構側の慣性モーメントは約0.000473 kg·m²です。
ねじ軸に段差や中空部がある場合、単純な円柱近似では誤差が生じます。形状を区間ごとに分けるか、CADの質量特性を使って回転軸まわりの値を取得します。
加速トルクを求める
直線速度 $v$ とリード $P_B$ から、ボールねじ回転数を求めます。
$$n=\frac{60v}{P_B}$$
$$n=\frac{60\times0.30}{0.010}=1800\ \mathrm{rpm}$$
停止状態から時間 $t_a$ で一定加速度により1800 rpmへ到達するとき、角加速度は、
$$\alpha=\frac{2\pi n}{60t_a}$$
$$\alpha=\frac{2\pi\times1800}{60\times0.20}=942.48\ \mathrm{rad/s^2}$$
まず、モーター自身のローター慣性を含めない機構側だけの加速トルクを求めると、
$$T_{a,L}=J_L\alpha$$
$$T_{a,L}=0.0004726\times942.48=0.4455\ \mathrm{N\cdot m}$$
したがって、機構側から見た加速中のトルクは、
$$T_{acc}=T_L+T_{a,L}=0.2950+0.4455=0.7405\ \mathrm{N\cdot m}$$
ローター慣性を含める前の加速中トルクは約0.741 N·mです。
モーター候補を入れて再計算する
加速トルクには、モーターのローター慣性も影響します。そのため、選定は一度で完結せず、候補モーターの仕様値を入れて再計算します。
候補モーターのローター慣性を $J_M=0.000050\ \mathrm{kg\cdot m^2}$ と仮定すると、総慣性は、
$$J_{total}=J_L+J_M=0.0005226\ \mathrm{kg\cdot m^2}$$
加速トルクは、
$$T_a=J_{total}\alpha=0.4926\ \mathrm{N\cdot m}$$
したがって、加速中の必要トルクは、
$$T_{acc}=T_L+T_a=0.7876\ \mathrm{N\cdot m}$$
この値は安全率を掛ける前の計算値です。オリエンタルモーターは、必要トルクを $(T_L+T_a)S_f$ として示しています。安全率はモーター形式、速度域、負荷変動、停止精度などに応じて設定し、メーカーの選定基準と照合します。
最大トルクと実効トルクを分ける
加速時の約0.788 N·mだけでは、サーボモーターの選定は完了しません。
最大トルクは、加速や外乱が重なる瞬間に必要なピークトルクです。一方、実効トルクは運転サイクル全体の熱的な負荷を表します。工程ごとのトルクを $T_i$、継続時間を $t_i$ とすると、実効トルクは次式で求められます。
$$T_{rms}=\sqrt{\frac{\sum T_i^2t_i}{\sum t_i}}$$
選定時は、少なくとも次の二つを確認します。
- 計算した最大トルクが、対象回転数でモーターの瞬時最大トルク以下であること
- 計算した実効トルクが、モーターの定格トルク以下であること
モーターのトルクは回転数によって変わるため、定格値だけでなく速度―トルク特性上の1800 rpm付近を確認します。ドライバの電源電圧、回生能力、周囲温度、取り付け条件による制限も対象です。
Pythonで計算する
同じ計算を再利用できる関数にすると、質量、リード、速度、加速時間を変更した比較が容易になります。
from math import pi, sin, cos, radians, sqrt
def ball_screw_motor_torque(
moving_mass_kg: float,
friction_coefficient: float,
external_force_n: float,
incline_deg: float,
lead_m_rev: float,
screw_efficiency: float,
preload_force_n: float,
preload_friction_coefficient: float,
target_speed_m_s: float,
acceleration_time_s: float,
screw_mass_kg: float,
screw_radius_m: float,
coupling_inertia_kg_m2: float,
motor_inertia_kg_m2: float = 0.0,
) -> dict[str, float]:
if moving_mass_kg < 0 or screw_mass_kg < 0:
raise ValueError("mass must be non-negative")
if lead_m_rev <= 0 or acceleration_time_s <= 0:
raise ValueError("lead and acceleration time must be positive")
if not 0 < screw_efficiency <= 1:
raise ValueError("screw efficiency must be in (0, 1]")
g = 9.807
angle = radians(incline_deg)
axial_force_n = external_force_n + moving_mass_kg * g * (
sin(angle) + friction_coefficient * cos(angle)
)
external_load_torque_nm = (
axial_force_n * lead_m_rev / (2 * pi * screw_efficiency)
)
preload_torque_nm = (
preload_friction_coefficient
* preload_force_n
* lead_m_rev
/ (2 * pi)
)
load_torque_nm = external_load_torque_nm + preload_torque_nm
reflected_linear_inertia = moving_mass_kg * (lead_m_rev / (2 * pi)) ** 2
screw_inertia = 0.5 * screw_mass_kg * screw_radius_m**2
load_inertia = (
reflected_linear_inertia
+ screw_inertia
+ coupling_inertia_kg_m2
)
total_inertia = load_inertia + motor_inertia_kg_m2
speed_rpm = 60 * target_speed_m_s / lead_m_rev
angular_acceleration = 2 * pi * speed_rpm / (60 * acceleration_time_s)
acceleration_torque_nm = total_inertia * angular_acceleration
peak_torque_nm = load_torque_nm + acceleration_torque_nm
return {
"axial_force_n": axial_force_n,
"load_torque_nm": load_torque_nm,
"load_inertia_kg_m2": load_inertia,
"speed_rpm": speed_rpm,
"angular_acceleration_rad_s2": angular_acceleration,
"acceleration_torque_nm": acceleration_torque_nm,
"peak_torque_before_safety_nm": peak_torque_nm,
}
result = ball_screw_motor_torque(
moving_mass_kg=80.0,
friction_coefficient=0.01,
external_force_n=150.0,
incline_deg=0.0,
lead_m_rev=0.010,
screw_efficiency=0.90,
preload_force_n=50.0,
preload_friction_coefficient=0.20,
target_speed_m_s=0.30,
acceleration_time_s=0.20,
screw_mass_kg=5.0,
screw_radius_m=0.010,
coupling_inertia_kg_m2=0.000020,
motor_inertia_kg_m2=0.000050,
)
for name, value in result.items():
print(f"{name}: {value:.6f}")
主な結果は次のとおりです。
axial_force_n: 157.845600
load_torque_nm: 0.295051
load_inertia_kg_m2: 0.000473
speed_rpm: 1800.000000
angular_acceleration_rad_s2: 942.477796
acceleration_torque_nm: 0.492579
peak_torque_before_safety_nm: 0.787627
この関数が返すピークトルクは、一定加速度、剛体、一定効率という前提の計算値です。加速度がS字形の場合は、指令プロファイルの最大角加速度を使用します。共振、バックラッシ、ねじり剛性、制御応答は別の動特性検討が必要です。
設計データとして保存する項目
計算を表計算やWebツールへ展開する場合は、入力値、出典、結果、判定を分離して保存します。
{
"mechanism": {
"type": "ball_screw",
"lead_m_rev": 0.01,
"efficiency": 0.9,
"preload_force_n": 50.0
},
"motion": {
"moving_mass_kg": 80.0,
"target_speed_m_s": 0.3,
"acceleration_time_s": 0.2
},
"motor_candidate": {
"rotor_inertia_kg_m2": 0.00005
},
"result": {
"required_speed_rpm": 1800.0,
"peak_torque_before_safety_nm": 0.787627
}
}
効率やローター慣性には、値だけでなくメーカー名、形番、カタログ版、参照日を持たせます。これにより、部品変更や仕様改訂時に再計算すべき範囲を追跡できます。
実務で起こりやすい失敗
軸方向荷重によるトルクだけで選ぶ。
停止から所定速度へ上げるには加速トルクが必要です。移動質量だけでなく、ねじ軸、カップリング、ローターの慣性も加えます。
mm単位のリードをそのまま式へ入れる。
トルクをN·mで求める式では、リードをm/revへ換算します。10 mm/revは0.010 m/revです。
ボールねじ効率を1として扱う。
実際の効率は製品と使用条件で変わります。メーカー仕様を使い、送り方向と逆駆動で条件が異なる場合も確認します。
予圧や支持部の抵抗を落とす。
高精度な予圧ボールねじほど、予圧トルクが無視できない場合があります。支持軸受、シール、ケーブル類の抵抗も確認します。
最大トルクだけで連続運転を判定する。
瞬時最大トルクを満たしても、実効トルクが定格を超えると熱的に使用できません。加速、等速、減速、停止を含むサイクルで計算します。
ねじ軸の限界回転数を確認しない。
モーターが1800 rpmを出せても、ボールねじの危険速度、DN値、支持方法、軸端強度が許容しなければ使用できません。
垂直軸を水平軸と同じように扱う。
垂直軸では重力荷重、下降時の回生、停電時の落下防止、保持ブレーキを含めて検討します。上昇と下降でトルクの向きも変わります。
まとめ
ボールねじ駆動のモータートルクは、等速時の負荷と加速時の慣性負荷を分けて求めます。
外部荷重と予圧を含む負荷トルクは、
$$T_L=\frac{FP_B}{2\pi\eta}+\frac{\mu_0F_0P_B}{2\pi}$$
直線移動質量の換算慣性は、
$$J_W=m\left(\frac{P_B}{2\pi}\right)^2$$
加速トルクは、
$$T_a=J_{total}\alpha$$
です。必要トルクは、負荷トルクと加速トルクを合計し、用途に応じた安全率を考慮します。
計算後は、最大トルク、実効トルク、回転数、ローター慣性、速度―トルク特性をモーター仕様と照合します。さらに、ボールねじ側の許容回転数、寿命、座屈、軸端強度も確認します。
この流れをデータ化すれば、質量、リード、速度、加速時間を変更した比較や、複数のモーター候補を一括評価する選定ツールへ発展させられます。
