(57)【要約】    【課題】パワーステアリング制御装置の制御処理間において、割込禁止をすることなくデータの受け渡しを可能ならしめる。    【解決手段】パワーステアリング制御のための複数の制御処理を、割込を用いながら実行可能なパワーステアリング制御装置において、前記複数の制御処理のうちの第１、第２の制御処理間において受け渡すべきデータを保持するための複数のバッファを備え、割込を禁止せずに前記バッファの各々を順に用いて前記データを第１、第２の制御処理間において受け渡す。【選択図】図３
2007008445.tif 000002
【特許請求の範囲】
【請求項１】
パワーステアリング制御のための複数の制御処理を、割込を用いながら実行可能なパワーステアリング制御装置であって、
前記複数の制御処理のうちの第１、第２の制御処理間において受け渡すべきデータを保持するための複数のバッファを備え、
割込を禁止せずに前記バッファの各々に対して最新のデータを順に書き込むことにより、当該データを第１、第２の制御処理間において受け渡すことを特徴とするパワーステアリング制御装置。
【請求項２】
前記制御処理は割込優先度の異なる処理を含み、第１、第２の制御処理のうち、割込優先度の低い側の第１の制御処理において、前記複数のバッファのうちのいずれのバッファにデータを書き込むかを決定し、当該バッファに対して第１、第２の制御処理においてデータの読み書きを行うことを特徴とする請求項１に記載のパワーステアリング制御装置。
【請求項３】
前記複数のバッファのうち、最新のデータが書き込まれたバッファを指し示すステータス情報をさらに備え、第１、第２の制御処理は当該ステータス情報で示されたバッファを介してデータの受け渡しを行うことを特徴とする請求項２に記載のパワーステアリング制御装置。
【請求項４】
前記複数のバッファの各々は複数のデータを保持可能な配列若しくは構造体からなることを特徴とする請求項１乃至３のいずれかに記載のパワーステアリング制御装置。
【請求項５】
前記配列若しくは構造体を構成する変数の各々のアドレスを前記ステータス情報として使用することを特徴とする請求項３に記載のパワーステアリング制御装置。
【請求項６】
パワーステアリング制御のための複数の制御処理を、割込を用いながら実行可能なパワーステアリング制御方法であって、
前記複数の制御処理のうちの第１、第２の制御処理間において、割込を禁止することなく複数のバッファの各々を順に用いてデータを受け渡すことを特徴とするパワーステアリング制御方法。
【請求項７】
前記制御処理は割込優先度の異なる処理を含み、第１、第２の制御処理のうち、割込優先度の低い側の第１の制御処理において、前記複数のバッファのうちのいずれのバッファにデータを書き込むかを決定し、当該バッファに対して第１、第２の制御処理においてデータの読み書きを行うことを特徴とする請求項６に記載のパワーステアリング制御方法。
【請求項８】
前記複数のバッファのうち、最新のデータが書き込まれたバッファを指し示すステータス情報をさらに備え、第１、第２の制御処理は当該ステータス情報で示されたバッファを介してデータの受け渡しを行うことを特徴とする請求項７に記載のパワーステアリング制御方法。
【請求項９】
前記複数のバッファの各々は複数のデータを保持可能な配列若しくは構造体からなることを特徴とする請求項６乃至８のいずれかに記載のパワーステアリング制御方法。
【請求項１０】
前記配列若しくは構造体を構成する変数の各々のアドレスを前記ステータス情報として使用することを特徴とする請求項８に記載のパワーステアリング制御方法。
【請求項１１】
パワーステアリング制御のための複数の制御処理を、割込を用いながら実行可能なパワーステアリング制御プログラムであって、
前記複数の制御処理のうちの第１、第２の制御処理間において、割込を禁止することなく複数のバッファの各々を順に用いてデータを受け渡すことを特徴とするパワーステアリング制御プログラム。
【請求項１２】
前記制御処理は割込優先度の異なる処理を含み、第１、第２の制御処理のうち、割込優先度の低い側の第１の制御処理において、前記複数のバッファのうちのいずれのバッファにデータを書き込むかを決定し、当該バッファに対して第１、第２の制御処理においてデータの読み書きを行うことを特徴とする請求項１１に記載のパワーステアリング制御プログラム。
【請求項１３】
前記複数のバッファのうち、最新のデータが書き込まれたバッファを指し示すステータス情報をさらに備え、第１、第２の制御処理は当該ステータス情報で示されたバッファを介してデータの受け渡しを行うことを特徴とする請求項１２に記載のパワーステアリング制御プログラム。
【請求項１４】
前記複数のバッファの各々は複数のデータを保持可能な配列若しくは構造体からなることを特徴とする請求項１２乃至１３のいずれかに記載のパワーステアリング制御プログラム。
【請求項１５】
前記配列若しくは構造体を構成する変数の各々のアドレスを前記ステータス情報として使用することを特徴とする請求項１３に記載のパワーステアリング制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアによる複数の処理における割り込み処理を円滑に行うことのできるパワーステアリング制御装置、方法、およびプログラムに関する。
【背景技術】
【０００２】
自動車用の補助操舵装置として、電動モータのトルクを用いた電動パワーステアリング装置が利用されている。このパワーステアリング装置は、ドライバによるハンドルの操作を検出するトルクセンサと、トルクセンサからの検出信号に基づき補助操舵力を演算するパワーステアリング制御装置（ＥＣＵ）と、当該制御装置からの出力信号に基づき回転トルクを発生する電動モータと、回転トルクをステアリング機構に伝える減速ギア等を備えて構成されている。
【０００３】
上述のパワーステアリング制御装置は、CPU、メモリ等を含むコンピュータにより構成されており、予め定められたソフトウェアプログラムを実行することにより、複数の処理を実現可能なものである。ソフトウェアによる処理内容としては、トルクセンサおよび車速センサからの信号を入力して電流指令値を算出する電流指令値演算処理、電流指令値に基づきモータ駆動用のＰＷＭ（パルス幅変調）信号を生成する電流制御処理、レゾルバ等によって検出されたモータの回転角に基づき角速度及び角加速度を演算するための回転角演算処理、角速度等に基づき電流指令値に対する各種補償制御を行うための補償制御処理等がある。
【０００４】
これらの処理は所定のタイミングで実行されるものであり、実行タイミングは割り込みまたはタイマー等によって決定される。例えば、上述の電流指令値演算処理、補償制御処理は一定の周期で実行されるものであり、割り込みによらずに実行可能なものである。一方、電流制御処理はＰＷＭコントローラからの割り込みにより実行されるものであり、PWM信号の所定周期毎に割込が発生し、PWM信号に同期した処理が実行される。PWM信号の周期が５０μsec、割込周期がPWM信号の５周期である場合には、２５０μsec毎に電流制御処理が実行されることになる。また、回転角演算処理は、電流制御処理も２５０μsec〜４msecの範囲において割り込みにより実行されるものであるが、割り込みの優先順位は上述の電流制御処理の割り込み優先順位よりも低く設定されている。
【０００５】
このように、パワーステアリング制御装置においては、割り込みによって実行される割込処理と、割り込みによらずに実行される非割込処理とが混在している。また、割込処理の間でも、割込優先順位の高低は様々である。非割込処理、および割込優先順位の異なる複数の割込処理の間でデータを円滑に受け渡す必要があるが、割込を無制限に許容すると受け渡そうとするデータが変更されてしまうことがある。例えば、割込処理である回転角演算処理から非割込処理である補償制御処理に角速度のデータを受け渡す場合、回転角演算処理の割込みによって角速度のデータが変更され、正常なデータの受け渡しがなされなくなることがある。また、パワーステアリング制御装置においては、電流指令値データ、モータ温度のデータ、車速信号データ、制御状態のデータ等の複数のデータを、各々の制御タイミング毎にまとめて受け渡す必要があり、他の制御タイミングにおけるデータと混同して受け渡されると、データ間に矛盾が生じ、正しい制御を行うことができなくなるおそれがある。このため、データ受け渡し時における割込処理を禁止し、データが破壊されてしまうことを未然に防止しようとしている。
【０００６】
しかしながら、不適切な割込禁止がなされると、必要な割込処理までも禁止されてしまい、システムが正常に動作しなくなることもある。このため、プログラム上において割込禁止の管理は厳格になされなければならない。割込処理が多くなると、割込禁止を矛盾無く実行させるためのプログラム設計、検証労力に費やす労力は膨大なものとなる。
【０００７】
かかる問題を回避するために、例えば特開２００３−２９９６８号公報に示された技術が案出されている。この先行技術は、割込ルーティン間のデータ受け渡しを行う際に、割込ルーティンそれぞれに専用の変数を用意し、優先順位の低い割込ルーティンの最初及び最後の割込禁止区間内にて自己の変数にセットされたデータを相手の変数にコピーすることにより、割込禁止処理の低減を行うことを目的としている。
【０００８】
しかしながら、当該先行技術は、異なるルーティン間のデータの受け渡しを１個（１セット）の変数を用いて行うにすぎないため、例えばデータを変数に受け渡す場合に割込が発生すると、データが破壊されてしまうことがある。このため、当該先行技術においては、データを変数に受け渡す際に割込を禁止しなければならず、適切な割込禁止処理のためのソフトウェア開発労力を十分に低減することはできなかった。
【特許文献１】特開２００３−２９９６８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
本発明は上述の課題に鑑みてなされたものであり、本発明の解決しようとする課題は、複数のバッファを順に使用することにより、割込禁止をすることなく異なる処理間においてデータの受け渡しを可能ならしめることにある。
【課題を解決するための手段】
【００１０】
上述の課題を解決するために、本発明は、パワーステアリング制御のための複数の制御処理を、割込を用いながら実行可能なパワーステアリング制御装置であって、前記複数の制御処理のうちの第１、第２の制御処理間において受け渡すべきデータを保持するための複数のバッファを備え、割込を禁止せずに前記バッファの各々を順に用いて前記データを第１、第２の制御処理間において受け渡す。
【００１１】
前記制御処理は、割込優先度の異なる処理を含み、第１、第２の制御処理のうち、割込優先度の低い側の第１の制御処理において、前記複数のバッファのうちのいずれのバッファにデータを書き込むかを決定し、当該バッファに対して第１、第２の制御処理においてデータの読み書きを行う。
【００１２】
前記複数のバッファのうち、最新のデータが書き込まれたバッファを指し示すステータス情報をさらに備え、第１、第２の制御処理は当該ステータス情報で示されたバッファを介してデータの受け渡しを行う。
【００１３】
前記複数のバッファの各々は複数のデータを保持可能な配列からなる。また、前記配列若しくは構造体を構成する変数の各々のアドレスは前記ステータス情報として使用可能である。
【発明の効果】
【００１４】
本発明によれば、複数の制御処理のうちの第１、第２の制御処理間において、割込を禁止することなく複数のバッファの各々を順に用いてデータを受け渡すことができる。すなわち、複数のバッファを順に用いることにより、一つのバッファにデータを読み書きする際においても他のバッファを用いてデータの受け渡しをすることができるため、この間においても割込を禁止せずに済む。従って、割込を禁止することなく、データの受け渡しを行うことができ、割込禁止に伴うソフトウェア開発労力を軽減することができる。
【００１５】
また、第１、第２の制御処理のうち、割込優先度の低い第１の制御処理において、前記複数のバッファのうちのいずれのバッファにデータを書き込むかを決定し、当該バッファに対して第１、第２の制御処理においてデータの読み書きを行う。割込優先度の高い第２の制御処理は、割込優先度の低い第１の制御処理によって指定されたバッファに対してデータの読み書きを行うため、バッファが割込優先度の高い制御処理によって変更されてしまうことを回避できる。
さらに、ステータス情報によって、データを書き込むべきバッファを指し示すことにより、いずれの制御処理に対してデータの読み書きを行うべきかを判断することができる。
【発明を実施するための最良の形態】
【００１６】
以下に、図面を参照しながら本発明の最良の実施の形態を説明する。
図１は、本実施形態に係る電動パワーステアリング装置の概略図である。この図において、ステアリング６１はステアリングシャフト６２、ユニバーサルジョイント６３、６４、シャフト６５を介してラック＆ピニオン６６に連結されている。さらに、ラック＆ピニオン６６には車輪のタイロッド６７が設けられており、ハンドル６１の回転運動はタイロッド６７の軸方向の運動に変換される構造となっている。
【００１７】
シャフト６５にはトルクセンサ４が設けられており、トルクセンサ４はステアリング６１に印加された操舵トルクを検出し、トルク信号を出力可能である。さらに、シャフト６５には減速ギア３１、モータ３が取り付けられており、モータ３の回転トルクが減速ギア３１を介してシャフト６５に伝達される構成となっている。
【００１８】
電動パワーステアリング制御装置（ＥＣＵ）１は上述のようにトルクセンサ４からのトルク信号、車速センサ２からの車速信号に基づき補助操舵トルクを算出し、この算出結果に基づく駆動電流をモータ３に送出するものである。パワーステアリング制御装置１にはイグニッションキー５ａを介して電源５が接続されており、イグニッションキー５ａをオンにすることによりＥＣＵ１に電流が供給される構成となっている。
【００１９】
図２はパワーステアリング制御装置１のハードウェア構成を表すブロック図である。パワーステアリング制御装置１は、Ａ／Ｄコンバータ１１０，インタフェース１１１，割込コントローラ１１２、ＣＰＵ１１３，ＲＯＭ１１４，ＲＡＭ１１５、フラッシュROM１１６、ＰＷＭコントローラ１１７，モータ駆動回路１１９、モータ電流検出回路１２０、バス１２１等を備えて構成されている。
【００２０】
バス１２１はＡ／Ｄコンバータ１１０、インタフェース１１１、割込コントローラ１１２、ＣＰＵ１１３、ＲＯＭ１１４、ＲＡＭ１１５等の間でデータの送受信を行うためのものである。Ａ／Ｄコンバータ１１０は、トルクセンサ４から出力されたメイントルク信号およびサブトルク信号、モータ電流検出回路１２０からの検出電流、モータ３の端子間電圧を入力し、ディジタル信号に変換するためのものである。
【００２１】
上述のトルクセンサ４は、メイントルク信号、サブトルク信号の２つの出力信号を備え、これらの信号の合計電圧は一定電圧（例えば５Ｖ）であるクロス特性となるように設定されている。すなわち、ステアリングにトルクが印加されない場合には、メイントルク信号およびサブトルク信号はそれぞれトルク中立電圧２．５Ｖとなり、ステアリングに何らかのトルクが印加された場合には、メイントルク信号およびサブトルク信号は中立電圧２．５Ｖを基準として互いに逆方向に変動する。
【００２２】
インタフェース１１１は車速センサ２からの車速パルスをカウントしディジタル信号に変換するものである。ＲＯＭ１１４はモータ３の制御プログラム、ＰＷＭの演算プログラム、フェールセーフプログラム等を記憶するためのメモリとして使用され、ＲＡＭ１１５は当該プログラムを動作させるためのワークメモリとして使用される。フラッシュＲＯＭ１１６は、イグニッションキー５ａがオフになった後においてもメモリ内容を保持可能なものである。このフラッシュＲＯＭ１０９は、例えば制御学習結果等を記憶することが可能である。
【００２３】
ＰＷＭコントローラ１１７はモータ３のトルクを表す信号をパルス幅変調されたデューティ指令値Ｗ，Ｖ，Ｕ，Ｗｂ，Ｖｂ，Ｕｂに変換するためのものである。ここで、パルス信号Ｗ，Ｖ，Ｕは正相の三相信号を表し、パルス信号Ｗｂ，Ｖｂ，Ｕｂは逆相の三相信号を表している。
【００２４】
モータ駆動回路１１９は、WVUの三相電流を発生させるためのインバータ回路より構成されており、ＰＷＭコントローラ１１７から与えられた信号に基づき所定のデューティ比の三相電流をモータ３に供給可能である。
【００２５】
モータ電流検出回路１２０は抵抗等の電流−電圧変換素子から構成され、モータ３への駆動電流を検出し、電流に応じた電圧を有する電流検出値を出力するためのものである。電流検出値は図示されていない増幅回路によって増幅された後、Ａ／Ｄコンバータ１１０に入力され、ディジタル信号に変換される。なお、図示されていないが、モータ３には回転角を検出するためのレゾルバが設けられており、レゾルバからの回転角信号はＡ／Ｄコンバータ１１０に入力される構成となっている。また、モータ３にはモータ温度を検出するための温度センサ（未図示）が設けられており、温度センサからの温度信号も同様にＡ／Ｄコンバータ１１０に入力されている。このように、温度センサからの信号を監視することにより、モータ３の過熱を防止することが可能である。
【００２６】
割込コントローラ１１２は割込処理を制御するためのものであり、ハードウェア割込、タイマー割込、ソフトウェア割込等の割込をプログラムに従い実行させる機能を備えている。また、割込コントローラ１１２に割込禁止の命令を与えることにより、割込処理を禁止させることが可能である。
【００２７】
図３に、電動パワーステアリング制御装置１におけるタスク処理の概要を表す。これらのタスク処理は主にＣＰＵ１１３によって実行されるものであり、その実行手順はＣ言語等のプログラムによって表されているものである。電動パワーステアリング制御装置におけるタスク処理としては、大別してトルク演算処理３０、モータ制御処理３１、補償制御処理３２、センサ処理３３に分類することができる。トルク演算処理３０は車速信号、トルク信号に基づき操舵補助トルクを演算するためのものであり、非割込処理によって２msec周期で実行される。トルク演算処理３０によって生成された電流指令値は加算器３０３を介してモータ制御処理３１に与えられる構成となっている。
【００２８】
モータ制御処理３１は電流制御処理３１０、ディーティ演算処理３１１を含んでおり、これらの処理は割込により２０μsec〜１msec周期で実行される。なお、モータ制御処理３１の割込優先度は高く、他の処理よりも優先して実行される。電流制御処理３１０は、電流検出回路１２０によって検出されたモータ電流が電流制御値に一致するような制御を行うものであり、いわゆるＰＩＤ制御を用いて実行される。
【００２９】
デューティ演算処理３１１は、電流制御処理３１０によって演算された結果に基づき、ＰＷＭ信号におけるパルスのデューティ値を演算するための処理である。算出されたデューティ値はモータ駆動回路１１９に与えられ、モータ駆動回路１１９はデューティ値に基づきインバータ回路を駆動することによって三相の駆動電流を出力する。
【００３０】
センサ処理３３は、レゾルバ等の回転センサ３４からの検出信号に基づき、モータの角速度、角加速度を算出するための処理である。すなわち、角速度処理３３１はモータの角速度を算出し、角加速度処理３３０は角速度の差分に基づきモータの角加速度を算出する。なお、センサ処理３３は割込処理によって２５０μsec〜４msec周期で実行されるものであるが、センサ処理３３の割込優先度は上述のモータ制御処理３１の割込優先度よりも低く設定されている。
【００３１】
補償制御処理３２は、収れん性処理３２０、慣性補償処理３２１、ＳＡＴ（セルフアライニングトルク）推定処理３２２を有しており、トルク演算処理３０における電流指令値に対する補償を行うものである。収れん性処理３２０はモータの角速度に基づき、制御の収れん性を改善させるための補償値を算出する処理である。また、慣性補償処理３２１はトルク信号の微分値と車速信号とに基づき、高速走行時における操舵フィーリングを改善させるためのものである。すなわち、モータは大きな慣性モーメントを持っているため、高速走行時における操舵フィーリングが慣性感を持ったものとなってしまうことから、慣性補償処理３２１によって慣性感を打ち消す処理を行っている。
【００３２】
ＳＡＴ推定処理３２２はハンドル戻り補償のためのセルフアライニングトルクを算出するための処理である。一般に、電動パワーステアリング装置においては、減速ギア３１等の影響によりセルフアライニングトルクが弱くなり易く、このためにハンドル６１が中立位置に戻り難くなってしまう。そこで、セルフアライニングトルクの作用によってモータ３が回転させられる際のモータ角速度、角加速度、トルク信号に基づき、ＳＡＴ推定処理３２２はハンドルを中立位置に復元させるための補償電流値を算出している。補償制御処理３２によって算出された補償値は加算器３０１、３０２、３０３によって電流指令値に加算される。なお、補償制御処理３２は非割込処理であって、４msec周期で実行されるものである。
【００３３】
図４は、非割込処理から割込処理へのデータの受け渡しを説明するための概念図である。非割込処理から割込処理へ渡されるデータとしては、例えばトルク演算処理３０からモータ制御処理３１への電流指令値、モータ温度、制御状態、車速信号等がある。これらのうち、電流指令値は上述したとおりであるが、モータ温度はモータの過熱保護機能、コイル抵抗補正等のためにモータ制御処理３１において使用されるデータである。これらのデータは関連性を有しており、所定の制御タイミングにおけるデータは、他の制御タイミングにおけるデータとは別に、まとめて非割込処理から割込処理に受け渡されなければならない。例えば、図１３に示されるように、パワーステアリング制御装置においては、センサ入力処理、トルク制御処理に続いて、これらの処理に基づくデータ受渡処理がなされる。データ受渡処理は、電流指令値（Iref）、モータ温度（MtrTemp）、車速信号（VehicleSpeed）、操舵トルク（Torque）を順に、低優先度の処理から高優先度の処理へと受け渡すことにより行われる。パワーステアリング制御装置においては、これらの複数のデータを制御タイミング毎に２つの処理間において受け渡す必要がある（同図１〜４）。例えば、操舵トルクの符号と電流指令値の符号が一致しなければならない関係にあると仮定した場合、操舵トルクが正の値であることから、電流指令値も操舵トルクと同じ回転方向を示す正の値となる（同図（A））。また、操舵トルクが負の値であれば、電流指令値も同様に負とならなければならない（同図（B））。仮に、掛かる条件に反したデータの受け渡しがなされると、車両の異常挙動などの問題が発生してしまう。
【００３４】
非割込処理から割込処理にデータを渡すために、２つのバッファBUF_A、BUF_Bが用意されている。また、ステータスStatus_LはバッファBUF_A、BUF_Bのうちのいずれが最新のデータを格納しているかを表すために使用される。このステータスStatus_Lが０であるときには、BUF_Aに最新のデータが格納されていることを表し、ステータスStatus_Lが１であるときには、BUF_Bに最新のデータが格納されていることを表している。データを受け渡す側の非割込処理においては、データをバッファBUF_A、BUF_Bに交互に最新のデータを書き込むとともに、ステータスStatus_Lを０または１のいずれかにセットする処理が実行される。データを受け取る側の割込処理においては、ステータスStatus_Lを参照することにより、２つのバッファBUF_AまたはBUF_Bのいずれのデータが最新のものであるかを判断することができる。
【００３５】
すなわち、図５に示されているように、現在のステータスStatus_Lが０のときには、非割込処理は、最新のデータをバッファBUF_Bに書き込み、ステータスStatus_Lを１にセットする。割込処理は、ステータスStatus_Lを参照し、Status_Lが１であればバッファBUF_Bのデータを最新のデータとして読み出すことができる。一方、ステータスStatus＿Lが１のときには、非割込処理は、現在のデータをバッファBUF_Aに書き込み、ステータスStatus_Lを０にセットする。割込処理は、ステータスStatus_Lを参照し、Status_Lが０であればバッファBUF_Aのデータを最新のデータとして読み出すことができる。このように、２つのバッファBUF_A、BUF_Bを交互に用いてデータの受け渡しを行うことにより、割込を禁止することなく、データを正しく受け渡すことができる。例えば、データ受取側の割込処理がバッファＢＵＦ＿Ａ、ＢＵＦ＿Ｂの一方からデータを受け取る際に割込処理において割込が発生したとしても、割込処理はステータスStatus_Lで示されたバッファ以外の他方のバッファからデータを読み出すことはない。このため、他方のバッファが非割込処理によって更新されたとしても、割込処理はステータスStatus_Lで示されたバッファから所望の制御タイミングのデータを受け取ることができる。すなわち、割込を禁止しなくても、複数のデータを制御タイミング毎に正しく受け渡すことができる。なお、上述の説明では割込処理と非割込処理を例に挙げたが、割込優先度の異なる２つの割込処理においても同様に処理可能である。
【００３６】
図６は、割込処理から非割込処理へのデータの受け渡しを説明するための概念図である。割込処理から非割込処理へ渡されるデータとしては、例えばモータ電流値、モータの回転角等がある。
【００３７】
割込処理から非割込処理にデータを渡すために、２つのバッファBUF_X、BUF_Yが用意されている。また、ステータスStatus_IntはバッファBUF_X、BUF_Yのうちのいずれかが最新のデータを格納しているかを表すために使用される。これらのバッファBUF_X、BUF_Y、ステータスStatus_Intの機能は上述のバッファBUF_A、BUF_B、ステータスStatus_Lと略同様である。すなわち、ステータスStatus_Intが０であるときには、BUF_Xに最新のデータが格納されていることを表し、ステータスStatus_Intが１であるときには、BUF_Yに最新のデータが格納されていることを表している。データを受け渡す側の割込処理においては、データをバッファBUF_X、BUF_Yに交互に最新のデータを書き込む処理が実行される。データを受け取る側の非割込処理においては、２つのBUF_XまたはBUF_Yのうち、Status_Intによって示されたバッファから最新のデータを読み出すことができる。
【００３８】
すなわち、図７に示されているように、現在のステータスStatus_Intが０のときには、割込処理は、最新のデータをバッファBUF_Xに書き込む。非割込処理は、ステータスStatus_Intを参照し、Status_Intが０であればステータスStatus_Intを１にセットした後、バッファBUF_Xのデータを最新のデータとして読み出す。一方、ステータスStatus＿Intが１のときには、割込処理は、現在のデータをバッファBUF_Yに書き込む。非割込処理は、ステータスStatus_Intを参照し、Status_Intが１であればステータスStatus_Intを０にセットした後、バッファBUF_Yのデータを最新のデータとして読み出す。
【００３９】
上述のように、割込処理から非割込処理にデータを受け渡す場合においても、ステータスStatus_Intは２つの処理のうちの割込優先度の低い処理においてセットされる。すなわち、非割込処理がデータを受け取ったことをステータスStatus_Intを通じて割込処理に知らせることができ、データ受け渡しが済んでいないバッファが割込処理によって破壊されることを防止することができる。
【００４０】
続いて、本実施形態に係るパワーステアリング制御装置の動作を説明する。図８はパワーステアリング制御装置の動作を表すメインフローチャートである。先ず、イグニッションスイッチ５ａをオンにすると、パワーステアリング制御装置１は動作を開始し、パワーステアリング装置１における初期診断等の初期設定を実行する（ステップＳ８１）。初期設定が正常に終了すると、CPU１１３は割込発生を許可し（ステップS８２）、各処理タスク間におけるデータの受け渡しの処理を実行する（ステップＳ８３）。同時に、ＣＰＵ１１３はプログラムに従い、パワーステアリングの制御を行う（ステップＳ８４）。以下、同様に、イグニッションスイッチ５ａがオフになるまで（ステップＳ８５でＹＥＳ）、ＣＰＵ１１１３は上述の処理を繰り返し実行する。
【００４１】
続いて、上述のデータ受渡処理の詳細を図９、図１０のフローチャートを用いて説明する。図９は、割込優先度の異なる２つの処理のうち、低優先度の割込処理側におけるデータ受渡処理を表すフローチャートである。例えば、高優先度の割込処理はモータ制御処理３１に相当し、低優先度の割込処理（または非割込処理）はトルク演算処理に相当する。
【００４２】
図９において、ＣＰＵ１１３はステータスStatus_Intの値を参照し、バッファBUF_X、BUF_Yのいずれに最新のデータが格納されているかを判断する（ステップS９０１）。ステータスStatus_Intの値が０である場合（ステップS９０１で”０”）には、CPU１１３はバッファBUF_Xに最新のデータが格納されていると判断し、ステップＳ９０２〜Ｓ９０３の処理を実行する。
【００４３】
すなわち、ＣＰＵ１１３はステータスStatus_Intを１にセットした後（ステップＳ９０３）、バッファBUF_Xからデータを読み出す（ステップS９０３）。一方、ステータスStatus_Intが１である場合（ステップS９０１で”１”）には、CPU１１３はステータスStatus_Intを０にセットするとともに（ステップS９０４）、バッファBUF_Yからデータを読み出す（ステップS９０５）。このように、データを受け取る側の低優先度の割込処理側において、ステータスStatus_Intの値を参照することにより、バッファBUF_X、BUF_Yのいずれに最新のデータが格納されているかを判断することができる。そして、最新のデータが格納されていると判断されたバッファからデータを読み出すことにより、割込を禁止することなく、データを受け渡すことができる。この結果、割込禁止をすることなく、割込によるデータの破壊を回避することが可能となる。
【００４４】
続いて、CPU１１３は高優先度の割込処理に受け渡そうとするデータを算出し（ステップS９０６）、データを低優先度の割込処理にデータを受け渡す（ステップS９０７〜S９１１）。すなわち、ステップS９０７において、CPU１１３は、現在のステータスStatus_Lの値を参照し、バッファBUF_A、BUF_Bのいずれに前回のデータが格納されていたかを判断する。ステータスStatus_Lが０であれば（ステップS９０７で”０”）、バッファBUF_Aに前回のデータが書き込まれていたと判断し得る。そこで、CPU１１３はバッファBUF_Bに最新のデータを書き込み（ステップS９０８）、ステータスStatus_Lを１にセットする（ステップS９０９）。一方、ステータスStatus_Lの値が１である場合には（ステップS９０７で”１”）、CPU１１３はバッファBUF_Aにデータを書き込むとともに（ステップS９１０）、ステータスStatus_Lを０にセットする（ステップS９１１）。受け取り側の高優先度割込処理においては、、ステータスStatus_Lを参照することにより、バッファBUF_A、BUF_Bのいずれに最新のデータが書き込まれているかを判断することが可能となる。
【００４５】
図１０は高優先度の割込処理側におけるデータ受渡処理を表すフローチャートである。この処理は上述の図９における処理と略同様であるが、ステータスStatus_L、Status_Intを書き換える権限が高優先度割込処理にはない点において上述の処理と相違している。
【００４６】
すなわち、ステップS１００１において、ＣＰＵ１１３はステータスStatus_Lの値を参照し、バッファBUF_A、BUF_Bのいずれに最新のデータが格納されているかを判断する。ステータスStatus_Lの値が０である場合（ステップS１００１で”０”）には、CPU１１３はバッファBUF_Aからデータを読み出し（ステップＳ１００２）、ステータスStatus_Lの値が１である場合（ステップS１００１で”１”）には、CPU１１３はバッファBUF_Bからデータを読み出す（ステップＳ１００３）。
【００４７】
続いて、CPU１１３は低優先度の割込処理に受け渡そうとするデータを算出し（ステップS１００４）、データを低優先度の割込処理にデータを受け渡す（ステップＳ１００４〜Ｓ１００７）。すなわち、ステップＳ１００５においてステータスStatus_Intが０であれば、ＣＰＵ１１３はデータをバッファＢＵＦ＿Ｘに書き込み（ステップＳ１００６）、ステータスStatus_Intが１であればデータをBUF_Yにデータを書き込む（ステップS１００７）。低優先度の割込処理側においては、ステータスStatus_Intの値を参照することにより、バッファBUF_X、BUF_Yのいずれに最新のデータが格納されているかを判断することができる。
【００４８】
図１１は、モータ制御処理等の高優先度割込処理からトルク演算処理等の非割込処理（または低優先度割込処理）へのデータ（例えばモータ電流値）の受け渡しを表すタイミングチャートである。図１１において、最上段のグラフはトルク演算処理を表しており、当該処理は１msec周期で実行される。２段目のグラフはステータスStatus_Intの値の変化を表しており、トルク演算処理に同期してその値が更新されるものである。また、３，４段目のグラフはトルク演算処理により参照（読み出される）されるバッファBUF_X、BUF_Yを示しており、最下段のグラフはモータ制御処理によって更新（書き込まれる）されるバッファを示している。
【００４９】
時刻Ｔ１００以前において、モータ制御処理によってモータ電流値が更新された場合、ステータスStatus_Intは０であるので、更新されたモータ電流値はバッファBUF_Xに書き込まれる。時刻Ｔ１００においてトルク制御処理が起動すると、ＣＰＵ１１３はステータスStatus_Intを０から１にセットした後（時刻Ｔ１００〜Ｔ１０１）、バッファBUF_Xからモータ電流値を読み出す（時刻Ｔ１０１〜Ｔ１０２）。このようにして読み出されたモータ電流値は、トルク演算処理において電流制御値を生成するために使用される。
【００５０】
ここで、ステータスStatus_Intが０から１に更新される間（時刻Ｔ１００〜Ｔ１０１）において、ステータスStatus_Intは０であるため、割込処理であるモータ制御はバッファBUF_Xにデータを書き込み、割込から抜ける。トルク制御処理は未だバッファBUF_Xのデータの読み出しを行っておらず、読み出し処理中におけるデータの上書きは発生しない。よって、割込禁止をしなくても、非割込処理においてバッファBUF_Xのデータを正しく読み出すことが可能となる。
【００５１】
また、時刻Ｔ１０１〜Ｔ１０２において割込が発生し、モータ電流値が書き換えられたとしても、ステータスStatus_Intは１にセットされているため、その後に更新されたモータ電流値はバッファBUF_Yに書き込まれる。このため、バッファBUF_Xの内容は破壊されずに済むため、モータ電流値をトルク演算処理に正しく受け渡すことができる。同様に、時刻Ｔ１０２〜Ｔ１０３において割込が発生したとしても、モータ電流値はバッファBUF_Xを介して既に受け渡し済みであるため、トルク演算処理は割込発生の影響を受けずに済む。
【００５２】
続いて、時刻Ｔ１０３においてトルク演算処理が起動すると、ステータスStatus_Intがトルク演算処理によって１から０にセットされる（時刻Ｔ１０３〜Ｔ１０４）。上述したように、この間に割込が発生したとしても、トルク演算処理は割込処理終了後にバッファBUF_Yからモータ電流値を正しく読み出すことができ（時刻Ｔ１０４〜Ｔ１０５）、割込発生による影響を受けずに済む。また、時刻Ｔ１０４〜Ｔ１０５に割込が発生した場合においても、モータ電流値は既にバッファBUF_Yに退避されているため、トルク演算処理はモータ電流値を正しく読み出すことが可能である。
【００５３】
時刻Ｔ１０５〜Ｔ１０６においては、既にモータ電流値はトルク演算処理に受け渡されており、トルク演算処理は割込処理の影響を受けることはない。時刻Ｔ１０６〜Ｔ１０７においては、トルク演算処理によってステータスStatus_Intが０から１にセットされ、続いてバッファBUF_Xからモータ電流値が読み出される（時刻Ｔ１０７〜Ｔ１０８）。時刻Ｔ１０８〜Ｔ１０９において、モータ制御処理によってモータ電流値の更新が行われ、更新後のモータ電流値がBUF_Yに書き込まれる。以下、同様にステータスStatus_Intが０から１にセットされ（時刻Ｔ１０９〜Ｔ１１０）、モータ電流値がバッファBUF_Yから読み出される。
【００５４】
上述のように、２つのバッファBUF_X、BUF_Yを交互に用いて、ステータスStatus_Intで示されたバッファを介してデータを割込処理から非割込処理に受け渡すことにより、割込処理によりデータが破壊されることを回避できる。すなわち、データを受け取る側の低優先度の割込処理側において、ステータスStatus_Intの値を参照することにより、バッファBUF_X、BUF_Yのいずれに最新のデータが格納されているかを判断することができる。そして、最新のデータが格納されていると判断されたバッファからデータを読み出すことにより、割込を禁止することなく、データを受け渡すことができる。この結果、割込禁止をすることなく、割込によるデータの破壊を回避することが可能となる。
【００５５】
図１２は、図１１とは逆に、トルク演算処理等の非割込処理（または低優先度割込処理）からモータ演算処理等の高優先度割込処理への電流指令値等のデータの受け渡しを表すタイミングチャートである。図１２において、最上段のグラフはトルク演算処理等の非割込処理を表しており、当該処理は例えば１msec周期で実行される。２段目のグラフはステータスStatus_Lの値の変化を表しており、トルク演算処理に同期してその値が更新されるものである。また、３，４段目のグラフはトルク演算処理により更新されるバッファBUF_A、BUF_Bを示しており、最下段のグラフはモータ制御処理によって参照されるバッファを示している。
【００５６】
先ず、トルク演算処理において、車速信号、トルク信号等に基づき電流指令値が算出されると、ステータスStatus_Lで示されたバッファに電流指令値が書き込まれる（時刻Ｔ２０１からＴ２０２）。このとき、ステータスStatus_Lは０であるため、電流指令値はバッファBUF_Bに書き込まれる。トルク演算処理はバッファBUF_Bへの書き込みが終了すると、ステータスStatus_Lを０から１にセットする（時刻Ｔ２０２〜Ｔ２０３）。モータ制御処理においては、ステータスStatus_Lで示されたバッファ、すなわち、バッファBUF_Bから電流指令値を読み出し、モータの制御処理を実行することができる（時刻Ｔ２０３〜Ｔ２０６）。
【００５７】
続いて、トルク演算処理によって電流指令値が更新されると、トルク演算処理はバッファBUF_Aに電流指令値を書き込み（時刻Ｔ２０４〜Ｔ２０５）、ステータスStatus_Lを０にセットする。モータ演算処理はステータスStatus_Lで示されたバッファBUF_Aから電流指令値を読み出し、モータの制御を行う（時刻Ｔ２０６〜Ｔ２０７）。同様に、トルク演算処理は、バッファBUF_Bに更新後の電流指令値を書き込み（時刻Ｔ２０７〜Ｔ２０８）、ステータスStatus_Lを１にセットする（時刻Ｔ２０８〜Ｔ２０９）。
【００５８】
同図に示されたタイミングチャートにおいて、いずれのタイミングで割込が発生したとしても、割込による電流指令値等のデータの破壊を回避することができる。例えば、トルク演算処理が電流指令値をバッファBUF_A、BUF_Bの一方に書き込む際に割込が発生し、電流指令値が変更されたとしても、モータ制御処理は他方のバッファから電流指令値を正しく読み出すことができる（時刻Ｔ２０１〜Ｔ２０２、Ｔ２０４〜Ｔ２０５、Ｔ２０７〜Ｔ２０８，Ｔ２１０〜Ｔ２１１）。
【００５９】
また、トルク演算処理がステータスStatus_Lを０または１にセットしている際に割込が発生した場合においても、モータ制御処理はバッファBUF_A、BUF_Bに既に書き込まれている電流指令値を正しく読み出すことができる（時刻Ｔ２０２〜Ｔ２０３、Ｔ２０５〜Ｔ２０６、Ｔ２０８〜Ｔ２０９、Ｔ２１１〜Ｔ２１２）。このように、高優先度割込処理がバッファBUF_A、BUF_Bのいずれからデータを読み出すかを、低優先度割込処理がステータスStatus_Lを介して高優先度割込処理に知らせることができる。このため、高優先度割込処理における割込禁止処理をすることなく、同一制御タイミングにおける複数のデータを正しく受け渡すことができる。
【００６０】
以上述べたように、本発明によれば、複数のバッファを順に用いて、優先度の異なる２つの処理間においてデータを受け渡すことにより、割込による負所望のデータの破壊を回避することができる。このため、例えば電流指令値、モータ温度、車速信号、操舵トルクのように、互い同一の制御タイミングにおいて互いに関連性を有する複数のデータを正しく受け渡すことが可能となる。すなわち、これらのデータを受け渡している最中に割込が発生したとしても、同一の制御タイミングにおける複数のデータを正しく受け渡すことができる。また、割込禁止処理を低減することができることから、プログラムの開発効率の向上、プログラムミスの低減等の効果を奏することが可能となる。
【００６１】
なお、上述の実施形態において、バッファとして配列を用いることが可能である。例えば、バッファBUF_A[n]、BUF_B[n]のような配列を用いることにより、複数のデータをまとめて受け渡すことが可能である。また、C言語のポインタを用いて、最新のデータが格納されているバッファのアドレスを指定しても良い。さらに、構造体を用いることにより、型の異なる複数のデータを一つに纏めることも可能である。さらに、プログラムの形態は上述のフローチャートに限定されず、同様の機能を実現できるものであれば変更可能である。
【図面の簡単な説明】
【００６２】
【図１】本発明の実施形態に係るパワーステアリング装置の概略図である。
【図２】本発明の実施形態に係るパワーステアリング制御装置のブロック図である。
【図３】本発明の実施形態に係るパワーステアリング制御装置の機能ブロック図である。
【図４】本発明の実施形態に係る非割込処理から割込処理へのデータの受け渡し方法の概念図である。
【図５】本発明の実施形態に係る非割込処理から割込処理へのバッファおよびステータスを説明するための図である。
【図６】本発明の実施形態に係る割込処理から非割込処理へのデータの受け渡し方法の概念図である。
【図７】本発明の実施形態に係る割込処理から非割込処理へのバッファおよびステータスを説明するための図である。
【図８】本発明の実施形態に係るパワーステアリング制御装置のメインフローチャートである。
【図９】本発明の実施形態に係るデータ受渡処理の詳細を表すフローチャートである。
【図１０】本発明の実施形態に係るデータ受渡処理の詳細を表すフローチャートである。
【図１１】本発明の実施形態に係るパワーステアリング制御装置の動作を表すタイミングチャートである。
【図１２】本発明の実施形態に係るパワーステアリング制御装置の動作を表すタイミングチャートである。
【図１３】本発明の実施形態に係るパワーステアリング制御装置におけるデータの受け渡しを説明するための図である。
【符号の説明】
【００６３】
１  ＥＣＵ
３  モータ
４  トルクセンサ
３０  トルク演算処理
３１  モータ制御処理
３２  補償制御処理
３３  センサ処理
１１３  ＣＰＵ
【図１】
2007008445.tif 000003
【図２】
2007008445.tif 000004
【図３】
2007008445.tif 000005
【図４】
2007008445.tif 000006
【図５】
2007008445.tif 000007
【図６】
2007008445.tif 000008
【図７】
2007008445.tif 000009
【図８】
2007008445.tif 000010
【図９】
2007008445.tif 000011
【図１０】
2007008445.tif 000012
【図１１】
2007008445.tif 000013
【図１２】
2007008445.tif 000014
【図１３】
2007008445.tif 000015