概要
モーターは電気エネルギーを回転運動(または直線運動)に変換するアクチュエータです。組み込みシステムでは主に以下の3種類が使われます。
**DCモーター(直流モーター)**は最もシンプルなモーターで、直流電圧を印加すると回転します。PWMで電圧を制御して回転速度を調整します。ブラシ付きDCモーター(有ブラシ)とブラシレスDCモーター(BLDC)があります。構造が単純で安価ですが、位置制御にはエンコーダーとフィードバック制御が必要です。
**ステッピングモーター(Stepper Motor)**は、パルス信号1つごとに一定の角度(ステップ角:1.8°が標準)だけ回転します。パルス数を管理することでエンコーダーなしで位置制御できる(オープンループ制御)ため、3Dプリンター・CNCに広く使われます。ただし高速・高負荷時に脱調(ステップミス)するリスクがあります。
**サーボモーター(Servo Motor)**はモーター+エンコーダー+ドライバーをパッケージ化したシステムです。フィードバック制御(クローズドループ)により、正確な位置・速度・トルク制御が可能です。ラジコン用の低コストサーボ(PWM制御)から、産業用ACサーボまで幅広いラインナップがあります。
歴史・背景
電気モーターは1831年のマイケル・ファラデーによる電磁回転実験が起源で、1880〜90年代にテスラが交流誘導モーターを実用化しました。ステッピングモーターは1950〜60年代に航空宇宙・計算機機器向けに開発され、1970〜80年代のフロッピーディスクドライブ・プリンターの普及とともに量産化されました。
ブラシレスDCモーター(BLDC)は1960年代に実用化が始まり、1990年代以降はハードディスクドライブ・CDドライブで大量生産されました。2000年代後半のマルチコプタードローン(DJI等)の普及が組み込み向けBLDCモーターの進化を大幅に加速させ、現在では安価で高性能なBLDCとESC(電子スピードコントローラー)が容易に入手できます。
産業用サーボモーターは1960〜70年代から発展し、日本のファナック・安川電機・三菱電機等が高性能製品を開発。1980〜90年代のデジタルサーボ化により制御精度が飛躍的に向上しました。
技術仕様
DCモーターの主要スペック
| パラメータ | 説明 |
|---|---|
| 定格電圧(V) | 正常動作する印加電圧 |
| 定格電流(A) | 定格負荷時の電流 |
| ストール電流(A) | 停止時の最大電流(定格の5〜10倍) |
| 無負荷回転数(RPM) | 無負荷時の最大回転数 |
| ストールトルク(N·m) | 停止直前の最大トルク |
| 逆起電力定数 Kv(RPM/V) | BLDCの特性値(1V印加時のRPM) |
| モーター定数 Km(N·m/√W) | 電力あたりのトルク効率 |
ステッピングモーターの主要スペック
| パラメータ 代表値 |
|---|
| ステップ角 |
| マイクロステッピング |
| 保持トルク |
| 相電流(A/相) |
| コイル抵抗(Ω/相) |
| インダクタンス(mH/相) |
| 相数 |
代表的なモータードライバICの比較
| IC | 対応モーター | 最大電流 | 電源電圧 | インターフェース |
|---|---|---|---|---|
| L298N | DC/ステッパー(2ch) | 2A/ch | 5〜35V | PWM + DIR |
| DRV8833 | DC(2ch)/ステッパー(1ch) | 1.5A/ch | 2.7〜10.8V | PWM(2本/ch) |
| TB6612FNG | DC(2ch)/ステッパー | 1.2A(3.2Apeak) | 2.5〜13.5V | PWM + DIR |
| A4988 | ステッパー | 2A(35V以下) | 8〜35V | STEP/DIR |
| DRV8825 | ステッパー | 2.5A(45V以下) | 8.2〜45V | STEP/DIR |
| TMC2209 | ステッパー(静音) | 2A | 4.75〜29V | STEP/DIR+UART |
| VESC | BLDC/ACサーボ | 100A+ | 8〜100V | CAN/UART |
動作原理
DCモーターの電気的モデル
DCモーターの動作は電気方程式と機械方程式で記述されます。
電気方程式:
V = R×I + L×(dI/dt) + Ke×ω
機械方程式:
J×(dω/dt) = Kt×I - B×ω - T_load
V: 印加電圧[V]
R: 電機子抵抗[Ω], L: インダクタンス[H]
I: 電流[A], ω: 角速度[rad/s]
Ke: 逆起電力定数[V·s/rad] ≈ Kt(SI単位系では等しい)
Kt: トルク定数[N·m/A]
J: 慣性モーメント[kg·m²], B: 粘性摩擦[N·m·s/rad]
定常状態(dI/dt = 0, dω/dt = 0):
ω = (V - R×I) / Ke
T = Kt × I = Kt × (V - Ke×ω) / R
ステッピングモーターの駆動方式
バイポーラ型2相ステッピングモーターの各駆動方式:
1-2相励磁(ハーフステップ):
ステップ: 1 2 3 4 5 6 7 8
A相電流: +I +I 0 -I -I -I 0 +I
B相電流: 0 +I +I +I 0 -I -I -I
→ ステップ角: 1.8° / 2 = 0.9°(滑らかな動き)
マイクロステッピング(1/16ステップの場合):
A相: sin(θ) × I_max
B相: cos(θ) × I_max
θ を 360°/200/16 ≈ 0.113° ずつ変化させる
→ TMC2209等のドライバICがストレート電流波形を生成
BLDCモーター(ブラシレスDC)の制御
BLDCモーターはブラシの代わりに電子的に位相を切り替える必要があります(ESC: Electronic Speed Controller)。
3相BLDCの6ステップ転流(トラペゾイダル制御):
U相 V相 W相
1: + - 0
2: + 0 -
3: 0 + -
4: - + 0
5: - 0 +
6: 0 - +
ホールセンサー(3個)で回転子位置を検出 → 転流タイミングを決定
FOC(Field Oriented Control):
より高性能な制御方式
クラーク変換 + パーク変換でd-q軸制御
→ 低速・高トルク・効率が大幅に向上
PID制御によるDCモーター速度制御
typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
float output_min, output_max;
} PID_t;
float pid_update(PID_t *pid, float setpoint, float measured, float dt) {
float error = setpoint - measured;
pid->integral += error * dt;
// インテグレータワインドアップ防止
if (pid->integral > pid->output_max / pid->Ki)
pid->integral = pid->output_max / pid->Ki;
if (pid->integral < pid->output_min / pid->Ki)
pid->integral = pid->output_min / pid->Ki;
float derivative = (error - pid->prev_error) / dt;
pid->prev_error = error;
float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
// 出力クリッピング
if (output > pid->output_max) output = pid->output_max;
if (output < pid->output_min) output = pid->output_min;
return output;
}
// モーター速度制御ループ
void motor_control_loop(void) {
static PID_t pid = {.Kp=1.0f, .Ki=0.1f, .Kd=0.05f,
.output_min=-100, .output_max=100};
float setpoint_rpm = 500.0f;
float measured_rpm = encoder_get_rpm();
float dt = 0.001f; // 1ms制御周期
float duty = pid_update(&pid, setpoint_rpm, measured_rpm, dt);
motor_set_pwm_percent(duty); // -100%〜+100%(正逆転)
}
用途・ユースケース
3Dプリンター・CNC加工機
ステッピングモーター(通常NEMA 17、1.8°/step)をA4988/DRV8825/TMC2209等のドライバーでマイクロステッピング制御します。RepRapファームウェア(Marlin)がSTM32/AVR上で動作し、G-codeを解釈してモーターを制御します。
3Dプリンターの軸解像度例:
ステップ角: 1.8°, マイクロステッピング: 1/16
ベルト/プーリー: GT2ベルト(2mm/周), 20歯プーリー(40mm/回転)
1ステップの移動量:
= (40mm / 200ステップ) × (1/16)
= 0.0125mm/ステップ = 12.5μm
ドローン・マルチコプター
BLDCモーター(KV値数百〜数千RPM/V)をESC(PWM信号で制御)で駆動します。4軸ドローンでは4個のモーターの回転数差で姿勢・移動を制御します。IMUとセンサーフュージョンによるPID制御が不可欠です。
自律走行ロボット
差動駆動(2輪)または全方位駆動(メカナムホイール)に直流モーター+エンコーダーを使います。エンコーダーのパルスカウントでオドメトリ(距離・方向推定)を行い、IMUと組み合わせた位置推定で自律走行します。
産業用ロボットアーム
6軸垂直多関節ロボットに各軸1台のACサーボモーター(エンコーダー内蔵)を使います。CANbusまたはEtherCATでモーションコントローラーと接続します。位置分解能は数十万カウント/回転が一般的です。
電動補助自転車(e-Bike)・電動スクーター
ハブモーター(ホイール内蔵BLDCモーター)またはミッドドライブモーター(クランク付近のBLDC)にFOC制御を適用します。バッテリー管理・踏力センサーとのセンサーフュージョンでアシスト量を制御します。
実装・開発のポイント
ステッピングモーター(A4988)の基本制御
#include "stm32f4xx_hal.h"
#define STEP_PIN GPIO_PIN_0 // PA0
#define DIR_PIN GPIO_PIN_1 // PA1
#define EN_PIN GPIO_PIN_2 // PA2(LOW=有効)
void stepper_init(void) {
HAL_GPIO_WritePin(GPIOA, EN_PIN, GPIO_PIN_RESET); // 有効化
}
// steps: ステップ数(正=時計回り, 負=反時計回り)
// delay_us: 1ステップあたりの遅延(回転速度を決める)
void stepper_move(int32_t steps, uint32_t delay_us) {
if (steps > 0) {
HAL_GPIO_WritePin(GPIOA, DIR_PIN, GPIO_PIN_SET); // CW
} else {
HAL_GPIO_WritePin(GPIOA, DIR_PIN, GPIO_PIN_RESET); // CCW
steps = -steps;
}
for (int32_t i = 0; i < steps; i++) {
HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_SET);
delay_us_timer(delay_us / 2);
HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_RESET);
delay_us_timer(delay_us / 2);
}
}
// 速度ランプ(台形加速)で滑らかに動かす
void stepper_move_trapezoidal(int32_t total_steps,
uint32_t accel_steps,
uint32_t max_speed_us,
uint32_t min_speed_us) {
int32_t abs_steps = (total_steps > 0) ? total_steps : -total_steps;
HAL_GPIO_WritePin(GPIOA, DIR_PIN,
total_steps > 0 ? GPIO_PIN_SET : GPIO_PIN_RESET);
for (int32_t i = 0; i < abs_steps; i++) {
uint32_t delay;
if (i < accel_steps) {
// 加速フェーズ
delay = min_speed_us - (min_speed_us - max_speed_us) * i / accel_steps;
} else if (i > abs_steps - accel_steps) {
// 減速フェーズ
delay = min_speed_us - (min_speed_us - max_speed_us) * (abs_steps - i) / accel_steps;
} else {
delay = max_speed_us; // 定速フェーズ
}
HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_SET);
delay_us_timer(delay / 2);
HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_RESET);
delay_us_timer(delay / 2);
}
}
RCサーボモーターの制御(50Hz PWM)
// RCサーボ: 50Hz(20ms周期)のPWMで角度制御
// パルス幅: 1ms(0°) 〜 1.5ms(90°) 〜 2ms(180°)
void servo_set_angle(uint8_t angle_deg) {
// パルス幅をμsで計算: 1000〜2000μs(0〜180°)
uint32_t pulse_us = 1000 + (uint32_t)angle_deg * 1000 / 180;
// TIMxのCCRを更新(PSC, ARRはサーボ用に設定済み)
// ARR = 20000-1 (20ms周期, 1μsティック), PSC = 84-1
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulse_us);
}
エンコーダーによる速度計測
// TIM3をエンコーダーモードで設定(STM32 HAL)
// TIM3_CH1: A相, TIM3_CH2: B相 (相補入力)
int32_t encoder_read_count(void) {
return (int32_t)__HAL_TIM_GET_COUNTER(&htim3);
}
void encoder_reset(void) {
__HAL_TIM_SET_COUNTER(&htim3, 0);
}
// 速度計算(10msタイマー割り込みで呼び出す)
float encoder_get_rpm(void) {
static int32_t last_count = 0;
int32_t current_count = encoder_read_count();
int32_t delta = current_count - last_count;
last_count = current_count;
const float PPR = 1000.0f; // エンコーダー分解能(パルス/回転)
const float DT_S = 0.01f; // 10ms
return (delta / PPR) * 60.0f / DT_S; // RPM
}
他技術との比較
DCモーター vs ステッピングモーター vs サーボモーターの比較
| 比較項目 | DCモーター | ステッピングモーター | サーボモーター |
|---|---|---|---|
| 制御方式 | オープンループ(速度)/クローズドループ(位置) | オープンループ(通常) | クローズドループ |
| 位置精度 | エンコーダー必要 | 脱調しなければ高い | 非常に高い |
| 脱調リスク | なし | あり(高速・高負荷) | なし |
| 停止時の発熱 | なし(電流なし) | あり(保持電流が流れる) | なし(フィードバック制御) |
| 回転速度 | 高い(数千RPM) | 低め(〜1000RPM実用域) | 中〜高(制御次第) |
| トルク特性 | 速度に反比例 | 低速高トルク、高速で急落 | 全速域で安定 |
| コスト | 安い | 安〜中(ドライバIC含む) | 高い |
| 代表用途 | ファン・ポンプ・ドローン | 3Dプリンター・CNC | 産業ロボット |
ブラシ付きDCモーター vs ブラシレスDCモーター(BLDC)
| 比較項目 | ブラシ付きDC | ブラシレスDC(BLDC) |
|---|---|---|
| 構造 | ブラシ+整流子 | 電子転流(ESC/ドライバ) |
| 寿命 | 短い(ブラシ摩耗) | 長い(接触部なし) |
| ノイズ・EMI | 多い(ブラシ放電) | 少ない |
| 効率 | 中(75〜85%) | 高い(85〜95%) |
| 制御難易度 | 容易(H-Bridge+PWM) | 高い(転流制御必要) |
| コスト | 安い | 中(ESCが必要) |
| 代表用途 | おもちゃ・DIYロボット | ドローン・電動工具・EV |