高所作業車自作 その8 油圧ポンプ制御

農業用の高所作業車は他にメーカー製アーム式のものが2台あるので、果樹園の普段の農作業用としてはそちらを主に使っています。
パンタグラフ式の高所作業車を製作して10年近くになります。使用頻度はそれ程多くはないのですが農業用施設の屋根のメンテナンスなどで時々便利に使ってきました。

昇降用の油圧シリンダーと油圧回路

この高所作業車に使用している油圧シリンダーは最初からきちんと設計して購入したものではなく、中古品を適当な判断で購入したものです。また、油圧ポンプも2016年当時「12Vタンク一体型スノウプラウ油圧ユニット」として手に入るものを購入したものです。
はじめて動作させたとき上昇速度が少し速すぎると感じたため、油圧ユニットとシリンダーとの間に「流量制御弁」を挿入して上昇速度を調整してきました。その動作原理は油圧回路(油圧の通り道)を機械的に絞るだけなので、油圧ポンプのモーターに掛かる負荷がその分大きくなり、その結果バッテリーの消耗が激しいと感じてきました。

油圧シリンダー、油圧ユニット 製作当時の様子

油圧ポンプ・モーターのPWM制御

これを解決するために油圧ポンプのモーターをPWM制御して回転数を落とすことで、油圧の流量を調整できないかと考えてきました。

大きな課題はモーターに流れる電流が特大の大電流であることです。
モーターの仕様上は DC12V 1.5KW ・・・ I = 1500W/12V = 125A となります。
実際に負荷の掛かった状態で簡易的に計測してみると 200A 近く流れるようです。

これを制御する回路の設計は簡単にはできそうに思えませんでした。(考えているだけで数年を要してしまいました)
やっと気力が出てきたのでダメ元でもと作ってみることにしました。

油圧ポンプ・モーターとPWM制御回路

PWM制御回路

何回か試行錯誤する中でバグを無くして最終的に回路が確定しました。ここに至るまでに何回も修正を行いました。FET を損傷する事故もありましたが10個中の1個に留まり、何とか無事に動作できるようになりました。

完成した基板(裏側の様子)

作業台が空の時と人が載った時とでは負荷が大きく変わるため、上昇速度も大きく変わってしまいます。自動速度制御も考えましたが難しくなるので諦めて、手元の押しボタンスイッチで3段階(強・中・弱)の上昇速度を自分で選んで押すようにしました。
いずれかのスイッチを押すと制御回路(モーター駆動)の電源が入ると共に、どのスイッチが押されたかの信号も伝わります。それによってあらかじめ決められたデューティー比のPWMでモーターが駆動されます。

昇降スイッチの様子

最終的な回路図を次に示します。

油圧ポンプ・モーターPWM制御回路

PWM制御 プログラム

PWM信号はPIC12F1822で作り出します。プログラムを下に示します。(大したプログラムではありません)
手元スイッチにより電源が供給されるとプログラムが起動してPWMの信号を出力します。
手元スイッチを離すと全ての電源供給が無くなるためPWM信号も停止します。

PIC12F1822 プログラム(CCSC)

// *******************************************************
// 高所作業車 油圧モーター制御 プログラム
//   コンパイラ CCS-PCM
//  2026/1/10 Denbei
//
// 作動SW 4個を利用して出力調整 上昇1(最大PW)/上昇2/上昇3(最小PW)/下降
// *******************************************************
// Ver.1.00

#include <12f1822.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, MCLR, BROWNOUT
#use delay(clock=16MHz)
#use fast_io(a)    // 入出力命令の前で入出力設定は行わない

#define PWM PIN_A5 // PWM OUT
// UP3SW PIN_A4    // UP3_SW
// PIN_A3          // ~MCLR PICKIT3_Vpp
// UP2SW PIN_A2    // UP2_SW
// PIN_A1          // PICKIT3_ICSPCLK
// PIN_A0          // PICKIT3_ICSPDATT
#define UP_SW (input_a() & 0b00010100) // 0:UP1SW 0x04:UP2SW 0x10:UP3SW

void main(void)
{
  int8 duty;   // PWMデューティー用

  setup_oscillator(OSC_16MHZ); // クロック16MHz
  output_bit(PWM, 1);     // PWM出力 1:OFF 0:ON 
  set_tris_a(0b00011111); // 1:入力 0:出力

  // PWM設定
  setup_CCP1(CCP_OFF | CCP1_A5); // 最初はPWMを止めておく
  setup_timer_2(T2_DIV_BY_4, 200, 1); // φ/4/4=1MHz T=1/1MHz=1us PR=200 ポストスケーラ1/1 PWM周期200μs(5kHz)
// set_pwm1_duty(duty); // 201:0% ~ 0:100%
 
  delay_ms(100);  // 起動待ち 要調整

  // 上昇スイッチ判定
  switch(UP_SW){
    case 0:      // UP1SW
      duty = 46;   // 77%
      break;
    case 0x04:   // UP2SW
      duty = 60;   // 70%
      break;
    case 0x10:   // UP3SW
      duty = 74;   // 63%
      break;
    default:
      duty = 74;   // 63%
    }

  // 上昇動作
  set_pwm1_duty((int8)duty);     // デューティー値設定
  delay_ms(10);
  setup_CCP1(CCP_PWM | CCP1_A5); // モーター回転
  while(TRUE);       // 電源停止(押し釦解放)でモーターとプログラムが同時停止
}

動作結果

回路のバグが無くなった後の試運転では問題なく動作しています。FETの発熱はそれ程ではありません。オーバースペックだったかもしれませんが、商用ではないので安全重視です。
長時間上昇し続けることはあり得ないのでON時間は数秒以内ですし、異常があったときは押しボタンを放せば電源が即切断されます。

本格動作はこれからです。バッテリーの持ちも含めて確認していきたいと思います。
自分が乗っていて万一FETが焼損し短絡状態になったときには最大速度(PWM100%)で上昇することになります。最悪の場合、回路が焼損することも想定されます。その時には直ぐに上昇スイッチを放す心構えが必要です(自己責任)。