JP3849930B2 - モータ制御装置 - Google Patents
モータ制御装置 Download PDFInfo
- Publication number
- JP3849930B2 JP3849930B2 JP2002207557A JP2002207557A JP3849930B2 JP 3849930 B2 JP3849930 B2 JP 3849930B2 JP 2002207557 A JP2002207557 A JP 2002207557A JP 2002207557 A JP2002207557 A JP 2002207557A JP 3849930 B2 JP3849930 B2 JP 3849930B2
- Authority
- JP
- Japan
- Prior art keywords
- control
- range
- phase
- rotor
- motor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Control Of Electric Motors In General (AREA)
Description
【発明の属する技術分野】
本発明は、エンコーダのパルス信号のカウント値に基づいてロータの回転位置を検出してモータの通電相を順次切り換えることでロータを目標位置まで回転駆動するモータ制御装置に関するものである。
【0002】
【従来の技術】
近年、構造が簡単で安価なモータとして需要が増加しているスイッチトリラクタンスモータ等のブラシレス型のモータは、ロータの回転に同期してパルス信号を出力するエンコーダを搭載し、このエンコーダのパルス信号をカウントして、そのエンコーダカウント値に基づいてロータの回転位置を検出して通電相を順次切り換えることでロータを回転駆動するようにしたものがある。このようなエンコーダ付きのモータは、起動後のエンコーダカウント値に基づいてロータの回転位置を検出することができるため、フィードバック制御系(閉ループ制御系)によりロータを目標位置まで回転させる位置切換制御(位置決め制御)を行う各種の位置切換装置の駆動源として用いられている。
【0003】
【発明が解決しようとする課題】
ところで、エンコーダカウント値に基づいてロータを目標位置まで回転させるフィードバック制御(以下「F/B制御」と表記する)の制御系が何等かの原因で故障すると、通電相(エンコーダカウント値)とロータの回転位相との同期が取れなくなって、ロータを正常に駆動できなくなって、制御不能に陥る結果となる。
【0004】
本発明はこのような事情を考慮してなされたものであり、従ってその目的は、F/B制御系が何等かの原因で故障しても、可能な限り、ロータを目標位置まで回転させることができ、モータ制御の信頼性を向上させることができるモータ制御装置を提供することにある。
【0005】
【課題を解決するための手段】
上記目的を達成するために、本発明の請求項1のモータ制御装置は、エンコーダカウント値に基づいてロータを目標位置まで回転駆動するF/B制御系の故障の有無を故障監視手段により監視し、その結果、F/B制御系の故障が検出されたときに、フェールセーフ手段によって、F/B制御からオープンループ制御に切り換えて、エンコーダカウント値の情報をフィードバックせずにモータの通電相を順次切り換えると共に、その通電相の切換回数をカウントしてそのカウント値に基づいてロータを目標位置まで回転駆動するようにしたものである。F/B制御系が故障して、F/B制御ではモータを正常に駆動できなくなった場合でも、オープンループ制御で正常に駆動できる場合がある。例えば、F/B制御系の必須構成部品であるエンコーダが故障すると、F/B制御ではモータを正常に駆動できなくなるが、この場合でも、オープンループ制御であればモータを正常に駆動できる可能性がある。従って、本発明のように、F/B制御系の故障が検出されたときに、F/B制御からオープンループ制御に切り換えれば、ロータを目標位置まで回転駆動できる可能性があり、モータ制御の信頼性を向上させることができる。
【0006】
この場合、請求項2のように、オープンループ制御によりモータを停止状態から駆動するときに最初の励磁を2相通電で行い、その後は、1相通電と2相通電とを交互に切り換えるようにすると良い。オープンループ制御開始時にロータの初期位置が最初の通電に対応する位置とずれている場合、最初の通電によりロータが最初の通電に対応する位置に移動する。このとき、ロータはすぐにはこの位置に止まらず、暫くの間振動している。この振動時間は、1相通電より2相通電の方が短く、また、振動振幅も1相通電より2相通電の方が小さいため、オープンループ制御開始時に最初の通電を2相通電で行うことにより、オープンループ制御開始当初からロータを安定して回転駆動することができる。
【0007】
また、請求項3のように、オープンループ制御によりモータを停止状態から駆動するときに初めの所定回数の励磁の通電時間をその以後の励磁の通電時間よりも長い時間に設定するようにすると良い。オープンループ制御開始時にロータの初期位置と通電相とがずれていると、両者を同期させるのに数回の励磁を必要とする場合があるため、初めの所定回数の励磁の通電時間を長くすることで、その所定回数の励磁によってロータの回転位置と通電相とを確実に同期させることができる。
【0008】
また、請求項4のように、オープンループ制御中に、ロータ回転速度、駆動開始後の回転量、駆動開始後の経過時間、前記目標位置までの回転量、負荷トルクの少なくとも1つに基づいて励磁の通電時間を設定するようにすると良い。このようにすれば、オープンループ制御中のロータの加速→定速回転→減速→停止の制御を適正に行うことができる。
【0009】
また、請求項5のように、オープンループ制御によりモータを目標位置に向かって回転駆動している期間は、該目標位置の切換操作信号が入力されてもその切換操作信号を無視するようにしても良い。オープンループ制御中はロータ回転速度が遅く、目標位置までのモータ駆動時間が長くなるため、オープンループ制御の途中で新たな切換操作信号が入力される可能性があるが、オープンループ制御中はロータの正確な回転位置を検出できないため、オープンループ制御の途中で目標位置が切り換えられると、制御精度が悪化する可能性がある。従って、オープンループ制御の途中で切換操作信号が入力されても、その切換操作信号を無視するようにすれば、制御精度の悪化を回避することができる。
【0010】
また、請求項6のように、モータの出力軸の回転位置又はそれに相関する位置情報を検出する出力軸センサを設け、オープンループ制御中に通電相の切換回数のカウント値に基づいて推定したロータの回転位置が目標位置に到達した時点で該オープンループ制御を終了すると共に、出力軸センサの出力信号に基づいて該オープンループ制御によるモータ駆動が成功か失敗かを判定し、失敗であれば、再びオープンループ制御によるモータ駆動を繰り返すようにしても良い。このようにすれば、オープンループ制御によるモータ駆動の信頼性を高めることができる。
【0011】
この場合、オープンループ制御によるモータ駆動を何回も繰り返しても、それが失敗に終わるような場合は、モータやその駆動制御系が完全に故障して制御不能に陥っているものと考えられるため、請求項7のように、オープンループ制御によるモータ駆動を連続して所定回数以上失敗したときに、オープンループ制御不能と判断してモータの通電をオフするようにすると良い。このようにすれば、オープンループ制御不能と判断した後は、オープンループ制御を繰り返さずに済み、消費電力を節約することができる。
【0012】
また、請求項8のように、オープンループ制御開始時のロータの初期位置を出力軸センサの出力信号に基づいて推定し、該オープンループ制御中にロータの初期位置推定値と通電相の切換回数のカウント値とに基づいてロータの回転位置を推定するようにすると良い。このようにすれば、オープンループ制御中のロータの回転位置を比較的精度良く推定することができ、オープンループ制御によるモータ制御精度を高めることができる。
【0013】
また、請求項9のように、モータとしてスイッチトリラクタンスモータを使用するようにしても良い。スイッチトリラクタンスモータは、永久磁石が不要で構造が簡単であるため、安価であり、温度環境等に対する耐久性・信頼性も高いという利点がある。
【0014】
以上説明した請求項1〜9に係る発明は、スイッチトリラクタンスモータ等のブラシレス型のモータを駆動源とする各種の位置切換装置に適用でき、例えば、請求項10のように、車両の自動変速機のレンジを切り換えるレンジ切換機構を駆動するモータの制御装置に適用しても良い。これにより、信頼性の高いモータ駆動式のレンジ切換装置を構成することができる。
【0015】
この場合、オープンループ制御によるレンジ切換は、F/B制御によるレンジ切換が失敗したときのフェールセーフとして行われるものであるため、モータ負荷をできるだけ軽減した状態でオープンループ制御を実行することが望ましい。レンジ切換装置を駆動するモータの負荷は、エンジントルクが大きくなると、大きくなるため、請求項11のように、オープンループ制御によるレンジ切換中は、エンジントルクを抑制するトルク抑制制御を実行するようにすると良い。このようにすれば、オープンループ制御によるレンジ切換中にモータ負荷を軽減することができ、オープンループ制御によるレンジ切換の成功確率を高めることができる。
【0016】
【発明の実施の形態】
以下、本発明を車両のレンジ切換装置に適用した一実施形態を図面に基づいて説明する。
【0017】
まず、図1に基づいてレンジ切換機構11の構成を説明する。レンジ切換機構11の駆動源となるモータ12は、例えばスイッチトリラクタンスモータにより構成され、減速機構26(図4参照)を内蔵し、その出力軸13の回転位置を検出する出力軸センサ14が設けられている。この出力軸13には、ディテントレバー15が固定されている。
【0018】
また、ディテントレバー15にはL字形のパーキングロッド18が固定され、このパーキングロッド18の先端部に設けられた円錐体19がロックレバー21に当接している。このロックレバー21は、円錐体19の位置に応じて軸22を中心にして上下動してパーキングギヤ20をロック/ロック解除するようになっている。パーキングギヤ20は、自動変速機27の出力軸に設けられ、このパーキングギヤ20がロックレバー21によってロックされると、車両の駆動輪が回り止めされた状態(パーキング状態)に保持される。
【0019】
一方、ディテントレバー15をパーキングレンジ(以下「Pレンジ」と表記する)と他のレンジ(以下「NotPレンジ」と表記する)に保持するためのディテントバネ23が支持ベース17に固定され、このディテントバネ23の先端に設けられた係合部23aがディテントレバー15のPレンジ保持凹部24に嵌まり込んだときに、ディテントレバー15がPレンジの位置に保持され、該ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25に嵌まり込んだときに、ディテントレバー15がNotPレンジの位置に保持されるようになっている。
【0020】
Pレンジでは、パーキングロッド18がロックレバー21に接近する方向に移動して、円錐体19の太い部分がロックレバー21を押し上げてロックレバー21の凸部21aがパーキングギヤ20に嵌まり込んでパーキングギヤ20をロックした状態となり、それによって、自動変速機27の出力軸(駆動輪)がロックされた状態(パーキング状態)に保持される。
【0021】
一方、NotPレンジでは、パーキングロッド18がロックレバー21から離れる方向に移動して、円錐体19の太い部分がロックレバー21から抜け出てロックレバー21が下降し、それによって、ロックレバー21の凸部21aがパーキングギヤ20から外れてパーキングギヤ20のロックが解除され、自動変速機27の出力軸が回転可能な状態(走行可能な状態)に保持される。
【0022】
尚、前述した出力軸センサ14は、モータ12の減速機構26の出力軸13の回転角度に応じた電圧を出力する回転センサ(例えばポテンショメータ)によって構成され、その出力電圧によって現在のレンジがPレンジとNotPレンジのいずれであるかを確認できるようになっている。
【0023】
次に、図2に基づいてモータ12の構成を説明する。本実施形態では、モータ12として、スイッチトリラクタンスモータ(以下「SRモータ」と表記する)が用いられている。このSRモータ12は、ステータ31とロータ32が共に突極構造を持つモータで、永久磁石が不要で構造が簡単であるという利点がある。円筒状のステータ31の内周部には、例えば12個の突極31aが等間隔に形成され、これに対して、ロータ32の外周部には、例えば8個の突極32aが等間隔に形成され、ロータ32の回転に伴い、ロータ32の各突極32aがステータ31の各突極31aと微小ギャップを介して順番に対向するようになっている。ステータ31の12個の突極31aには、U相、V相、W相の合計6個の巻線33と、U’相、V’相、W’相の合計6個の巻線34が順番に巻回されている。尚、ステータ31とロータ32の突極31a,32aの数は適宜変更しても良いことは言うまでもない。
【0024】
本実施形態の巻線33,34の巻回順序は、ステータ31の12個の突極31aに対して、例えば、V相→W相→U相→V相→W相→U相→V’相→W’相→U’相→V’相→W’相→U’相の順序で巻回されている。図3に示すように、U相、V相、W相の合計6個の巻線33と、U’相、V’相、W’相の合計6個の巻線34は、2系統のモータ励磁部35,36を構成するように結線されている。一方のモータ励磁部35は、U相、V相、W相の合計6個の巻線33をY結線して構成され(同じ相の2個の巻線33はそれぞれ直列に接続されている)、他方のモータ励磁部36は、U’相、V’相、W’相の合計6個の巻線34をY結線して構成されている(同じ相の2個の巻線34はそれぞれ直列に接続されている)。2つのモータ励磁部35,36は、U相とU’相が同時に通電され、V相とV’相が同時に通電され、W相とW’相が同時に通電される。
【0025】
これら2つのモータ励磁部35,36は、車両に搭載されたバッテリ40を電源として、それぞれ別個のモータドライバ37,38によって駆動される。このように、モータ励磁部35,36とモータドライバ37,38をそれぞれ2系統ずつ設けることで、一方の系統が故障しても、他方の系統でSRモータ12を回転させることができるようになっている。図3に示すモータドライバ37,38の回路構成例では、各相毎にトランジスタ等のスイッチング素子39を1個ずつ設けたユニポーラ駆動方式の回路構成としているが、各相毎にスイッチング素子を2個ずつ設けたバイポーラ駆動方式の回路構成を採用しても良い。尚、本発明は、モータ励磁部とモータドライバをそれぞれ1系統ずつ設けた構成としても良いことは言うまでもない。
【0026】
各モータドライバ37,38の各スイッチング素子39のオン/オフは、ECU41(制御手段)によって制御される。図4に示すように、このECU41と各モータドライバ37,38は、レンジ切換制御装置42に搭載され、このレンジ切換制御装置42には、Pレンジへの切換操作を行うPレンジスイッチ43と、NotPレンジへの切換操作を行うNotPレンジスイッチ44の操作信号が入力される。Pレンジスイッチ43又はNotPレンジスイッチ44の操作により選択されたレンジは、インストルメントパネル(図示せず)に設けられたレンジ表示部45に表示される。尚、Pレンジスイッチ43とNotPレンジスイッチ44は、例えばモーメンタリ型スイッチにより構成されている。
【0027】
SRモータ12には、ロータ32の回転位置を検出するためのエンコーダ46が設けられている。このエンコーダ46は、例えば磁気式のロータリエンコーダにより構成されており、その具体的な構成は、図5及び図6に示すように、N極とS極が円周方向に交互に等ピッチで着磁された円環状のロータリマグネット47がロータ32の側面に同軸状に固定され、このロータリマグネット47に対向する位置に、3個のホールIC等の磁気検出素子48,49,50が配置された構成となっている。本実施形態では、ロータリマグネット47のN極とS極の着磁ピッチが7.5°に設定されている。このロータリマグネット47の着磁ピッチ(7.5°)は、SRモータ12の励磁1回当たりのロータ32の回転角度と同じに設定されている。後述するように、1−2相励磁方式でSRモータ12の通電相の切り換えを6回行うと、全ての通電相の切り換えが一巡してロータ32とロータリマグネット47が一体的に7.5°×6=45°回転する。このロータリマグネット47の45°の回転角度範囲に存在するN極とS極の数は、合計6極となっている。
【0028】
更に、ロータ32の基準回転位置に相当する位置のN極(N’)とその両側のS極(S’)がそれ以外の磁極よりも径方向の幅が広くなるように形成されている。尚、本実施形態では、SRモータ12の通電相の切り換えが一巡する間にロータ32とロータリマグネット47が一体的に45°回転することを考慮して、ロータ32の基準回転位置に相当する幅広な着磁部分(N’)が45°ピッチで形成されており、従って、ロータリマグネット47全体として、基準回転位置に相当する幅広な着磁部分(N’)が合計8個形成されている。尚、基準回転位置に相当する幅広な着磁部分(N’)は、ロータリマグネット47全体として、1個のみ形成した構成としても良い。
【0029】
このロータリマグネット47に対して3個の磁気検出素子48,49,50が次のような位置関係で配置されている。A相信号を出力する磁気検出素子48とB相信号を出力する磁気検出素子49は、ロータリマグネット47の幅狭な着磁部分(N,S)と幅広な着磁部分(N’,S’)の両方に対向し得る位置の同一円周上に配置されている。一方、Z相信号を出力する磁気検出素子50は、ロータリマグネット47の幅狭な着磁部分(N,S)よりも径方向外側又は内側の位置で、且つ、幅広な着磁部分(N’,S’)のみに対向し得る位置に配置されている。A相信号とB相信号を出力する2個の磁気検出素子48,49の間隔は、図7に示すように、A相信号とB相信号の位相差が、電気角で90°(機械角で3.75°)となるように設定されている。ここで、“電気角”はA・B相信号の発生周期を1周期(360°)とした場合の角度で、“機械角”は機械的な角度(ロータ32の1回転を360°とした場合の角度)であり、A相信号の立ち下がり(立ち上がり)からB相信号の立ち下がり(立ち上がり)までにロータ32が回転する角度がA相信号とB相信号の位相差の機械角に相当する。また、Z相信号を出力する磁気検出素子50は、Z相信号とB相信号(又はA相信号)との位相差が0となるように配置されている。
【0030】
各磁気検出素子48,49,50の出力は、N極(N’極)と対向したときにハイレベル“1”となり、S極(S’極)と対向したときにローレベル“0”となる。尚、Z相信号用の磁気検出素子50の出力は、ロータ32の基準回転位置に相当する幅広なN’極に対向する毎にハイレベル“1”となり、それ以外の位置では、ローレベル“0”となる。
【0031】
本実施形態では、ECU41が後述するエンコーダカウンタルーチンによってA相信号とB相信号の立ち上がり/立ち下がりの両方のエッジをカウントして、そのエンコーダカウント値に応じてSRモータ12の通電相を切り換えることでロータ32を回転駆動する。この際、A相信号とB相信号の発生順序によってロータ32の回転方向を判定し、正回転(Pレンジ→NotPレンジの回転方向)ではエンコーダカウント値をカウントアップし、逆回転(NotPレンジ→Pレンジの回転方向)ではエンコーダカウント値をカウントダウンする。これにより、ロータ32が正回転/逆回転のいずれの方向に回転しても、エンコーダカウント値とロータ32の回転位置との対応関係が維持されるため、正回転/逆回転のいずれの回転方向でも、エンコーダカウント値によってロータ32の回転位置(回転角度)を検出して、その回転位置に対応した相の巻線33,34に通電してロータ32を回転駆動する。
【0032】
図7は、ロータ32を逆回転方向(NotPレンジ→Pレンジの回転方向)に回転させたときのエンコーダ46の出力波形と通電相の切換パターンを示している。逆回転方向(NotPレンジ→Pレンジの回転方向)と正回転方向(Pレンジ→NotPレンジの回転方向)のいずれの場合も、ロータ32が7.5°回転する毎に1相通電と2相通電とを交互に切り換えるようになっており、ロータ32が45°回転する間に、例えば、U相通電→UW相通電→W相通電→VW相通電→V相通電→UV相通電の順序で通電相の切り換えを一巡するようになっている。そして、この通電相の切り換え毎に、ロータ32が7.5°ずつ回転して、A相、B相信号用の磁気検出素子48,49に対向するロータリマグネット47の磁極がN極→S極(N’極→S’極)又はS極→N極(S’極→N’極)に変化してA相信号とB相信号のレベルが交互に反転し、それによって、ロータ32が7.5°回転する毎に、エンコーダカウント値が2ずつカウントアップ(又はカウントダウン)する。また、通電相の切り換えが一巡してロータ32が45°回転する毎に、Z相用の磁気検出素子50がロータ32の基準回転位置に相当する幅広なN’極に対向して、Z相信号がハイレベル“1”となる。尚、本明細書では、A相、B相、Z相信号がハイレベル“1”となることを、A相、B相、Z相信号が出力されると言う場合がある。
【0033】
ところで、エンコーダカウント値は、ECU41のRAMに記憶されるため、ECU41の電源がオフされると、エンコーダカウント値の記憶が消えてしまう。そのため、ECU41の電源投入直後のエンコーダカウント値(0)は、実際のロータ32の回転位置(通電相)に対応したものとならい。従って、エンコーダカウント値に応じて通電相を切り換えるためには、電源投入後にエンコーダカウント値と実際のロータ32の回転位置とを対応させて、エンコーダカウント値と通電相とを対応させる必要がある。
【0034】
そこで、本実施形態では、レンジ切換制御装置42のECU41によって後述する図8及び図9に示す初期駆動ルーチンを実行することで、ECU41への電源投入後の初期駆動時に、SRモータ12の通電相の切り換えを所定のタイムスケジュールで一巡させてエンコーダ46のA相信号及びB相信号のエッジをカウントし、初期駆動終了時のエンコーダカウント値とロータ32の回転位置と通電相との対応関係を学習し、その後の通常駆動時に、エンコーダカウント値と初期駆動終了時の学習結果とに基づいて通電相を決定するようにしている。
【0035】
この初期駆動時の学習は、具体的には次のようにして行われる。図12に示すように、PレンジでECU41に電源が投入されたときに初期駆動を行う場合は、例えば、W相通電→UW相通電→U相通電→UV相通電→V相通電→VW相通電の順序で通電相の切り換えを所定のタイムスケジュールで一巡し、ロータ32を正回転方向(Pレンジ→NotPレンジの回転方向)に駆動する。
【0036】
一方、NotPレンジでECU41に電源が投入されたときに初期駆動を行う場合は、例えば、V相通電→UV相通電→U相通電→UW相通電→W相通電→VW相通電の順序で通電相の切り換えを所定のタイムスケジュールで一巡し、ロータ32を逆回転方向(NotPレンジ→Pレンジの回転方向)に駆動する。
【0037】
この初期駆動時には、1相通電の時間T1を2相通電の時間T2よりも短くし、例えばT1=10ms、T2=100msに設定する。初期駆動中にロータ32の回転位置と通電相との同期がとれた後でも、トルクが小さい1相通電では、ロータ32が振動するため、1相通電の時間T1を短くして、できるだけ速やかに次の2相通電に切り換えることで、ロータ32の振動を速やかに停止させてエンコーダ46の出力信号を安定させるようにしている。
【0038】
このように、初期駆動時に通電相の切り換えを一巡させれば、初期駆動が終了するまでに、いずれかの通電相で必ずロータ32の回転位置と通電相とが一致して、それ以後、通電相の切り換えに同期してロータ32が回転して、このロータ32の回転に同期してエンコーダ46からA相信号及びB相信号が出力されるようになる。
【0039】
この初期駆動中に、エンコーダ46のA相信号及びB相信号の立ち上がり/立ち下がりの両方のエッジをカウントする。従って、初期駆動終了時のエンコーダカウント値を見れば、初期駆動が終了するまでにロータ32が実際に通電相の切り換えに同期して回転した角度(回転量)が分かり、それによって、初期駆動終了時のエンコーダカウント値とロータ32の回転位置と通電相との対応関係が分かる。
【0040】
図12の例では、初期駆動時に最初の通電相(W相)からロータ32が回転し、通電相の切り換え毎にロータ32が7.5°ずつ回転してエンコーダカウント値が2ずつカウントアップし、初期駆動終了時にエンコーダカウント値が12となる。
【0041】
これに対し、例えば、初めの3回の励磁(W相通電→UW相通電→U相通電)でロータ32が回転しない場合、つまり4回目以降の励磁(UV相通電→V相通電→VW相通電)でロータ32の回転位置と通電相とが同期してロータ32が3回の励磁分だけ回転する場合は、初期駆動終了時までにロータ32が7.5°×3=22.5°回転して、エンコーダカウント値が2×3=6となる。従って、初期駆動終了時のエンコーダカウント値を見れば、初期駆動が終了するまでにロータ32が実際に通電相の切り換えに同期して回転した角度(回転量)が判明する。
【0042】
初期駆動の最後の通電相は、常にVW相となるが、エンコーダカウント値は、必ずしも12になるとは限らず、例えば8、或は4である場合もある。初期駆動終了後の通常駆動時には、エンコーダカウント値に基づいて通電相が決定されるため、初期駆動によるエンコーダカウント値のずれを修正しないと、通常駆動時に正しい通電相を選択することができない。
【0043】
そこで、本実施形態では、初期駆動終了時のエンコーダカウント値を初期位置ずれ学習値として学習し、その後の通常駆動時にエンコーダカウント値を初期位置ずれ学習値で補正することで、初期駆動終了時のエンコーダカウント値と通電相(ロータ32の回転位置)とのずれを補正して、通常駆動時に正しい通電相を選択できるようにしている。
【0044】
初期駆動終了後は、図12に示すように、後述するF/B制御開始位置停止保持処理により、初期駆動終了時の通電相(VW相)と同じ相に例えば10ms通電してロータ32の位置を初期駆動終了時の位置に保持し、その後、後述するフィードバック制御(以下「F/B制御」と表記する)により、その時点のエンコーダカウント値と初期位置ずれ学習値とに基づいて通電相を切り換えてロータ32を目標位置Acntの方向へ回転させる。これにより、ロータ32の回転位置(エンコーダカウント値)が目標位置Acntから例えば0.5°以内に到達した時点で、通電相の切り換えを終了してロータ32を停止させ、その後は、後述する目標位置停止保持処理により、同じ相に通電し続けてロータ32の停止状態を保持し、この保持状態を例えば50ms継続する。この後、目標位置Acntが変化しなければ、通電を停止する。
【0045】
また、初期駆動の途中で、Pレンジスイッチ43又はNotPレンジスイッチ44が操作されてレンジ切換要求が発生した場合は、次の2相通電(2相通電の実行中にレンジ切換要求が発生したときはその2相通電)が終了してから通常駆動に移行すると共に、該2相通電終了時のエンコーダカウント値とロータ32の回転位置と通電相との対応関係を学習し、その後の通常駆動時に、エンコーダカウント値と2相通電終了時の学習結果とに基づいて通電相を決定するようにしている。
【0046】
2相通電では、トルクが大きいため、ロータ32の位置が2相通電に対応する位置から多少ずれていたとしても、ロータ32を2相通電に対応する位置まで回転させることができる。このため、初期駆動中に2相通電を1〜2回行うだけでロータ32の回転位置と通電相との同期がとれる確率は高いものと思われる。従って、初期駆動の途中でレンジ切換要求が発生したときには、次の2相通電(又は現在の2相通電)が終了してから通常駆動に移行するようにすれば、初期駆動の途中で、エンコーダカウント値とロータ32の回転位置と通電相との対応関係を学習してから、通常駆動に速やかに移行することができる。
【0047】
例えば、図13のタイムチャートに示すように、初期駆動の2回目の励磁(UW相通電)中に、PレンジからNotPレンジへのレンジ切換要求が発生したときには、このUW相通電で初期駆動を終了して通常駆動に移行すると共に、UW相通電終了時のエンコーダカウント値とロータ32の回転位置と通電相との対応関係を学習する。本実施形態では、初期駆動の途中で通常駆動に移行する場合でも、その初期駆動を最後まで実行したと仮定して、本来の初期駆動終了時のエンコーダカウント値を推定し、その推定値を初期位置ずれ学習値とするようにしている。例えば、図13に示すように、初期駆動をW相通電とUW相通電の2回の励磁で終了する場合は、その後に予定されていた4回の励磁を行わずに初期駆動を終了するため、未終了の4回の励磁(U相通電→UV相通電→V相通電→VW相通電)を行ったものと仮定して、4回の励磁分の回転角度に相当するカウントアップ値(2×4=8)をUW相通電終了時のエンコーダカウント値に加算して初期位置ずれ学習値を求める。
【0048】
ところで、従来のレンジ切換制御では、指令シフトレンジ(目標位置)がPレンジからNotPレンジ又はその反対方向に切り換えられる毎に、ロータ32を回転駆動して、エンコーダカウント値に基づいてSRモータ12の通電相を順次切り換えることでロータ32を目標位置まで回転駆動するフィードバック制御(以下「F/B制御」と表記する)を実行した後に、SRモータ12への通電をオフして、巻線の過熱・焼損を防止するようにしている。
【0049】
しかし、ロータ32の停止中に、通電をオフすると、ロータ32を目標位置(F/B制御終了時の位置)に保持する電磁力が消滅するため、ロータ32の位置が目標位置からずれる可能性がある。本実施形態では、ロータ32を目標位置でディテントバネ23のバネ力により保持する機械的な停止保持機構を設けているが、この場合でも、停止保持機構のガタや製造ばらつき等によりロータ32の位置が目標位置からずれることがある。
【0050】
また、従来のレンジ切換制御では、F/B制御開始時に前回のF/B制御終了時のエンコーダカウント値を用いて最初の通電相を決定し、更に、最初の通電相決定後、直ちにF/B制御を開始するようにしている。
【0051】
従って、ロータ32の位置が停止中にずれた場合、従来のレンジ切換制御では、実際に最初に通電すべき通電相とは異なる通電相からF/B制御を開始してしまうことになる。このため、F/B制御開始時に脱調が発生して起動に失敗したり、ロータ32が目標位置とは反対方向に回転するなど、ロータ32を正常に目標位置へ回転させることができなくなる可能性がある。
【0052】
この対策として、本実施形態では、図18に示すように、SRモータ12の通電オフ状態からF/B制御を開始するときに、ロータ32を現在の位置に2相通電で停止保持する処理(以下「F/B制御開始位置停止保持処理」という)を所定時間(例えば10ms)だけ実行し、その後、F/B制御を実行してロータ32を目標位置まで回転駆動するようにしている。
【0053】
このようにすれば、仮に、ロータ32の停止中にロータ32の位置がずれても、F/B制御開始直前にF/B制御開始位置停止保持処理によってロータ32の位置ずれを修正して、F/B制御開始時のロータ32の位置を正確に位置決めすることができる。これにより、F/B制御開始時に最初の通電相からロータ32の位置と通電相(エンコーダカウント値)とを確実に同期させることができて、F/B制御開始時の脱調やロータ32が目標位置と反対方向に回転することを防止でき、安定したF/B制御を行ってロータ32を確実に目標位置まで回転させることができて、安定性・信頼性の高いレンジ切換制御(位置決め制御)を行うことができる。
【0054】
ところで、レンジ切換制御を高応答化するために、ロータ32の回転速度を高速化して目標位置までの到達時間を短くするようにしている。このため、ロータ32が目標位置に到達した直後は、ロータ32が完全に停止せずにまだ振動した状態になっており、このような状態で通電をオフすると、慣性力によりロータ32の停止位置が目標位置から大きくずれてしまう可能性がある。このようなF/B制御終了時のロータ32の位置ずれが大きくなりすぎると、次のF/B制御開始直前にF/B制御開始位置停止保持処理を行っても、ロータ32の位置ずれを修正することができなくなる可能性がある。
【0055】
この対策として、本実施形態では、F/B制御終了後に、ロータ32を当該F/B制御終了時の位置に2相通電で停止保持する処理(以下「目標位置停止保持処理」という)を所定時間(例えば50ms)だけ実行した後、SRモータ12への通電をオフするようにしている。このようにすれば、ロータ32が目標位置に到達した後、ロータ32の振動が収まってから通電をオフすることができるので、慣性力によりロータ32の停止位置が目標位置から大きくずれることを防止することができる。これにより、レンジ切換制御の安定性・信頼性を維持しながら、レンジ切換制御の高応答化の要求も満たすことができる。
【0056】
更に、本実施形態では、F/B制御中に指令シフトレンジ(目標位置)が変更されてロータ32の回転方向を反転させる必要が生じたときに、ロータ32を反転位置で2相通電により停止保持する処理(以下「反転位置停止保持処理」という)を所定時間(例えば50ms)だけ実行し、その後、F/B制御を再開してロータ32を変更後の目標位置まで回転駆動するようにしている。このようにすれば、F/B制御中に指令シフトレンジ(目標位置)が変更されたときに、ロータ32の反転位置を位置決めして反転動作を安定して行うことができ、反転位置がずれて脱調(通電相のずれ)が発生することを防止できて、ロータ32を変更後の目標位置まで確実に回転駆動することができる。
【0057】
また、本実施形態では、F/B制御中にエンコーダカウント値と目標位置に相当する目標カウント値との差が所定値(例えば通電相の位相進み分に相当するカウント値)以下になったときに、F/B制御を終了して目標位置停止保持処理に移行するようにしている。つまり、ロータ32を回転させるためには、図19に示すように、通電相の位相をロータ32の実際の位置よりも例えば2〜4カウント分(ロータ回転角で3.75°〜15°)だけ進める必要があるため、F/B制御中にエンコーダカウント値と目標カウント値との差が例えば通電相の位相進み分に相当するカウント値になったときに、F/B制御を終了するようにすれば、F/B制御の最後の通電相がロータ32を目標位置に停止保持する通電相と一致するため、目標位置停止保持処理移行後も、F/B制御の最後の通電相に引き続き通電することができ、F/B制御から目標位置停止保持処理への移行をスムーズに行うことができる。
【0058】
ところで、ロータ32を回転駆動するトルクを発生させるためには、ロータ32の回転位相に対して通電相の位相を進める必要がある。F/B制御開始後に、ロータ32の回転速度が上昇するのに伴って、エンコーダカウント値の変化速度が速くなって、通電相の切り換えタイミングが速くなるが、通電相の巻線33,34に通電を開始してから実際にトルクが発生するまでに、巻線33,34のインダクタンス分の遅れが生じるため、ロータ32の回転速度が速くなると、通電相の巻線33,34に通電を開始してから実際にトルクを発生するまでの間に、ロータ32がかなりの角度回転して、実際のロータ32の回転位相に対して通電相のトルク発生タイミングが遅れた状態となる。このような状態になると、駆動トルクが低下してロータ32の回転速度が抑えられてしまい、レンジ切換速度の高速化(ロータの回転速度の高速化)の要求を満たすことができない。
【0059】
この対策として、予め、通電相の位相進み量を大きく設定しておくことが考えられるが、F/B制御開始時(起動時)に、通電相の位相進み量が大きいと、起動トルクが小さくなってSRモータ12の起動が不安定になったり、起動に失敗するおそれがある。
【0060】
また、予め、通電相の位相進み量を大きく設定してロータ32の回転速度を高速化すると、F/B制御終了時にロータ32が慣性により目標位置を越えてオーバーシュートしやすくなり、ロータ32を正確に目標位置で停止させることが難しくなる。
【0061】
そこで、本実施形態では、F/B制御中に、ロータ32の回転速度に応じて該ロータ32の回転位相に対する通電相の位相進み量を補正すると共に、ロータ32の回転速度を減速させる必要が生じたときに(例えばロータ32が目標位置に近付いたときに)、通電相の位相進み量を小さくする方向に補正するようにしている。具体的には、F/B制御開始時に、通電相の位相進み量を小さくするように補正することで、起動トルクを大きくすることができ、ロータ32の回転速度を素早く立ち上げることができる。そして、ロータ32の回転速度が上昇するのに伴って、通電相の位相進み量を大きくするように補正することで、高速回転時でも、通電相のトルク発生タイミングと実際のロータの回転位相との同期関係を維持することができ、ロータ32を高速で安定して回転させることができる。これにより、起動性能と高速性能とを両立させることができる。
【0062】
その後、ロータ32が目標位置に近付いたときに、通電相の位相進み量を小さくする方向に補正すれば、実際のロータ32の回転位相に対して通電相のトルク発生タイミングが遅れた状態となり、それによって、駆動トルクを低下させたり、或は、ロータ32の回転方向と反対方向のトルク(制動トルク)を発生させることができ、ロータ32の回転速度を確実に減速させることができて、ロータ32を正確に目標位置で停止させることができる。これにより、起動性能と高速性能と停止性能(減速性能)に優れたF/B制御を行うことができる。
【0063】
ところで、ロータ32の回転量(回転角度)は、減速機構26、出力軸13、ディテントレバー15等からなる回転伝達系を介してレンジ切換機構11の操作量(パーキングロッド18のスライド量)に変換されるが、回転伝達系を構成する部品間には、遊び(ガタ)が存在する。例えば、減速機構26の歯車間のバックラッシが存在し、また、モータ12の回転軸の先端部に形成した断面非円形の連結部を出力軸13の嵌合穴に嵌め込んで連結する構成では、両者の嵌め込み作業を容易にするためのクリアランスが必要となる。
【0064】
また、図35に示すように、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24やNotPレンジ保持凹部25に嵌まり込んだときに、係合部23aと各保持凹部24,25の側壁との間に僅かな隙間(ガタ)が存在する。このように、ロータ32の回転量をレンジ切換機構11の操作量(パーキングロッド18のスライド量)に変換する回転伝達系には、バックラッシや部品間の隙間等による遊び(ガタ)が存在するため、仮に、エンコーダカウント値に基づいてロータ32の回転量を正確に制御できたとしても、レンジ切換機構11の操作量には回転伝達系の遊び(ガタ)分の誤差が生じてしまい、レンジ切換機構11の操作量を精度良く制御することができない。
【0065】
そこで、本実施形態では、この回転伝達系の遊び量を学習する機能を備えている。具体的には、回転伝達系の遊び量を学習する際に、ディテントバネ23の係合部23aがレンジ切換機構11の可動範囲のPレンジ側の限界位置であるPレンジ保持凹部24の側壁に突き当たるまでロータ32を回転させるPレンジ側突き当て制御(一方向突き当て制御)と、NotPレンジ側の限界位置であるNotPレンジ保持凹部25の側壁に突き当たるまでロータ32を回転させるNotPレンジ側突き当て制御(他方向突き当て制御)とを実行して、Pレンジ側の限界位置からNotPレンジ側の限界位置までのエンコーダカウント値の増減量をレンジ切換機構11の可動範囲の実測値として求める。そして、この可動範囲の実測値と該可動範囲の設計値との差分を回転伝達系の遊び量として学習し、その後、ロータ32を目標位置まで回転させる際に、当該目標位置を回転伝達系の遊び量の学習値を考慮して設定する。このようにすれば、回転伝達系に遊び(ガタ)があっても、その遊びを含めた目標位置を設定することができ、レンジ切換機構11の操作量を精度良く制御することができる。
【0066】
この場合、SRモータ12を制御するECU41の電源投入(イグニッションスイッチのオン操作)からレンジ切換機構11の制御開始までに回転伝達系の遊び量を学習する時間的な余裕があれば、ECU41の電源投入後に、Pレンジ側突き当て制御とNotPレンジ側突き当て制御とを連続して実行して、レンジ切換機構11の制御開始前に回転伝達系の遊び量を学習するようにしても良いが、ECU41の電源投入後にレンジ切換機構11の制御を速やかに開始する必要がある場合は、ECU41の電源投入後に回転伝達系の遊び量を学習する時間的な余裕がない場合がある。
【0067】
そこで、本実施形態では、遊び量学習を行わずにレンジ切換機構11の制御を開始した後、ロータ32がPレンジで停止しているときに、Pレンジ側突き当て制御を実行して、Pレンジ側突き当て時のエンコーダカウント値をECU41のRAMに記憶し、ロータ32がNotPレンジで停止しているときに、NotPレンジ側突き当て制御を実行して、NotPレンジ側突き当て時のエンコーダカウント値をECU41のRAMに記憶し、前記Pレンジ側突き当て時のエンコーダカウント値と前記NotPレンジ側突き当て時のエンコーダカウント値との差分をレンジ切換機構11の可動範囲の実測値として求め、この可動範囲の実測値と該可動範囲の設計値との差分を回転伝達系の遊び量として学習するようにしている。
【0068】
このようにすれば、ECU41の電源投入からレンジ切換機構11の制御開始までに回転伝達系の遊び量を学習する時間的な余裕がなく、遊び量学習を行わずにレンジ切換機構11の制御を開始しても、その後、ロータ32がPレンジ又はNotPレンジで停止している期間に各突き当て制御を実行して回転伝達系の遊び量を学習することができる。この場合、遊び量学習が終了する前は、回転伝達系の遊び量を考慮しない従来同様の制御を行うようにしても良いが、予め設定した平均的な遊び量又は前回の遊び量学習値の記憶値を用いて制御対象を制御するようにしても良い。尚、以下の説明で、単に「突き当て制御」と表記する場合は、Pレンジ側突き当て制御とNotPレンジ側突き当て制御の両方に該当することを意味する。
【0069】
また、本実施形態では、突き当て制御の実行時に、SRモータ12の通電デューティ比(通電率)を通常駆動時よりも低下させることで、SRモータ12のトルクを通常駆動時よりも低下させるようにしている。SRモータ12のトルクは、レンジ切換時にディテントバネ23の係合部23aがディテントレバー15の両保持凹部24,25間の山部を確実に乗り越えることができるように大きなトルクに設定されているが、突き当て制御では、SRモータ12のトルクによってディテントバネ23の係合部23aをディテントレバー15の各保持凹部24,25の側壁に突き当てた状態にするため、SRモータ12のトルクが大きいと、突き当て制御の実行回数が増えるに従って、ディテントバネ23の係合部23a等の回転伝達系の部品が徐々に変形・損傷する可能性があり、耐久性・信頼性を低下させるおそれがある。
【0070】
この対策として、突き当て制御実行時にSRモータ12のトルクを低下させれば、ディテントバネ23の係合部23aをディテントレバー15の各保持凹部24,25の側壁に突き当てる力を弱めることができ、突き当て制御によるディテントバネ23の係合部23a等の回転伝達系の部品の変形・損傷を防止できて、耐久性・信頼性を確保することができる。尚、本実施形態の突き当て制御では、ディテントバネ23の係合部23aがディテントレバー15の両保持凹部24,25間の山部を乗り越える必要がないため、突き当て制御実行時にSRモータ12のトルクを低下させても、ディテントバネ23の係合部23aをディテントレバー15の各保持凹部24,25の側壁に突き当てるだけの必要最小限のトルクがあれば、突き当て制御を正常に実行できる。
【0071】
また、本実施形態では、突き当て制御実行時に、ロータ32の回転速度を遅くするように通電相の位相進み量を補正するようにしている。つまり、突き当て制御実行時に、ロータ32の回転速度が速いと、ディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁に衝突する速度が速くなって、その衝撃力でディテントバネ23の係合部23a等の回転伝達系の部品が徐々に変形・損傷する可能性があるが、突き当て制御実行時に、ロータ32の回転速度を遅くすれば、突き当て制御実行時にディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁に衝突する速度が遅くなって、その衝撃力を弱めることができ、ディテントバネ23の係合部23a等の回転伝達系の部品の変形・損傷を防止することができて、耐久性・信頼性を確保することができる。
【0072】
また、本実施形態では、突き当て制御実行時に、ディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁に突き当たった状態で該係合部23aが保持凹部24,25の側壁を僅かに乗り上げる角度(乗り上げ補正量)をSRモータ12の電源電圧であるバッテリ電圧に基づいて推定し、その推定値分だけレンジ切換機構11の可動範囲の実測値を補正するようにしている。つまり、突き当て制御実行時に、ディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁を乗り上げる角度(乗り上げ補正量)は、SRモータ12のトルクが大きくなるほど大きくなる。一般に、SRモータ12のトルクは、その電源電圧(バッテリ電圧)によって変化するため、電源電圧(バッテリ電圧)とSRモータ12のトルクとの間には相関関係があり、電源電圧(バッテリ電圧)をSRモータ12のトルクの代用情報として用いることができる。従って、突き当て制御実行時に、ディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁を乗り上げる角度(乗り上げ補正量)を、SRモータ12のトルクの代用情報である電源電圧(バッテリ電圧)に基づいて推定し、その推定値分だけレンジ切換機構11の可動範囲の実測値を補正するようにすれば、レンジ切換機構11の可動範囲の実測値を精度良く求めることができる。
【0073】
ところで、F/B制御中に、例えば、エンコーダ46のA相信号又はB相信号が何等かの原因で一時的に欠けたり、エンコーダ46の信号ラインに重畳したノイズパルスが正規のパルス信号と誤認されたり、脱調が発生したりすると、通電相(エンコーダカウント値)とロータ32の回転位相との同期が取れなくなって、ロータ32を正常に駆動できなくなってしまい、それによって、ロータ32が停止したり、逆回転することがあり、F/B制御を正常に続けられない状態になって制御不能に陥ることがある。
【0074】
そこで、本実施形態では、F/B制御中に、F/B制御状態(ロータ32の回転状態)が正常か異常かを監視し、異常が検出されれば、その時点で、F/B制御からオープンループ制御に切り換えてリカバリ処理を実行する。図47に示すリカバリ処理の実行例では、シフトレンジをPレンジからNotPレンジに切り換えるF/B制御の途中で、そのF/B制御状態が異常になって、ロータ32の異常停止又はエンコーダカウント値Ncntのカウント動作の異常停止が発生したした時点で、F/B制御からオープンループ制御に切り換えてリカバリ処理を実行する。
【0075】
オープンループ制御(リカバリ処理)中は、エンコーダカウント値Ncntの情報をフィードバックせずに通電相を順次切り換えてロータ32を回転駆動すると共に、当該オープンループ制御中に通電相を切り換える毎にオープンループ制御時の位置カウント値Ncntopをカウントアップ(又はカウントダウン)して、この位置カウント値Ncntopが目標カウント値Acntに到達した時点で、ロータ32が目標位置に到達したと判断してオープンループ制御(リカバリ処理)を終了し、F/B制御に復帰する。その結果、本実施形態では、F/B制御中に、エンコーダカウント値Ncntの異常や脱調等が発生してF/B制御状態(ロータ32の回転状態)が一時的に異常になっても、オープンループ制御によりロータ32を目標位置まで回転させることができる。
【0076】
この際、F/B制御状態の異常検出方法は、次の3つの異常検出方法▲1▼〜▲3▼のいずれか1つ又は2つ、或は全てを用いるようにすれば良い。
【0077】
[異常検出方法▲1▼]
図48に示すように、F/B制御中に、A相信号のエッジとB相信号のエッジとを別々にカウントし、A相信号のカウント値NaとB相信号のカウント値Nbとの偏差|Na−Nb|が異常判定値(例えば3)以上であるか否かでF/B制御状態の異常の有無を監視する。F/B制御中にA相信号とB相信号が正常に出力されていれば、A相信号のカウント値NaとB相信号のカウント値Nbとの差が0又は1となるため、両信号のカウント値の偏差|Na−Nb|が2以上になれば、いずれか一方の信号の抜けやノイズパルスの混入が考えられる。このような状態になると、エンコーダカウント値Ncntとロータ32の回転位置との同期が取れなくなって、ロータ32の回転状態(F/B制御状態)が異常になるため、両信号のカウント値の偏差|Na−Nb|によってロータ32の回転状態(F/B制御状態)の異常の有無を判定することができる。
【0078】
[異常検出方法▲2▼]
図48に示すように、F/B制御中に、A相信号のエッジ間隔ΔTaとB相信号のエッジ間隔ΔTbを計測して、各信号のエッジ間隔ΔTa,ΔTbが異常判定値(例えばΔTa,ΔTbの平均値の10倍)以上であるか否かで、F/B制御状態の異常の有無を監視する。
【0079】
尚、異常検出方法▲2▼として、ロータ回転速度を監視することにより、異常検出するようにしても良く、例えば、単位時間当りのエンコーダ46の出力パルス数に基づいて異常検出するようにしても良い。
【0080】
[異常検出方法▲3▼]
図49に示すように、F/B制中に、エンコーダカウント値Ncntの変化方向からロータ32の回転方向を監視し、該ロータ32の回転方向が目標位置へ向かう回転方向から逆転したか否かでF/B制御状態(ロータ32の回転状態)の異常の有無を監視する。本実施形態では、エンコーダカウント値Ncntが目標位置と反対方向に連続して更新される回数をカウントし、そのカウント値Crが異常判定値(例えば4)以上であるか否かで、F/B制御状態(ロータ32の回転状態)の異常の有無を監視する。つまり、エンコーダカウント値Ncntが目標位置と反対方向に連続して例えば4回以上更新されたときにロータ32の逆転と判断して、逆転検出フラグXrをONに切り換える。
【0081】
更に、本実施形態では、オープンループ制御中の励磁方式を1−2相励磁方式に設定し、オープンループ制御開始時の最初の励磁を2相通電で行うと共に、図50に示すように、オープンループ制御開始から例えば3ステップ分は、各通電相の励磁時間を最長時間(例えば50ms)に設定して、ロータ32を確実に掴んでロータ32の回転位相と通電相とを確実に同期させる。この後は、励磁時間を大幅に短くするが、ロータ32の回転速度の上昇に伴って励磁時間を徐々に短くして、ロータ32の回転速度を緩やかに上昇させる。
【0082】
このオープンループ制御中のロータ32の回転位置を推定するために、オープンループ制御開始時のロータ32の初期位置(位置カウント値Ncntopの初期値)を出力軸センサ14の出力信号に基づいて算出し、その後、通電相を切り換える毎に、位置カウント値Ncntopをカウントアップ(又はカウントダウン)して、この位置カウント値Ncntopに基づいてロータ32の回転位置を推定し、この位置カウント値Ncntopと目標カウント値Acntとの差が所定値以下になった時点で、減速領域に入ったと判断して、励磁時間を徐々に長くして、ロータ32の回転速度を緩やかに減速し、該位置カウント値Ncntopが目標カウント値Acntに到達した時点で、ロータ32が目標位置に到達したと判断して、オープンループ制御を終了し、F/B制御に復帰する。
【0083】
ところで、エンコーダ46のパルス抜け又はノイズがあると、エンコーダカウント値Ncntとロータ32の回転位置(レンジ切換機構11の操作量)との関係又はエンコーダカウント値Ncntと通電相との関係がずれる可能性がある。
【0084】
そこで、本実施形態では、オープンループ制御からF/B制御に復帰させるときに、前述した初期駆動と突き当て制御を再実行するようにしている。これにより、オープンループ制御中にエンコーダカウント値Ncntとロータ32の回転位置(レンジ切換機構11の操作量)との関係又はエンコーダカウント値Ncntと通電相との関係がずれても、そのずれを初期駆動と突き当て制御によって精度良く補正することができる。
【0085】
更に、本実施形態では、オープンループ制御によりSRモータ12を目標位置に向かって回転駆動している期間は、Pレンジスイッチ43やNotPレンジスイッチ44が操作されても、その操作信号を無視するようにしている。オープンループ制御中はロータ回転速度が遅く、レンジ切換動作に要するモータ駆動時間が長くなるため、オープンループ制御の途中でPレンジスイッチ43やNotPレンジスイッチ44が操作される可能性があるが、オープンループ制御中はロータ32の正確な回転位置を検出できないため、オープンループ制御の途中で目標位置(指令シフトレンジ)が切り換えられて、ロータ32の回転駆動方向が逆転されると、ロータ32の回転位相と通電相との同期関係がずれて脱調が発生しやすくなり、ロータ32を駆動できない可能性がある。従って、オープンループ制御の途中でPレンジスイッチ43やNotPレンジスイッチ44が操作されても、その操作信号を無視するようにすれば、オープンループ制御の信頼性を向上させることができる。
【0086】
ところで、F/B制御系が故障してF/B制御ではSRモータ12を正常に駆動できなくなった場合でも、オープンループ制御に切り換えれば、SRモータ12を正常に駆動できる可能性がある。例えば、エンコーダ46が故障した場合、或は、SRモータ12の2系統のモータ励磁部35,36(巻線33,34)のうちのいずれか一方の系統が故障したり、2系統のモータドライバ37,38のうちのいずれか一方の系統が故障してSRモータ12の駆動力が低下した場合でも、オープンループ制御に切り換えれば、SRモータ12を正常に駆動できる可能性がある。
【0087】
そこで、本実施形態では、後述する図56のシステム異常診断ルーチンによってF/B制御系の故障(システム異常)を検出したときに、後述する図58のフェールセーフ処理ルーチンにより、フェールセーフ処理時のオープンループ制御に切り換えてSRモータ12を駆動するようにしている。このフェールセーフ処理時のオープンループ制御は、前述したリカバリ処理時のオープンループ制御と同じである。
【0088】
このフェールセーフ処理(オープンループ制御)によるモータ駆動を何回も繰り返しても、それが失敗に終わるような場合は、SRモータ12やその駆動制御系が完全に故障して制御不能に陥っているものと考えられるため、本実施形態では、フェールセーフ処理(オープンループ制御)によるモータ駆動を連続して例えば3回以上失敗したときに、オープンループ制御でも制御不能と判断してSRモータ12の通電をオフするようにしている。このようにすれば、オープンループ制御不能と判断した後は、オープンループ制御を繰り返さずに済み、消費電力を節約することができる。
【0089】
以上説明した本実施形態のレンジ切換制御は、レンジ切換制御装置42のECU41によって後述する各ルーチンに従って実行される。以下、これら各ルーチンの処理内容を説明する。
【0090】
[初期駆動]
図8及び図9に示す初期駆動ルーチンに従って実行される。本ルーチンは、ECU41への電源投入直後(イグニッションスイッチをOFF位置からACC位置へ操作した直後)に、初期駆動が終了するまで所定周期(例えば1ms周期)で実行される。
【0091】
本ルーチンが起動されると、まずステップ101で、フェールセーフ処理実行フラグXfsop=ON、又は、リカバリ処理実行フラグXrcv=ONであるか否かを判定する。ここで、フェールセーフ処理実行フラグXfsopは、エンコーダ46又はSRモータ12が故障したときに実行されるフェールセーフ処理(オープンループ制御によるレンジ切り換え)が実行されているか否かを判定するフラグであり、ONは実行されていることを意味する。また、リカバリ処理実行フラグXrcvは、一時的なF/B制御状態の異常が発生したときに一時的に実行されるリカバリ処理(オープンループ制御)が実行されているか否かを判定するフラグであり、ONは実行されていることを意味する。
【0092】
もし、上記ステップ101で、「Yes」と判定されれば、以降の処理を行うことなく、本ルーチンを終了し、「No」と判定されれば、ステップ102に進み、ECU41のイニシャル処理から出力軸センサ14の出力電圧が安定するまで待つための所定時間(例えば100ms)が経過したか否かを判定する。そして、イニシャル処理から所定時間経過した時点で、ステップ103に進み、出力軸センサ14の出力電圧を読み込んで、この出力電圧がレンジ判定値以下であるか否かで、現在のレンジがPレンジかNotPレンジかを判定し、Pレンジであれば、ステップ104に進み、レンジ判定フラグXnpをPレンジを意味する「0」にセットし、NotPレンジであれば、ステップ105に進み、レンジ判定フラグXnpをNotPレンジを意味する「1」にセットする。
【0093】
この後、ステップ106に進み、レンジ判定フラグXnp=0(Pレンジ)であるか否かを判定し、レンジ判定フラグXnp=0(Pレンジ)であれば、ステップ107に進み、図10のPレンジ初期駆動ルーチンを実行し、レンジ判定フラグXnp=1(NotPレンジ)であれば、ステップ108に進み、図11のNotPレンジ初期駆動ルーチンを実行する。
【0094】
上記ステップ107で、図10のPレンジ初期駆動ルーチンが起動されると、ステップ201〜206で、初期駆動中の励磁回数をカウントする励磁回数カウンタCASEが0〜5のいずれであるかを判定する。この励磁回数カウンタCASEは、イニシャル処理でセットされる初期値が0で、励磁を1回行う毎に1ずつカウントアップされる(図9のステップ114)。そして、励磁回数カウンタCASEの判定結果に応じて通電相と通電時間Tを次のように設定する。
【0095】
CASE=0(1回目の励磁)の場合は、ステップ207に進み、W相通電を選択し、その通電時間TをT1(例えば10ms)にセットする。
CASE=1(2回目の励磁)の場合は、ステップ208に進み、UW相通電を選択し、その通電時間TをT2(例えば100ms)にセットする。
【0096】
CASE=2(3回目の励磁)の場合は、ステップ209に進み、U相通電を選択し、その通電時間TをT1(例えば10ms)にセットする。
CASE=3(4回目の励磁)の場合は、ステップ210に進み、UV相通電を選択し、その通電時間TをT2(例えば100ms)にセットする。
【0097】
CASE=4(5回目の励磁)の場合は、ステップ211に進み、V相通電を選択し、その通電時間TをT1(例えば10ms)にセットする。
CASE=5(6回目の励磁)の場合は、ステップ212に進み、VW相通電を選択し、その通電時間TをT2(例えば100ms)にセットする。
【0098】
これにより、Pレンジで初期駆動を行う場合は、W相通電→UW相通電→U相通電→UV相通電→V相通電→VW相通電の順序で通電相の切り換えを一巡し、ロータ32を正回転方向(Pレンジ→NotPレンジの回転方向)に駆動する。この際、1相通電の時間T1を2相通電の時間T2よりも短く設定する。
【0099】
一方、ステップ108で、図11のNotPレンジ初期駆動ルーチンが起動されると、ステップ221〜226で、励磁回数カウンタCASEが0〜5のいずれであるかを判定し、その判定結果に応じて通電相と通電時間Tを次のように設定する。
【0100】
CASE=0(1回目の励磁)の場合は、ステップ227に進み、V相通電を選択し、その通電時間TをT1(例えば10ms)にセットする。
CASE=1(2回目の励磁)の場合は、ステップ228に進み、UV相通電を選択し、その通電時間TをT2(例えば100ms)にセットする。
【0101】
CASE=2(3回目の励磁)の場合は、ステップ229に進み、U相通電を選択し、その通電時間TをT1(例えば10ms)にセットする。
CASE=3(4回目の励磁)の場合は、ステップ230に進み、UW相通電を選択し、その通電時間TをT2(例えば100ms)にセットする。
【0102】
CASE=4(5回目の励磁)の場合は、ステップ231に進み、W相通電を選択し、その通電時間TをT1(例えば10ms)にセットする。
CASE=5(6回目の励磁)の場合は、ステップ232に進み、VW相通電を選択し、その通電時間TをT2(例えば100ms)にセットする。
【0103】
これにより、NotPレンジで初期駆動を行う場合は、V相通電→UV相通電→U相通電→UW相通電→W相通電→VW相通電の順序で通電相の切り換えを一巡し、ロータ32を逆回転方向(NotPレンジ→Pレンジの回転方向)に駆動する。この場合も、1相通電の時間T1を2相通電の時間T2よりも短く設定する。
【0104】
以上のようにして、図10のPレンジ初期駆動ルーチン又は図11のNotPレンジ初期駆動ルーチンを実行した後、図8のステップ109に進み、初期駆動中にレンジ切換操作(Pレンジスイッチ43又はNotPレンジスイッチ44の操作)が行われたか否かを判定し、初期駆動中にレンジ切換操作が行われれば、ステップ110に進み、レンジ切換操作フラグXchgをONにセットし、レンジ切換操作が行われていなければ、ステップ111に進み、レンジ切換操作フラグXchgをOFFにセットする。
【0105】
この後、図9のステップ112に進み、現在の通電相の通電時間をカウントする通電時間カウンタCTをカウントアップし、次のステップ113で、現在の通電相の通電時間CTが前記図10又は図11のルーチンで設定した通電時間T(=T1又はT2)を越えたか否かを判定し、越えていなければ、以降の処理を行うことなく、本ルーチンを終了する。これにより、現在の通電相の通電時間CTが図10又は図11のルーチンで設定した通電時間T(=T1又はT2)を越えるまで、現在の通電相への通電が継続される。
【0106】
その後、現在の通電相の通電時間CTが図10又は図11のルーチンで設定した通電時間T(=T1又はT2)を越えた時点で、ステップ114に進み、励磁回数カウンタCASEを1だけカウントアップし、通電相を次の通電相に切り換える。そして、次のステップ115で、通電時間カウンタCTをリセットした後、ステップ116に進み、励磁回数カウンタCASEが初期駆動の終了を意味する「6」に達したか否かを判定し、もし、励磁回数カウンタCASEが「6」に達していれば、ステップ118に進み、初期駆動終了フラグXendを初期駆動の終了を意味する「ON」にセットする。
【0107】
また、励磁回数カウンタCASEが「6」に達していない場合、つまり、初期駆動の途中である場合は、ステップ117に進み、初期駆動の途中終了条件が成立しているか否かを判定する。この初期駆動の途中終了条件は、次の3つの条件▲1▼〜▲3▼によって判定される。
▲1▼レンジ判定フラグXnpが0(Pレンジ)であること
▲2▼励磁回数カウンタCASEが2又は4、つまり2相通電終了時であること
▲3▼レンジ切換操作フラグXchgがON、つまり初期駆動中にレンジ切換操作が行われたこと
【0108】
これら3つの条件▲1▼〜▲3▼のうち、1つでも満たさない条件があれば、初期駆動の途中終了条件が成立せず、初期駆動を継続する。これに対し、3つの条件▲1▼〜▲3▼を全て満たしていれば、初期駆動の途中終了条件が成立して、ステップ118に進み、初期駆動終了フラグXendを初期駆動の終了を意味する「ON」にセットする。
【0109】
この後、ステップ119に進み、レンジ判定フラグXnp=1であるか否か(NotPレンジで初期駆動を行ったか否か)を判定し、レンジ判定フラグXnp=1であれば、ステップ120に進み、初期駆動終了時のエンコーダカウント値Ncntを初期位置ずれ学習値Gcntとして記憶する。そして、次のステップ121で、エンコーダカウント値Ncntを次式によりNotPレンジを基準にした値に補正する。
Ncnt=Ncnt+288
【0110】
本実施形態では、Pレンジの保持位置を0点位置としてエンコーダカウント値Ncntをカウントアップし、NotPレンジの保持位置までロータ32が回転したときに、エンコーダカウント値Ncntが例えば288となるようになっている。従って、NotPレンジで初期駆動を行った場合は、初期駆動終了時のエンコーダカウント値Ncntに288を加算することで、エンコーダカウント値NcntをNotPレンジを基準にした値に補正する。
【0111】
一方、上記ステップ119で、レンジ判定フラグXnp=0(Pレンジで初期駆動)と判定されれば、ステップ122に進み、初期駆動終了時のエンコーダカウント値Ncntを用いて初期位置ずれ学習値Gcntを次式により算出する。
Gcnt=Ncnt+2×(6−CASE)
【0112】
この場合、初期駆動が最後まで行われれば、ステップ114の処理によりCASE=6となるため、初期駆動終了時のエンコーダカウント値Ncntがそのまま初期位置ずれ学習値Gcntとなるが、Pレンジで初期駆動を行う場合は、初期駆動の途中でレンジ切換操作が行われたときに、次の2相通電(2相通電の実行中にレンジ切換要求が発生したときはその2相通電)が終了してから通常駆動に移行するため、その初期駆動を最後まで実行したと仮定して、本来の初期駆動終了時のエンコーダカウント値Ncntを推定し、その推定値を初期位置ずれ学習値Gcntとするようにしている。2×(6−CASE)は、未終了の励磁回数分の回転角度に相当するカウントアップ値(以下「Ncnt補正量」という)である。
【0113】
図14は、初期駆動時の励磁回数カウンタCASE、Ncnt補正量、通電相、A相信号、B相信号、エンコーダカウント値Ncntの関係を説明するタイムチャートである。例えば、初期駆動中に、UW相通電終了時(励磁回数カウンタCASEが1から2になったとき)に初期駆動を終了する場合は、Ncnt補正量=2×(6−CASE)=2×(6−2)=8となり、UV相通電終了時(励磁回数カウンタCASEが3から4になったとき)に初期駆動を終了する場合は、Ncnt補正量=2×(6−CASE)=2×(6−4)=4となる。
【0114】
[エンコーダカウンタ]
次に、図15に示すエンコーダカウンタルーチンの処理内容を説明する。本ルーチンは、AB相割り込み処理によりA相信号とB相信号の立ち上がり/立ち下がりの両方のエッジに同期して起動され、A相信号とB相信号の立ち上がり/立ち下がりの両方のエッジを次のようにしてカウントする。本ルーチンが起動されると、まずステップ301で、A相信号とB相信号の値A(i) 、B(i) を読み込み、次のステップ302で、図16のカウントアップ値ΔN算出マップを検索して、A相信号とB相信号の今回値A(i) 、B(i) と、前回値A(i-1) 、B(i-1) に応じたカウントアップ値ΔNを算出する。
【0115】
ここで、A相信号とB相信号の今回値A(i) 、B(i) と、前回値A(i-1) 、B(i-1) を用いる理由は、A相信号とB相信号の発生順序によってロータ32の回転方向を判定するためであり、図17に示すように、正回転(Pレンジ→NotPレンジの回転方向)ではカウントアップ値ΔNをプラス値にしてエンコーダカウント値Ncntをカウントアップし、逆回転(NotPレンジ→Pレンジの回転方向)ではカウントアップ値ΔNをマイナス値にしてエンコーダカウント値Ncntをカウントダウンする。
【0116】
カウントアップ値ΔNの算出後、ステップ303に進み、前回のエンコーダカウント値Ncntに上記ステップ302で算出したカウントアップ値ΔNを加算して、今回のエンコーダカウント値Ncntを求める。この後、ステップ304に進み、次回のカウント処理のために、A相信号とB相信号の今回値A(i) 、B(i) をそれぞれA(i-1) 、B(i-1) として記憶して本ルーチンを終了する。
【0117】
[制御モード設定]
図20乃至図22に示す制御モード設定ルーチンは、初期駆動終了後に所定周期(例えば1ms周期)で実行され、制御モード判定値modeを0、1、3、4、5のいずれかに設定して、下記のように制御モードを指定する。
【0118】
mode=0:通電オフ(スタンバイ)
mode=1:通常駆動
(F/B制御開始位置停止保持処理及びF/B制御)
mode=3:目標位置停止保持処理
mode=4:反転位置停止保持処理
mode=5:オープンループ制御
【0119】
制御モード設定ルーチンが起動されると、まずステップ401で、システム故障フラグXfailoffがレンジ切換制御装置42の故障を意味するONにセットされているか否かを判定し、もし、Xfailoff=ONに設定されていれば、ステップ402に進み、SRモータ12を通電オフ状態に維持するための処理を実行する。これにより、回転方向指示値D=0(停止)、通電フラグXon=OFF(通電オフ)、F/B許可フラグXfb=OFF(F/B制御禁止)、制御モード判定値mode=0(通電オフ)にセットする。
【0120】
一方、システム故障フラグXfailoffがOFF(故障無し)の場合は、ステップ401からステップ403に進み、フェールセーフ処理実行フラグXfsop=OFF、且つ、リカバリ処理実行フラグXrcv=OFFであるか否かを判定する。もし、フェールセーフ処理実行フラグXfsopとリカバリ処理実行フラグXrcvのいずれか一方又は両方がONにセットされている場合は、ステップ404に進み、オープンループ制御を実行するために、回転方向指示値D=0(停止)、制御モード判定値mode=5(オープンループ制御)、F/B許可フラグXfb=OFF(F/B制御禁止)にセットする。
【0121】
フェールセーフ処理実行フラグXfsopとリカバリ処理実行フラグXrcvの両方がOFFにセットされている場合は、ステップ405に進み、通電フラグXon=ON(通電オン)にセットされているか否かを判定し、通電フラグXon=OFF(通電オフ)にセットされている場合は、ステップ406に進み、目標カウント値Acntとエンコーダカウント値Ncntとの差(目標位置とロータ32と位置との差)を求めて、この差(Acnt−Ncnt)に基づいて正回転(Pレンジ→NotPレンジ方向への回転)、逆回転(NotPレンジ→Pレンジ方向への回転)、停止のいずれに該当するか判定する。この際、エンコーダカウント値Ncntは、前記図8及び図9の初期駆動ルーチンで学習された初期位置ずれ学習値Gcntによって補正された値を用いる。
Ncnt=Ncnt−Gcnt
尚、目標カウント値Acntは、後述する図45及び図46の目標カウント値設定ルーチンで設定される。
【0122】
目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)が+Kth以上(例えば+10°以上)であれば、ロータ32を正回転方向(Pレンジ→NotPレンジの回転方向)に回転駆動する必要があると判断して、ステップ407に進み、回転方向指示値D=1(正回転)、通電フラグXon=ON(通電オン)、制御モード判定値mode=1(F/B制御開始位置停止保持処理及びF/B制御)にセットする。
【0123】
目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)が−Kth以下(例えば−10°以下)であれば、ロータ32を逆回転方向(NotPレンジ→Pレンジの回転方向)に回転駆動する必要があると判断して、ステップ409に進み、回転方向指示値D=−1(逆回転)、通電フラグXon=ON(通電オン)、制御モード判定値mode=1(F/B制御開始位置停止保持処理及びF/B制御)にセットする。
【0124】
目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)が−Kthから+Kthの範囲内(例えば−10°から+10°の範囲内)であれば、ロータ32を目標位置にディテントバネ23のバネ力により保持することが可能である(SRモータ12への通電は不要)と判断して、ステップ408に進み、SRモータ12を通電オフ状態に維持するために、回転方向指示値D=0(停止)、通電フラグXon=OFF(通電オフ)、制御モード判定値mode=0(通電オフ)にセットする。
【0125】
一方、前記ステップ405で、通電フラグXon=ON(通電オン)にセットされていると判定された場合は、図21のステップ410〜415の処理によって、指令シフトレンジ(目標位置)が反転されたか否かを判定し、反転されていれば、回転方向指示値Dを反転させる。
【0126】
具体的には、まずステップ410で、回転方向指示値D=1(正回転)であるか否かを判定し、回転方向指示値D=1(正回転)であれば、ステップ411に進み、目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)がマイナス値であるか否かで、ロータ32の回転方向を正回転から逆回転に反転させる必要があるか否かを判定し、その必要があれば、ステップ412に進み、回転方向指示値D=−1(逆回転)にセットする。
【0127】
これに対して、上記ステップ410で、回転方向指示値Dが1(正回転)でないと判定された場合(つまりD=0又は−1の場合)は、ステップ413に進み、回転方向指示値D=−1(逆回転)であるか否かを判定し、回転方向指示値D=−1(逆回転)であれば、ステップ414に進み、目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)がプラス値であるか否かで、ロータ32の回転方向を逆回転から正回転に反転させる必要があるか否かを判定し、その必要があれば、ステップ415に進み、回転方向指示値D=1(正回転)にセットする。
【0128】
以上のようにして、回転方向指示値Dが反転された場合は、ステップ416に進み、ロータ32の回転方向を反転させるために、制御モード判定値mode=4(反転位置停止保持処理)、F/B許可フラグXfb=OFF(F/B制御禁止)にセットしてステップ417に進む。これに対し、回転方向指示値Dが反転されない場合は、上記ステップ416の処理を行わずにステップ417に進む。
【0129】
このステップ417では、制御モード判定値mode=4(反転位置停止保持処理)にセットされているか否かを判定し、「Yes」であれば、ステップ418に進み、通電フラグXon=ON(通電オン)にセットして、反転位置停止保持処理を実行する。
【0130】
これに対して、上記ステップ417で「No」と判定された場合(反転位置停止保持処理ではない場合)は、図22のステップ419〜421で、F/B制御の終了タイミングであるか否かを判定する。具体的には、まずステップ419で、回転方向指示値D≧0(正回転又は停止)であるか否かを判定し、回転方向指示値D≧0であれば、ステップ420に進み、目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)が+Kref以下(例えば+0.5°以下)であるか否かで、F/B制御の終了タイミングであるか否かを判定する。また、回転方向指示値D=−1(逆回転)であれば、ステップ421に進み、目標カウント値Acntとエンコーダカウント値Ncntとの差(Acnt−Ncnt)が−Kref以上(例えば−0.5°以上)であるか否かで、F/B制御の終了タイミングであるか否かを判定する。
【0131】
つまり、F/B制御の終了判定値Krefを例えば通電相の位相進み分(例えば2〜4カウント分)に設定することで、目標カウント値Acntよりも通電相の位相進み分だけ前のタイミングでF/B制御を終了するようにしたものである。これにより、F/B制御の最後の通電相がロータ32を目標位置(目標カウント値Acnt)に停止保持する通電相と一致するようになる。
【0132】
上記ステップ420又は421で「No」と判定された場合(F/B制御の終了タイミングでない場合)は、ステップ422に進み、目標位置停止保持処理の時間をカウントする停止保持時間カウンタCTholdをリセットする。
【0133】
一方、上記ステップ420又は421で「Yes」と判定された場合(F/B制御の終了タイミングである場合)は、ステップ423に進み、F/B許可フラグXfb=OFF(F/B制御禁止)にセットし、F/B制御を終了して目標位置停止保持処理に移行する。そして、次のステップ424で、停止保持時間カウンタCTholdをカウントアップして、目標位置停止保持処理の時間をカウントする。
【0134】
この後、ステップ425に進み、目標位置停止保持処理の時間CTholdが所定時間(例えば50ms)に達したか否かを判定し、目標位置停止保持処理の時間CTholdが所定時間(例えば50ms)に達していなければ、ステップ426に進み、目標位置停止保持処理を続行するために、回転方向指示値D=0(停止)、通電フラグXon=ON(通電オン)、制御モード判定値mode=3(目標位置停止保持処理)に維持する。
【0135】
その後、目標位置停止保持処理の時間CTholdが所定時間(例えば50ms)に達した時点で、ステップ427に進み、SRモータ12の通電をオフするために、回転方向指示値D=0(停止)、通電フラグXon=OFF(通電オフ)、制御モード判定値mode=0(通電オフ)にセットする。
【0136】
[時間同期モータ制御]
図23に示す時間同期モータ制御ルーチンは、初期駆動終了後に所定周期(例えば1ms周期)で起動され、F/B制御開始位置停止保持処理、目標位置停止保持処理、反転位置停止保持処理を実行する。
【0137】
本ルーチンが起動されると、まずステップ501で、F/B許可フラグXfb=OFF(F/B制御禁止)であるか否かを判定し、F/B許可フラグXfb=ON(F/B制御実行)の場合は、以降の処理を行うことなく、本ルーチンを終了する。この場合は、後述する図30に示すF/B制御ルーチンによって通電相の設定と通電処理が実行される。
【0138】
これに対して、上記ステップ501で、F/B許可フラグXfb=OFF(F/B制御禁止)と判定された場合は、ステップ502〜504で、制御モード判定値mode=1,3,4のいずれかに該当するか否かを判定し、制御モード判定値mode=1(F/B制御開始位置停止保持処理及びF/B制御)の場合は、ステップ502からステップ505に進み、後述する図24に示すmode1ルーチンを実行して、F/B制御開始位置停止保持処理実行時の通電相を設定するための通電相判定値Mptnを算出する。
【0139】
また、制御モード判定値mode=3(目標位置停止保持処理)の場合は、ステップ503からステップ506に進み、後述する図25に示すmode3ルーチンを実行して、目標位置停止保持処理実行時の通電相を設定するための通電相判定値Mptnを算出する。
【0140】
また、制御モード判定値mode=4(反転位置停止保持処理)の場合は、ステップ504からステップ507に進み、後述する図26に示すmode4ルーチンを実行して、反転位置停止保持処理実行時の通電相を設定するための通電相判定値Mptnを算出する。
【0141】
以上のようにして、制御モード判定値mode=1,3,4の場合は、通電相判定値Mptnを算出した後、ステップ508に進み、後述する図27に示す通電処理ルーチンを実行して、F/B制御開始位置停止保持処理、目標位置停止保持処理、反転位置停止保持処理を実行する。
【0142】
一方、上記ステップ502〜504で、いずれも「No」と判定された場合、つまり、制御モード判定値mode=0,5の場合は、ステップ508に進み、後述する図27に示す通電処理ルーチンを実行して、通電オフ又はオープンループ制御を実行する。
【0143】
[mode1]
図24に示すmode1ルーチンは、図23の時間同期モータ制御ルーチンのステップ505で起動されるサブルーチンであり、F/B制御開始位置停止保持処理時の通電相判定値Mptn(通電相)を次のようにして設定する。
【0144】
本ルーチンが起動されると、まずステップ511で、F/B制御開始位置停止保持処理の時間をカウントする通電時間カウンタCT1をカウントアップし、次のステップ512で、F/B制御開始位置停止保持処理の時間CT1が所定時間(例えば10ms)を越えたか否かを判定する。
【0145】
もし、F/B制御開始位置停止保持処理の時間CT1が所定時間(例えば10ms)を越えていなければ、ステップ513に進み、停止保持時通電相記憶済みフラグXhold=OFF(未記憶)であるか否か(つまりF/B制御開始位置停止保持処理の開始直前のタイミングであるか否か)を判定し、停止保持時通電相記憶済みフラグXhold=OFFであれば、ステップ514に進み、F/B制御開始位置停止保持処理時の通電相判定値Mptnを現在の位置カウンタ値(Ncnt−Gcnt)にセットする。
Mptn=Ncnt−Gcnt
【0146】
ここで、位置カウンタ値(Ncnt−Gcnt)は、エンコーダカウント値Ncntを初期位置ずれ学習値Gcntで補正した値であり、ロータ32の現在位置を正確に表した値となっている。
【0147】
この後、ステップ515に進み、通電相判定値Mptnを“12”で割り算して、その余りMptn%12を求める。ここで、“12”は、通電相を一巡させる間のエンコーダカウント値Ncnt(通電相判定値Mptn)の増減量に相当する。このMptn%12の値に基づいて、図28の変換テーブルによって通電相が決定される。
【0148】
そして、次のステップ516で、Mptn%12=2,3,6,7,10,11であるか否かによって1相通電(U相通電、V相通電、W相通電)であるか否かを判定し、1相通電であれば、ステップ517に進み、通電相判定値Mptnを1ステップ分に相当する“2”だけ増加して2相通電(UV相通電、VW相通電、UW相通電)に補正する。これにより、F/B制御開始位置停止保持処理を1相通電と比べて保持トルクの大きい2相通電で実行することで、ロータ32がF/B制御開始位置付近で振動することを防止して、ロータ32をF/B制御開始位置に確実に停止保持できるようにする。
【0149】
そして、次のステップ518で、停止保持時通電相記憶済みフラグXhold=ON(記憶済み)にセットして本ルーチンを終了する。この後、本ルーチンが起動されたときには、ステップ513で「No」と判定され、ステップ514〜518の処理が実行されない。これにより、F/B制御開始位置停止保持処理時の通電相判定値Mptn(通電相)を設定する処理は、F/B制御開始位置停止保持処理の開始直前に1回のみ実行される。
【0150】
その後、F/B制御開始位置停止保持処理の時間CT1が所定時間(例えば10ms)を越えた時点で、ステップ512で「Yes」と判定されて、F/B制御開始位置停止保持処理を終了し、F/B制御に移行する。これにより、最初に、ステップ519で、F/B制御開始位置停止保持処理時の通電相判定値Mptnに、回転方向に応じて通電相の位相進み分のカウント値(例えば4又は3)を加算又は減算してF/B制御開始時の最初の通電相判定値Mptnを設定し、それによって、ロータ32の回転駆動を開始する。この後、ステップ520に進み、F/B許可フラグXfb=ON(F/B制御実行)にセットする。
【0151】
図32はUW相から回転を開始する場合に最初に通電する相を説明するタイムチャートである。この場合、正回転(Pレンジ→NotPレンジ方向への回転)を開始する場合は、通電相判定値Mptnは、エンコーダカウント値Ncnt、初期位置ずれ学習値Gcnt、正回転方向位相進み量K1を用いて次式により算出される。
Mptn=Ncnt−Gcnt+K1
【0152】
ここで、正回転方向位相進み量K1を例えば4とすると、通電相判定値Mptnは、次式により算出される。
Mptn=Ncnt−Gcnt+4
UW相から正回転を開始する場合は、mod(Ncnt−Gcnt)は4となるため、Mptn%12=4+4=8となり、最初の通電相はUV相となる。
【0153】
一方、UW相から逆回転(NotPレンジ→Pレンジ方向への回転)を開始する場合は、逆回転方向位相進み量K2を例えば3とすると、通電相判定値Mptnは、次式により算出される。
Mptn=Ncnt−Gcnt−K2=Ncnt−Gcnt−3
UW相から逆回転を開始する場合は、Mptn%12=4−3=1となり、最初の通電相はVW相となる。
【0154】
このように、正回転方向位相進み量K1と逆回転方向位相進み量K2をそれぞれ4と3に設定することで、正回転方向と逆回転方向の通電相の切換パターンを対称にすることができ、正回転方向と逆回転方向のいずれの場合も、ロータ32の現在位置から2ステップ分ずらした位置の相を最初に励磁して回転を開始することができる。
【0155】
[mode3]
図25に示すmode3ルーチンは、図23の時間同期モータ制御ルーチンのステップ506で起動されるサブルーチンであり、目標位置停止保持処理時の通電相判定値Mptn(通電相)を次のようにして設定する。
【0156】
本ルーチンが起動されると、まずステップ531で、F/B制御終了時のMptn%12=2,3,6,7,10,11であるか否かによってF/B制御終了時の通電相が1相通電(U相通電、V相通電、W相通電)であるか否かを判定し、1相通電であれば、ステップ532〜534の処理によって、それまで行っていたF/B制御の回転方向に応じて通電相判定値Mptnを2だけ増加又は減少させることで、当該1相通電の次のステップの2相通電に変更する。
【0157】
この際、ステップ532で、回転方向を次のようにして判定する。本ルーチンに入る直前(F/B制御終了時)に、図22のステップ426で、回転方向指示値Dが0(停止)にセットされるため、回転方向指示値Dを見ても回転方向を判定することができない。そこで、本ルーチンでは、F/B制御終了時の通電相判定値Mptnと位置カウント値(Ncnt−Gcnt)との間に、通電相の位相進み量K1,K2分の差があることに着目し、F/B制御終了時の通電相判定値Mptnと位置カウント値(Ncnt−Gcnt)との大小関係によって回転方向を次のように判定する。
【0158】
Mptn>Ncnt−Gcntの場合は、正回転(Pレンジ→NotPレンジの回転方向)と判定して、ステップ533に進み、通電相判定値Mptnを2だけ増加させることで、2相通電に補正する。
【0159】
一方、Mptn<Ncnt−Gcntの場合は、逆回転(NotPレンジ→Pレンジの回転方向)と判定して、ステップ534に進み、通電相判定値Mptnを2だけ減少させることで、2相通電に補正する。
尚、Mptn=Ncnt−Gcntの場合は、停止と判定して、通電相は変更しない。
【0160】
このように、目標位置停止保持処理についても、F/B制御開始位置停止保持処理と同じく、1相通電と比べて保持トルクの大きい2相通電で実行することで、ロータ32が目標位置付近で振動することを防止して、ロータ32を目標位置で確実に停止保持できるようにする。
【0161】
[mode4]
図26に示すmode4ルーチンは、図23の時間同期モータ制御ルーチンのステップ507で起動されるサブルーチンであり、反転位置停止保持処理時の通電相判定値Mptn(通電相)を次のようにして設定する。
【0162】
本ルーチンが起動されると、まずステップ541で、反転位置停止保持処理の時間をカウントする通電時間カウンタCT4をカウントアップし、次のステップ542で、反転位置停止保持処理の時間CT4が所定時間(例えば50ms)を越えたか否かを判定する。
【0163】
もし、反転位置停止保持処理の時間CT4が所定時間(例えば50ms)を越えていなければ、ステップ543に進み、Mptn%12=2,3,6,7,10,11であるか否かによって現在の通電相が1相通電(U相通電、V相通電、W相通電)であるか否かを判定し、1相通電であれば、ステップ544〜546の処理によって、それまで行っていたF/B制御の回転方向に応じて通電相判定値Mptnを2だけ増加又は減少させることで、当該1相通電の次のステップの2相通電に変更する。このステップ543〜546の処理は、前記図25のmode3ルーチンのステップ531〜534の処理と同じである。
【0164】
このように、反転位置停止保持処理についても、F/B制御開始位置停止保持処理や目標位置停止保持処理と同じく、1相通電と比べて保持トルクの大きい2相通電で実行することで、ロータ32が反転位置付近で振動することを防止して、ロータ32を反転位置で確実に停止保持できるようにする。
【0165】
その後、反転位置停止保持処理の時間CT4が所定時間(例えば50ms)を越えた時点で、ステップ542で「Yes」と判定されて、反転位置停止保持処理を終了し、F/B制御を再開する。これにより、最初に、ステップ547で、反転位置停止保持処理時の通電相判定値Mptnに、回転方向に応じて通電相の位相進み分のカウント値(例えば4又は3)を加算又は減算してF/B制御再開時の最初の通電相判定値Mptnを設定し、それによって、ロータ32の回転駆動を開始する。この後、ステップ548に進み、F/B許可フラグXfb=ON(F/B制御実行)、通電時間カウンタCT4=0、制御モード判定値mode=1(通常駆動)にセットして本ルーチンを終了する。
【0166】
[通電処理]
図27に示す通電処理ルーチンは、図23の時間同期モータ制御ルーチンのステップ508で起動されるサブルーチンである。尚、本ルーチンは、後述する図30のF/B制御ルーチンのステップ603でも起動される。
【0167】
図27の通電処理ルーチンが起動されると、まずステップ551で、制御モード判定値mode=0(通電オフ)であるか否かを判定し、制御モード判定値mode=0(通電オフ)であれば、ステップ552に進み、SRモータ12の全相の通電をオフしてスタンバイ状態とする。
【0168】
一方、上記ステップ551で、「No」と判定されれば、ステップ553に進み、制御モード判定値mode=5(オープンループ制御)であるか否かを判定し、制御モード判定値mode=5(オープンループ制御)であれば、ステップ554に進み、オープンループ制御を実行する。このオープンループ制御は、エンコーダ46の故障又はSRモータ12の動作異常が発生したときに、例えば1ms周期の時間同期処理によって通電相を設定してロータ32を目標位置まで回転駆動する。
【0169】
また、上記ステップ551、553で、いずれも「No」と判定された場合、つまり、制御モード判定値mode=1,3,4(F/B制御開始位置停止保持処理、F/B制御、目標位置停止保持処理、反転位置停止保持処理)の場合は、ステップ555に進み、Mptn%12に応じて図28の変換テーブルによって通電相を設定する。
【0170】
この後、ステップ556に進み、突き当て制御実行中(Pレンジ側突き当て制御中フラグXexp=ON又はNotPレンジ側突き当て制御中フラグXexnp=ON)であるか否かを判定し、突き当て制御実行中でなければ、ステップ557に進み、SRモータ12の通電デューティ比を例えば100%に設定するが、突き当て制御実行中であれば、ステップ558に進み、SRモータ12の電源電圧であるバッテリ電圧に応じて図29のテーブルによって通電デューティ比を例えば10〜30%に設定する。これにより、突き当て制御の実行時に、SRモータ12のトルクを通常駆動時よりも大幅に低下させる。
【0171】
尚、図29のテーブルの例では、SRモータ12の電源電圧(バッテリ電圧)が高くなるほど、SRモータ12のトルクが大きくなるという特性を考慮して、電源電圧(バッテリ電圧)が高くなるほど、通電デューティ比が小さくなるように設定されている。これにより、電源電圧(バッテリ電圧)が高くても低くても、SRモータ12のトルクがほぼ一定となり、常にSRモータ12のトルクが突き当て制御に必要最小限のトルクを確保できるようになっている。
【0172】
以上のようにして、通電デューティ比を設定した後、ステップ559に進み、ECU41からモータドライバ37,38に制御信号を出力して、ステップ555で設定された通電相の巻線に、ステップ557又は558で設定された通電デューティ比で通電してSRモータ12を駆動する。
【0173】
[F/B制御]
次に、図30に示すF/B制御ルーチンの処理内容を説明する。本ルーチンは、AB相割り込み処理により実行され、初期駆動終了後にF/B制御実行条件が成立しているときに、ロータ32の回転位置(エンコーダカウント値Ncnt−Gcnt)が目標位置(目標カウント値Acnt)から例えば0.5°以内に到達するまで、エンコーダカウント値Ncntと初期位置ずれ学習値Gcntとに基づいて通電相を切り換えてロータ32を回転させる。
【0174】
図30のF/B制御ルーチンが起動されると、まずステップ601で、F/B許可フラグXfbがONにセットされているか否か(F/B制御実行条件が成立しているか否か)を判定し、F/B許可フラグXfbがOFF(F/B制御実行条件が不成立)であれば、以降の処理を行うことなく、本ルーチンを終了する。
【0175】
これに対し、F/B許可フラグXfbがONにセットされていれば、ステップ602に進み、後述する図31の通電相設定ルーチンを実行して、現在のエンコーダカウント値Ncntと初期位置ずれ学習値Gcntとに基づいて通電相を設定し、次のステップ603で、図27の通電処理ルーチンを実行する。
【0176】
[通電相設定]
図31に示す通電相設定ルーチンは、図30のF/B制御ルーチンのステップ602で起動されるサブルーチンである。本ルーチンが起動されると、まずステップ611で、目標位置への回転方向を指示する回転方向指示値Dが正回転(Pレンジ→NotPレンジの回転方向)を意味する「1」であるか否かを判定する。その結果、回転方向指示値D=1(正回転)と判定されれば、ステップ612に進み、ロータ32の回転方向が回転方向指示に反して逆転したか否か(エンコーダカウント値Ncntが減少したか否か)を判定し、逆転していなければ、ステップ613に進み、現在のエンコーダカウント値Ncnt、初期位置ずれ学習値Gcnt、正回転方向位相進み量K1、速度位相進み補正量Ksを用いて通電相判定値Mptnを次式により更新する。
Mptn=Ncnt−Gcnt+K1+Ks
【0177】
ここで、正回転方向位相進み量K1は、ロータ32を正回転させるのに必要な通電相の位相進み量(ロータ32の現在の回転位相に対する通電相の位相進み量)であり、例えばK1=4に設定されている。
【0178】
また、速度位相進み補正量Ksは、ロータ32の回転速度に応じて設定される位相進み補正量であり、後述する図34の速度位相進み補正量設定ルーチンによって設定される。例えば、低速域では、速度位相進み補正量Ksが0に設定され、高速になるに従って、速度位相進み補正量Ksが例えば1又は2に増加される。これにより、ロータ32の回転速度に適した通電相となるように通電相判定値Mptnが補正される。
【0179】
一方、上記ステップ612で、ロータ32の回転方向が回転方向指示に反して逆転したと判定された場合は、逆転防止のために通電相判定値Mptnを更新しない。この場合は、逆転直前の通電相(前回の通電相)に通電され、ロータ32の逆転を抑制する方向に制動トルクが発生する。
【0180】
また、上記ステップ611で、回転方向指示値D=0(逆回転)、つまりNotPレンジ→Pレンジの回転方向と判定された場合は、ステップ614に進み、ロータ32の回転方向が回転方向指示に反して逆転したか否か(エンコーダカウント値Ncntが増加したか否か)を判定し、逆転していなければ、ステップ615に進み、現在のエンコーダカウント値Ncnt、初期位置ずれ学習値Gcnt、逆回転方向位相進み量K2、速度位相進み補正量Ksを用いて通電相判定値Mptnを次式により更新する。
Mptn=Ncnt−Gcnt−K2−Ks
【0181】
ここで、逆回転方向位相進み量K2は、ロータ32を逆回転させるのに必要な通電相の位相進み量(ロータ32の現在の回転位相に対する通電相の位相進み量)であり、例えばK2=3に設定されている。速度位相進み補正量Ksは正回転の場合と同じく、後述する図34の速度位相進み補正量設定ルーチンによって設定される。
【0182】
一方、上記ステップ614で、ロータ32の回転方向が回転方向指示に反して逆転したと判定された場合は、逆転防止のために通電相判定値Mptnを更新しない。この場合は、逆転直前の通電相(前回の通電相)に通電され、ロータ32の逆転を抑制する方向に制動トルクが発生する。
【0183】
以上のようにして、今回の通電相判定値Mptnを決定した後、図27の通電処理ルーチンを実行し、F/B制御実行中は、ステップ555で、図28の変換テーブルを検索して、Mptn%12に対応する通電相を選択し、その通電相に通電する。
【0184】
[ロータ回転速度演算]
図33に示すロータ回転速度演算ルーチンは、AB相割り込み処理により実行され、次のようにしてロータ32の回転速度SPを演算する。本ルーチンが起動されると、まずステップ621で、F/B許可フラグXfbがON(F/B制御実行中)であるか否かを判定し、F/B許可フラグXfbがOFF(F/B制御禁止)であれば、ロータ32の回転速度SPに応じた通電相の位相進み補正を行わないため、ステップ624に進み、ロータ32の回転速度SP,SPaの記憶値をリセットして、本ルーチンを終了する。
【0185】
これに対して、F/B許可フラグXfbがON(F/B制御実行中)であれば、次のようにしてロータ32の回転速度SPを演算する。まず、ステップ622で、エンコーダ46のA相信号とB相信号の立ち上がり/立ち下がりエッジ間の時間間隔ΔT(n) (すなわちエンコーダカウント値が増減する時間間隔)を計測して、その時間間隔ΔT(n) の過去N回分の平均値ΔTavを算出する。そして、回転速度演算値SPaを次式により算出する。
SPa=60/(ΔTav×Kp) [rpm]
【0186】
ここで、Kpは、ロータ32の1回転当たりの時間間隔ΔT(n) の数(ロータ32の1回転当たりのエンコーダカウント値の変化量)であり、図5の構成のエンコーダ46の場合は、Kp=96となる。ΔTav×Kpは、ロータ32が1回転するのに要する時間[sec]である。
【0187】
この後、ステップ623に進み、回転速度演算値SPaを用いて、ロータ32の回転速度SPを次式によりなまし処理して求める。
SP(i) =SP(i-1) +{SPa−SP(i-1) }/R
ここで、SP(i) は今回の回転速度、SP(i-1) は前回の回転速度、Rはなまし係数である。
【0188】
[速度位相進み補正量設定]
図34に示す速度位相進み補正量設定ルーチンは、所定周期(例えば1ms周期)で起動され、ロータ32の回転速度SPに応じて速度位相進み補正量Ksを次のようにして設定する。本ルーチンが起動されると、まずステップ631で、F/B許可フラグXfbがON(F/B制御実行中)であるか否かを判定し、F/B許可フラグXfbがOFF(F/B制御禁止)であれば、通電相の位相進み補正は不要であるため、以降の処理を行うことなく、本ルーチンを終了する。
【0189】
これに対して、F/B許可フラグXfbがON(F/B制御実行中)であれば、ステップ632〜636の処理により、図33のロータ回転速度演算ルーチンで演算されたロータ32の回転速度SPに応じて速度位相進み補正量Ksを次のようにして設定する。
【0190】
ステップ632で、ロータ32の回転速度SPが所定値Klow(例えば300rpm)よりも低いと判定されれば、ステップ634に進み、速度位相進み補正量Ksを最小値Ka(例えば0)に設定し、ステップ633で、ロータ32の回転速度SPが所定値Khigh(例えば600rpm)よりも高いと判定されれば、ステップ636に進み、速度位相進み補正量Ksを最大値Kc(例えば2)に設定する。また、ロータ32の回転速度SPがKlow〜Khighの範囲内であれば、ステップ635に進み、速度位相進み補正量Ksを中間値Kb(例えば1)に設定する。このような処理により、ロータ32の回転速度SPが速くなるほど、速度位相進み補正量Ksを大きな値に設定する。
【0191】
この後、ステップ637に進み、目標カウント値Acntとエンコーダカウント値Ncntとの差の絶対値|Acnt−Ncnt|が所定値よりも小さいか否かで、ロータ32の回転位置が目標位置に近付いたか否か(停止のための減速領域に入ったか否か)を判定する。
【0192】
もし、|Acnt−Ncnt|が所定値以上であれば、ステップ639に進み、突き当て制御実行中(Pレンジ側突き当て制御中フラグXexp=ON又はNotPレンジ側突き当て制御中フラグXexnp=ON)であるか否かを判定し、突き当て制御実行中でなければ、上記ステップ634〜636のいずれかで設定した速度位相進み補正量Ksをそのまま用い、突き当て制御実行中であれば、ステップ640に進み、速度位相進み補正量Ksを小さい値Ke(例えば0又は−1)に設定して、ロータ32の回転速度を遅くする。
【0193】
一方、|Acnt−Ncnt|が所定値よりも小さい場合は、減速領域と判断して、ステップ637からステップ638に進み、速度位相進み補正量Ksを小さい値Kd(例えば0又は−1)に設定する。
【0194】
尚、本ルーチンでは、ロータ32の回転速度SPに応じて速度位相進み補正量Ksを3段階に切り換えるようにしたが、2段階又は4段階以上に切り換えるようにしても良い。
【0195】
[遊び量学習]
図36に示す遊び量学習ルーチンは、初期駆動終了後に所定周期(例えば8ms周期)で実行される。本ルーチンが起動されると、まずステップ700で、遊び量学習完了フラグXg=ON(遊び量学習完了後)であるか否かを判定し、もし、遊び量学習完了フラグXg=ONであれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、遊び量学習は、イグニッションスイッチのオン期間中に1回のみ行われる。尚、遊び量学習完了フラグXgは、イグニッションスイッチのオン直後に実行される初期化処理ルーチン(図示せず)によってOFFにセットされる。
【0196】
一方、上記ステップ700で、遊び量学習完了フラグXg=OFF(遊び量学習完了前)と判定されれば、ステップ701に進み、指令シフトレンジがPレンジであるか否かを判定し、Pレンジであれば、ステップ702に進み、後述する図39及び図40のPレンジ側突き当て制御ルーチンを実行し、Pレンジ側突き当て時のエンコーダカウント値NpをECU41のRAMに記憶する。一方、NotPレンジであれば、ステップ703に進み、後述する図42及び図43のNotPレンジ側突き当て制御ルーチンを実行して、NotPレンジ側突き当て時のエンコーダカウント値NnpをECU41のRAMに記憶する。
【0197】
この後、ステップ704に進み、Pレンジ側とPレンジ側の両方の突き当て制御を完了したか否か(Pレンジ側突き当て完了フラグXp=ON、且つ、NotPレンジ側突き当て完了フラグXnp=ONであるか否か)を判定し、Pレンジ側とPレンジ側のいずれか一方でも突き当て制御が完了していなければ、以降の処理を行うことなく、本ルーチンを終了する。
【0198】
これに対して、レンジ側とPレンジ側の両方の突き当て制御を完了していれば、ステップ705に進み、Pレンジ側の限界位置(Pレンジ保持凹部24の側壁)からNotPレンジ側の限界位置(NotPレンジ保持凹部25の側壁)までのロータ32の可動範囲(ディテントレバー15の可動範囲)の実測値ΔNactを次式により算出する。
ΔNact=Nnp−Np
【0199】
ここで、Nnpは、NotPレンジ側突き当て時のエンコーダカウント値で、後述する図42及び図43のNotPレンジ側突き当て制御ルーチンによって学習した値GNnpが用いられる。Npは、Pレンジ側突き当て時のエンコーダカウント値で、後述する図39及び図40のPレンジ側突き当て制御ルーチンによって学習した値GNpが用いられる。
【0200】
可動範囲の実測値ΔNactの算出後、ステップ706に進み、図38に示す関係を考慮して、Pレンジ側の遊び量ΔGpとNotPレンジ側の遊び量ΔGnpを可動範囲の実測値ΔNactと設計値ΔNdを用いて次式により算出する。
ΔGp=ΔGnp=(ΔNact−ΔNd)/2
ここで、可動範囲の設計値ΔNdは、予め設計データに基づいて算出しても良いし、量産品の可動範囲の製造ばらつきの中心値(標準品の可動範囲の実測値)を用いても良い。
【0201】
図38に示すように、可動範囲の実測値ΔNactと設計値ΔNdとの差分(ΔNact−ΔNd)は、Pレンジ側とNotPレンジ側の合計遊び量(ΔGp+ΔGnp)に相当する。一般に、Pレンジ側の遊び量ΔGpとNotPレンジ側の遊び量ΔGnpは等しいため、上式により、Pレンジ側とNotPレンジ側の各遊び量ΔGp,ΔGnpを算出することができる。
【0202】
各遊び量ΔGp,ΔGnpの算出後、ステップ707に進み、遊び量学習完了フラグXgを、遊び量学習完了を意味する「ON」にセットして、本ルーチンを終了する。
【0203】
尚、上記ステップ705、706で算出された可動範囲の実測値ΔNactと遊び量ΔGp,ΔGnpは、ECU41のSRAM等の不揮発性メモリ(図示せず)に更新記憶され、イグニッションスイッチのオフ後も、その記憶値が保持される。次回のイグニッションスイッチのオン後は、後述する図45及び図46の目標カウント値設定ルーチンで目標カウント値Acntを設定する際に、ECU41の不揮発性メモリに記憶されている可動範囲の実測値ΔNactと遊び量ΔGp,ΔGnpを用いて目標カウント値Acntを設定する。
【0204】
[Pレンジ側突き当て制御]
図39及び図40に示すPレンジ側突き当て制御ルーチンは、指令シフトレンジがPレンジのときに図36の遊び量学習ルーチンのステップ702で実行されるサブルーチンである。本ルーチンが起動されると、まずステップ711で、Pレンジ側突き当て完了フラグXp=ON(Pレンジ側突き当て制御終了後)であるか否かを判定し、既にPレンジ側突き当て制御が終了していれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、Pレンジ側突き当て制御は、イグニッションスイッチのオン期間中に1回のみ行われる。
【0205】
一方、上記ステップ711で、Pレンジ側突き当て完了フラグXp=OFF(Pレンジ側突き当て制御終了前)であると判定されれば、ステップ712に進み、制御モード判定値modeが0、3に該当するか否かを判定する。ここで、制御モード判定値mode=0は、通電オフ(スタンバイ)を意味し、制御モード判定値mode=3は、目標位置停止保持処理を意味する。
【0206】
本ルーチンでは、ロータ32がPレンジで停止しているときにPレンジ側突き当て制御を行うようにするために、制御モード判定値mode=0又は3でPレンジ側突き当て制御を行うようにしている。
【0207】
制御モード判定値mode=0(通電オフ)の場合は、ステップ713に進み、Pレンジでmode=0になっている時間をカウントするmode0時間カウンタCT0pをカウントアップする。また、制御モード判定値mode=3(目標位置停止保持処理)の場合は、ステップ714に進み、Pレンジでmode=3となっている時間をカウントするmode3時間カウンタCT3pをカウントアップする。これら2つの時間カウンタCT0p,CT3pは、Pレンジでロータ32の振動が収束して停止状態になるまで待機するのに用いられる。
【0208】
尚、制御モード判定値mode=1(通常駆動)、4(反転位置停止保持処理)、5(オープンループ制御)の場合は、ロータ32がPレンジで停止していないため、ステップ731に進み、時間カウンタCT0p,CT3pのカウント値をクリアする。
【0209】
そして、ステップ715で、mode0時間カウンタCT0pの値が停止判定値K0pを越えたか否か、又は、mode3時間カウンタCT3pの値が停止判定値K3pを越えたか否か判定する。ここで、停止判定値K0pは、Pレンジで制御モード判定値mode=0(通電オフ)のときにロータ32の振動が収束するのに必要な時間に相当し、停止判定値K3pは、Pレンジで制御モード判定値mode=3(目標位置停止保持処理)のときにロータ32の振動が収束するのに必要な時間に相当する。
【0210】
上記ステップ715で、「No」と判定されれば、ロータ32の振動が収束していないと判断して、ステップ716に進み、Pレンジ側突き当て制御中フラグXexp=OFFにセットする。この場合は、まだ、Pレンジ側突き当て制御が実行されない。
【0211】
一方、上記ステップ715で、「Yes」と判定されれば、Pレンジでロータ32の振動が収束したと判断して、ステップ717に進み、Pレンジ側突き当て制御中フラグXexp=ONにセットする。
【0212】
この後、ステップ718に進み、Pレンジ側突き当て制御中フラグXexp=ONであるか否かを判定し、Xexp=OFFであれば、ステップ719に進み、突き当て目標カウント値Ag=0、停止時間カウンタCTstop=0、突き当て制御時間カウンタCTg=0にセットして、本ルーチンを終了する。
【0213】
これに対して、Pレンジ側突き当て制御中フラグXexp=ONの場合は、ステップ720に進み、突き当て目標カウント値Agを所定値Kgpに設定する。この突き当て目標カウント値Ag(Kgp)は、Pレンジ側突き当て制御によってディテントバネ23の係合部23aをディテントレバー15のPレンジ保持凹部24の側壁に確実に突き当てることができるように設定される。
【0214】
Pレンジ側突き当て制御中フラグXexp=ONの場合は、後述する図45の目標カウント値設定ルーチンによって目標カウント値Acntが突き当て目標カウント値Ag(Kgp)にセットされるため、図41に示すように、Pレンジ側突き当て制御が実行され、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当てられる。
【0215】
Pレンジ側突き当て制御中は、図40のステップ721で、突き当て制御時間カウンタCTgをカウントアップして、Pレンジ側突き当て制御の実行時間を計測する。そして、次のステップ722で、Pレンジ側突き当て制御の実行時間CTgが許容最大学習時間Kg(例えば500ms)を越えたか否かを判定する。Pレンジ側突き当て制御が正常に実行されれば、許容最大学習時間Kgよりも短い時間でディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たった状態になって、Pレンジ側突き当て時のエンコーダカウント値Npの学習(Pレンジ側突き当て制御)が終了する。従って、許容最大学習時間Kgを越えてPレンジ側突き当て制御が終了しない場合は、SRモータ12の故障やエンコーダ46の故障等、何等かのシステム異常が発生しているものと思われるため、このような場合は、Pレンジ側突き当て制御を強制的に終了させるために、ステップ723に進み、Pレンジ側突き当て制御中フラグXexp=OFF、Pレンジ側突き当て完了フラグXp=OFF、停止時間カウンタCTstop=0、mode3時間カウンタCT3p=0、mode0時間カウンタCT0p=0、突き当て制御時間カウンタCTg=0にセットして、本ルーチンを終了する。
【0216】
これに対して、Pレンジ側突き当て制御の実行時間CTgが許容最大学習時間Kgを越えていない場合は、ステップ724に進み、出力軸センサ14のPレンジ出力学習値Vpを次式により更新する。
Vp(i) =Vp(i-1) +{Vnsw−Vp(i-1) }/Rnsw
ここで、Vp(i) は今回のPレンジ出力学習値、Vp(i-1) は前回のPレンジ出力学習値、Vnswは今回の出力軸センサ14の出力、Rnswはなまし係数である。
【0217】
そして、次のステップ725で、Pレンジ側突き当て時のエンコーダカウント値の学習値(以下「Pレンジ側突き当て学習値」という)GNpを次式により更新する。
GNp(i) =min{GNp(i-1) ,Ncnt}
【0218】
ここで、GNp(i) は今回のPレンジ側突き当て学習値、GNp(i-1) は前回のPレンジ側突き当て学習値、Ncntは今回のエンコーダカウント値である。また、関数minはGNp(i-1) とNcntを比較して小さい方を選択する関数である。尚、エンコーダカウント値Ncntは、前記図8及び図9の初期駆動ルーチンで学習された初期位置ずれ学習値Gcntにより補正された値を用いる。
【0219】
この後、ステップ726に進み、今回のPレンジ側突き当て学習値GNp(i) と前回のPレンジ側突き当て学習値GNp(i-1) が同じであるか否かで、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たった状態になったか否かを判定する。
【0220】
図41に示すように、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たった状態になるまでは、ロータ32が回転してエンコーダカウント値Ncntが徐々に減少していくため、今回のPレンジ側突き当て学習値GNp(i) が前回の学習値GNp(i-1) よりも小さくなる。その後、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たった状態になると、ロータ32の回転が停止して、エンコーダカウント値Ncntが変化しなくなるか、又は、振動するが、学習値GNp(i) は更新されなくなるため、今回のPレンジ側突き当て学習値GNp(i) と前回のPレンジ側突き当て学習値GNp(i-1) が同じであるか、又は、今回のPレンジ側突き当て学習値GNp(i) の方が大きくなる。
【0221】
図40のステップ726で、「No」と判定された場合は、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たった状態になっていないため、ステップ727に進み、停止時間カウンタCTstopをリセットする。
【0222】
これに対し、ステップ726で、「Yes」と判定された場合は、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たった可能性があると判断して、ステップ728に進み、この突き当て状態の時間をカウントする停止時間カウンタCTstopをカウントアップする。
【0223】
この後、ステップ729に進み、停止時間カウンタCTstopの値が所定時間Kstop(例えば60ms)を越えるまで、Pレンジ側突き当て制御を継続する。そして、突き当て状態が所定時間Kstop以上続いた時点で、突き当て状態になっていることが確認できたと判断して、ステップ730に進み、Pレンジ側突き当て制御を終了するために、Pレンジ側突き当て制御中フラグXexp=OFF、Pレンジ側突き当て完了フラグXp=ON、Pレンジ側突き当て時のエンコーダカウント値Np=GNp+ΔNover(ΔNoverは乗り上げ補正量)、停止時間カウンタCTstop=0、mode3時間カウンタCT3p=0、mode0時間カウンタCT0p=0にセットして、本ルーチンを終了する。
【0224】
乗り上げ補正量ΔNoverは、突き当て制御実行時にディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁に突き当たった状態で該係合部23aが保持凹部24,25の側壁を僅かに乗り上げる角度に相当する。この乗り上げ補正量ΔNoverは、SRモータ12の電源電圧であるバッテリ電圧に応じて図37のテーブルにより設定される。
【0225】
突き当て制御実行時に、ディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁を乗り上げる角度(乗り上げ補正量ΔNover)は、SRモータ12のトルクが大きくなるほど大きくなる。一般に、SRモータ12のトルクは、その電源電圧(バッテリ電圧)によって変化するため、電源電圧(バッテリ電圧)とSRモータ12のトルクとの間には相関関係があり、電源電圧(バッテリ電圧)をSRモータ12のトルクの代用情報として用いることができる。従って、突き当て制御実行時に、ディテントバネ23の係合部23aがディテントレバー15の各保持凹部24,25の側壁を乗り上げる角度(乗り上げ補正量ΔNover)を、SRモータ12のトルクの代用情報である電源電圧(バッテリ電圧)に基づいて図37のテーブルにより算出し、その乗り上げ補正量ΔNoverだけロータ32の可動範囲の実測値ΔNactを補正するようにすれば、可動範囲の実測値を精度良く求めることができる。
【0226】
尚、ディテントレバー15の各保持凹部24,25の側壁の形状をディテントバネ23の係合部23aが乗り上げないように形成すれば、乗り上げ補正量ΔNoverは必要なくなり、ΔNact=Nnp−Npとなる。
【0227】
[NotPレンジ側突き当て制御]
図42及び図43に示すNotPレンジ側突き当て制御ルーチンは、指令シフトレンジがNotPレンジのときに図36の遊び量学習ルーチンのステップ703で実行されるサブルーチンである。本ルーチンが起動されると、まずステップ741で、NotPレンジ側突き当て完了フラグXnp=ON(NotPレンジ側突き当て制御終了後)であるか否かを判定し、既にNotPレンジ側突き当て制御が終了していれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、NotPレンジ側突き当て制御は、イグニッションスイッチのオン期間中に1回のみ行われる。
【0228】
一方、上記ステップ741で、NotPレンジ側突き当て完了フラグXnp=OFF(NotPレンジ側突き当て制御終了前)であると判定されれば、ステップ742に進み、制御モード判定値modeが0(通電オフ)、3(目標位置停止保持処理)に該当するか否かを判定する。本ルーチンでは、ロータ32がNotPレンジで停止しているときにNotPレンジ側突き当て制御を行うようにするために、制御モード判定値mode=0又は3でNotPレンジ側突き当て制御を行うようにしている。
【0229】
制御モード判定値mode=0(通電オフ)の場合は、ステップ743に進み、NotPレンジでmode=0になっている時間をカウントするmode0時間カウンタCT0npをカウントアップする。また、制御モード判定値mode=3(目標位置停止保持処理)の場合は、ステップ744に進み、NotPレンジでmode=3となっている時間をカウントするmode3時間カウンタCT3npをカウントアップする。これら2つの時間カウンタCT0np,CT3npは、NotPレンジでロータ32の振動が収束して停止状態になるまで待機するのに用いられる。
【0230】
尚、制御モード判定値mode=1(通常駆動)、4(反転位置停止保持処理)、5(オープンループ制御)の場合は、ロータ32がNotPレンジで停止していないため、ステップ761に進み、時間カウンタCT0np,CT3npのカウント値をクリアする。
【0231】
そして、ステップ745で、mode0時間カウンタCT0npの値が停止判定値K0npを越えたか否か、又は、mode3時間カウンタCT3npの値が停止判定値K3npを越えたか否か判定する。ここで、停止判定値K0npは、NotPレンジで制御モード判定値mode=0(通電オフ)のときにロータ32の振動が収束するのに必要な時間に相当し、停止判定値K3npは、NotPレンジで制御モード判定値mode=3(目標位置停止保持処理)のときにロータ32の振動が収束するのに必要な時間に相当する。
【0232】
上記ステップ745で、「No」と判定されれば、ロータ32の振動が収束していないと判断して、ステップ746に進み、NotPレンジ側突き当て制御中フラグXexnp=OFFにセットする。この場合は、まだ、NotPレンジ側突き当て制御が実行されない。
【0233】
一方、上記ステップ745で、「Yes」と判定されれば、NotPレンジでロータ32の振動が収束したと判断して、ステップ747に進み、NotPレンジ側突き当て制御中フラグXexnp=ONにセットする。
【0234】
この後、ステップ748に進み、NotPレンジ側突き当て制御中フラグXexnp=ONであるか否かを判定し、Xexnp=OFFであれば、ステップ749に進み、突き当て目標カウント値Ag=0、停止時間カウンタCTstop=0、突き当て制御時間カウンタCTg=0にセットして、本ルーチンを終了する。
【0235】
これに対して、NotPレンジ側突き当て制御中フラグXexnp=ONの場合は、ステップ750に進み、突き当て目標カウント値Agを所定値Kgnpに設定する。この突き当て目標カウント値Ag(Kgnp)は、NotPレンジ側突き当て制御によってディテントバネ23の係合部23aをディテントレバー15のNotPレンジ保持凹部25の側壁に確実に突き当てることができるように設定される。
【0236】
NotPレンジ側突き当て制御中フラグXexnp=ONの場合は、後述する図45の目標カウント値設定ルーチンによって目標カウント値Acntが突き当て目標カウント値Ag(Kgnp)にセットされるため、NotPレンジ側突き当て制御が実行され、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当てられる。
【0237】
NotPレンジ側突き当て制御中は、図43のステップ751で、突き当て制御時間カウンタCTgをカウントアップして、NotPレンジ側突き当て制御の実行時間を計測する。そして、次のステップ752で、NotPレンジ側突き当て制御の実行時間CTgが許容最大学習時間Kg(例えば500ms)を越えたか否かを判定する。NotPレンジ側突き当て制御が正常に実行されれば、許容最大学習時間Kgよりも短い時間でディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たった状態になって、NotPレンジ側突き当て時のエンコーダカウント値Nnpの学習(NotPレンジ側突き当て制御)が終了する。従って、許容最大学習時間Kgを越えてNotPレンジ側突き当て制御が終了しない場合は、SRモータ12の故障やエンコーダ46の故障等、何等かのシステム異常が発生しているものと思われるため、このような場合は、NotPレンジ側突き当て制御を強制的に終了させるために、ステップ753に進み、NotPレンジ側突き当て制御中フラグXexnp=OFF、NotPレンジ側突き当て完了フラグXnp=OFF、停止時間カウンタCTstop=0、mode3時間カウンタCT3np=0、mode0時間カウンタCT0np=0、突き当て制御時間カウンタCTg=0にセットして、本ルーチンを終了する。
【0238】
これに対して、NotPレンジ側突き当て制御の実行時間CTgが許容最大学習時間Kgを越えていない場合は、ステップ754に進み、出力軸センサ14のNotPレンジ出力学習値Vnpを次式により更新する。
Vnp(i) =Vnp(i-1) +{Vnsw−Vnp(i-1) }/Rnsw
ここで、Vnp(i) は今回のNotPレンジ出力学習値、Vnp(i-1) は前回のNotPレンジ出力学習値、Vnswは今回の出力軸センサ14の出力、Rnswはなまし係数である。
【0239】
そして、次のステップ755で、NotPレンジ側突き当て時のエンコーダカウント値の学習値(以下「NotPレンジ側突き当て学習値」という)GNnpを次式により更新する。
GNnp(i) =max{GNnp(i-1) ,Ncnt}
【0240】
ここで、GNnp(i) は今回のNotPレンジ側突き当て学習値、GNnp(i-1) は前回のNotPレンジ側突き当て学習値、Ncntは今回のエンコーダカウント値である。また、関数maxはGNnp(i-1) とNcntを比較して大きい方を選択する関数である。尚、エンコーダカウント値Ncntは、前記図8及び図9の初期駆動ルーチンで学習された初期位置ずれ学習値Gcntによって補正された値を用いる。
【0241】
この後、ステップ756に進み、今回のNotPレンジ側突き当て学習値GNnp(i) と前回のNotPレンジ側突き当て学習値GNnp(i-1) が同じであるか否かで、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たった状態になったか否かを判定する。
【0242】
NotPレンジ突き当て制御中に、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たった状態になるまでは、ロータ32が回転してエンコーダカウント値Ncntが徐々に増加していくため、今回のNotPレンジ側突き当て学習値GNnp(i) が前回の学習値GNnp(i-1) よりも大きくなる。その後、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たった状態になると、ロータ32の回転が停止して、エンコーダカウント値Ncntが変化しなくなるか、又は、振動するが、学習値GNnp(i) は更新されなくなるため、今回のNotPレンジ側突き当て学習値GNnp(i) と前回のNotPレンジ側突き当て学習値GNnp(i-1) が同じであるか、又は、今回のNotPレンジ側突き当て学習値GNnp(i) の方が大きくなる。
【0243】
図43のステップ756で、「No」と判定された場合は、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たった状態になっていないため、ステップ757に進み、停止時間カウンタCTstopをリセットする。
【0244】
これに対し、ステップ756で、「Yes」と判定された場合は、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たった可能性があると判断して、ステップ758に進み、この突き当て状態の時間をカウントする停止時間カウンタCTstopをカウントアップする。
【0245】
この後、ステップ759に進み、停止時間カウンタCTstopの値が所定時間Kstop(例えば60ms)を越えるまで、NotPレンジ側突き当て制御を継続する。そして、突き当て状態が所定時間Kstop以上続いた時点で、突き当て状態になっていることが確認できたと判断して、ステップ760に進み、NotPレンジ側突き当て制御を終了するために、NotPレンジ側突き当て制御中フラグXexnp=OFF、NotPレンジ側突き当て完了フラグXnp=ON、NotPレンジ側突き当て時のエンコーダカウント値Nnp=GNnp−ΔNover(ΔNoverは乗り上げ補正量)、停止時間カウンタCTstop=0、mode3時間カウンタCT3np=0、mode0時間カウンタCT0np=0にセットして、本ルーチンを終了する。
【0246】
図44は、Pレンジ側突き当て制御とNotPレンジ側突き当て制御の実行タイミングの一例を示すタイムチャートである。図44の例では、イグニッションスイッチのオン操作後(電源投入後)、暫くして、指令シフトレンジがPレンジからNotPレンジに切り換えられると、目標カウント値AcntがNotPレンジの暫定的な目標カウント値(例えば18°)に設定される。この暫定的な目標カウント値Acnt(18°)は、ディテントバネ23の係合部23aがディテントレバー15の両保持凹部24,25間の山部を確実に乗り越える回転角度に相当する。従って、F/B制御により暫定的な目標カウント値Acnt(18°)までロータ32を回転させた後は、ディテントバネ23の弾性力によってディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の傾斜側壁に沿って底部に落ち込む力を利用して、ロータ32をNotPレンジの目標位置(NotPレンジ保持凹部25の底部)まで回転させる。
【0247】
この後、NotPレンジ側突き当て制御中フラグXexnp=ONにセットされた時点で、目標カウント値AcntがNotPレンジ側の突き当て目標カウント値Ag(Kgnp)にセットされ、NotPレンジ側突き当て制御が実行される。これにより、ディテントバネ23の係合部23aがディテントレバー15のNotPレンジ保持凹部25の側壁に突き当たったときに、エンコーダカウント値Nnp(GNnp)が学習される。この学習終了後、NotPレンジ側突き当て制御中フラグXexnp=OFFにセットされ、NotPレンジ側突き当て制御が終了する。
【0248】
その後、指令シフトレンジがNotPレンジからPレンジに切り換えられると、目標カウント値AcntがPレンジの暫定的な目標カウント値(例えば0°)に設定される。これにより、F/B制御により暫定的な目標カウント値Acnt(0°)までロータ32を回転させた後は、ディテントバネ23の弾性力によってディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の傾斜側壁に沿って底部に落ち込む力を利用して、ロータ32をPレンジの目標位置(Pレンジ保持凹部24の底部)まで回転させる。
【0249】
この後、Pレンジ側突き当て制御中フラグXexp=ONにセットされた時点で、目標カウント値AcntがPレンジ側の突き当て目標カウント値Ag(Kgp)にセットされ、Pレンジ側突き当て制御が実行される。これにより、ディテントバネ23の係合部23aがディテントレバー15のPレンジ保持凹部24の側壁に突き当たったときに、エンコーダカウント値Np(GNp)が学習される。この学習終了後、Pレンジ側突き当て制御中フラグXexp=OFFにセットされ、Pレンジ側突き当て制御が終了する。
【0250】
[目標カウント値設定]
図45及び図46に示す目標カウント値設定ルーチンは、初期駆動終了後に所定周期(例えば8ms周期)で実行される。本ルーチンが起動されると、まずステップ771で、突き当て制御実行中(Pレンジ側突き当て制御中フラグXexp=ON又はNotPレンジ側突き当て制御中フラグXexnp=ON)であるか否かを判定し、突き当て制御実行中であれば、ステップ772に進み、目標カウント値Acntを突き当て目標カウント値Agに設定する。この突き当て目標カウント値Agは、図39のステップ720又は図42のステップ750で設定される。
【0251】
一方、突き当て制御実行中でなければ、ステップ773に進み、指令シフトレンジがPレンジであるか否かを判定し、Pレンジであれば、ステップ774に進み、Pレンジ側突き当て制御を完了したか否か(Pレンジ側突き当て完了フラグXp=ONであるか否か)を判定し、Pレンジ側突き当て制御が完了していれば、ステップ775に進み、Pレンジの目標カウント値Acntを次式により算出する。
Acnt=Np+ΔGp
【0252】
ここで、NpはPレンジ側突き当て時のエンコーダカウント値であり、図39及び図40のPレンジ側突き当て制御ルーチンによって学習した値GNpが用いられる。また、ΔGpはPレンジ側の遊び量の学習値であり、図36の遊び量学習ルーチンのステップ706で、今回の遊び量の学習値ΔGpが算出されてECU41の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値が用いられる。
【0253】
一方、Pレンジ側突き当て制御が完了していない場合は、ステップ774で「No」と判定されて、ステップ776に進み、NotPレンジ側突き当て制御を完了したか否か(NotPレンジ側突き当て完了フラグXnp=ONであるか否か)を判定し、NotPレンジ側突き当て制御が完了していれば、ステップ777に進み、Pレンジの目標カウント値Acntを次式により算出する。
Acnt=Nnp−ΔNact+ΔGp
【0254】
ここで、Nnpは、NotPレンジ側突き当て時のエンコーダカウント値で、図42及び図43のNotPレンジ側突き当て制御ルーチンによって学習した値GNnpが用いられる。また、ΔNactは可動範囲の実測値であり、図36の遊び量学習ルーチンのステップ705で、今回の可動範囲の実測値ΔNactが算出されてECU41の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値が用いられる。
【0255】
尚、Pレンジ側とNotPレンジ側の突き当て制御が両方とも完了していない場合(Pレンジ側・NotPレンジ側の両突き当て完了フラグXp,Xnpが両方ともOFFの場合)は、Pレンジ側突き当て時及びNotPレンジ側突き当て時のエンコーダカウント値Np,Nnpが学習されていないため、遊び量ΔGp,ΔGnpによる目標カウント値Acntの補正を行うことができない。従って、この場合は、ステップ778に進み、Pレンジの目標カウント値AcntをPレンジの暫定的な目標カウント値である0に設定する。
【0256】
一方、上記ステップ773で、指令シフトレンジがNotPレンジと判定された場合は、図46のステップ779に進み、NotPレンジ側突き当て制御を完了したか否か(NotPレンジ側突き当て完了フラグXnp=ONであるか否か)を判定し、NotPレンジ側突き当て制御が完了していれば、ステップ780に進み、NotPレンジの目標カウント値Acntを次式により算出する。
Acnt=Nnp−ΔGnp
【0257】
ここで、ΔGnpはNotPレンジ側の遊び量の学習値であり、図36の遊び量学習ルーチンのステップ706で、今回の遊び量の学習値ΔGnpが算出されてECU41の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値が用いられる。
【0258】
一方、NotPレンジ側突き当て制御が完了していない場合は、ステップ779で「No」と判定されて、ステップ781に進み、Pレンジ側突き当て制御を完了したか否か(Pレンジ側突き当て完了フラグXp=ONであるか否か)を判定し、Pレンジ側突き当て制御が完了していれば、ステップ782に進み、NotPレンジの目標カウント値Acntを次式により算出する。
Acnt=Np+ΔNact−ΔGnp
【0259】
尚、Pレンジ側とNotPレンジ側の突き当て制御が両方とも完了していない場合(Pレンジ側・NotPレンジ側の両突き当て完了フラグXp,Xnpが両方ともOFFの場合)は、ステップ783に進み、NotPレンジの目標カウント値AcntをNotPレンジの暫定的な目標カウント値Knotp(例えば、18.5°)に設定する。
【0260】
尚、本ルーチンでは、目標カウント値Acntを設定する際に、遊び量の学習値ΔGp,ΔGnpと可動範囲の実測値ΔNactについては、ECU41の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値を用いるようにしたが、該不揮発性メモリの記憶値が更新されるまで、暫定的な目標カウント値(0又はKnotp)に設定するようにしても良い。
【0261】
[リカバリ処理]
図51に示すリカバリ処理ルーチンは、所定周期(例えば1ms周期)で起動され、F/B制御状態が異常になったときにリカバリ処理を次のようにして実行する。本ルーチンが起動されると、まずステップ801で、リカバリ処理実行フラグXrcvがOFFであるか否かを判定し、Xrcv=OFF(リカバリ処理実行中でない)の場合は、ステップ802に進み、次の▲1▼〜▲4▼のリカバリ処理実行条件が成立しているか否かを判定する。
【0262】
▲1▼エンコーダ46のA相信号、B相信号、出力軸センサ14の出力信号が全て正常であること
▲2▼後述する図56のシステム異常診断ルーチンでセットされる各異常検出フラグXfnsw、Xfcnt、Xfrcvが全てOFF(異常なし)であること
▲3▼F/B許可フラグXfbがON(F/B制御中)であること
▲4▼後述する図53のAB相信号異常検出ルーチンでセットされるA相信号、B相信号に関する3つの異常検出フラグXfab、Xfta、XftbのいずれかがON(異常あり)であること、又は、後述する図55の逆転判定ルーチンでセットされる逆転検出フラグXrがON(逆転あり)であること
【0263】
これら4つの条件▲1▼〜▲4▼のうち、1つでも満たさない条件があれば、リカバリ処理実行条件が不成立となり、以降の処理を行うことなく、本ルーチンを終了する。
【0264】
これに対し、上記▲1▼〜▲4▼の条件を全て満たせば、リカバリ処理実行条件が成立し、ステップ802からステップ803に進み、リカバリ処理実行フラグXrcvをONにセットし、次のステップ804で、図52に示す関係に基づいて、現在の出力軸センサ14の出力信号Vnswを用いて現在の位置カウント値Ncntopを次式により算出する。
【0265】
ここで、INTは[ ]内の数値を整数化する関数であり、Vpは出力軸センサ14のPレンジ出力学習値、Vnpは出力軸センサ14のNotPレンジ出力学習値、Kopはディテントレバー15の最大回転角、KofpはPレンジ側のオフセット値である。上式は、位置カウント値Ncntopを2の倍数とするように設定されている。
【0266】
ディテントレバー15の最大回転角Kopは、ディテントレバー15のPレンジ保持凹部24の側壁からNotPレンジ保持凹部25の側壁までのディテントレバー15の回転角であり、図38に示す関係に基づいて、可動範囲の設計値ΔNdとPレンジ側の遊び量ΔGpとを加算して求められる。本実施形態では、ΔNd=20.5(deg)、ΔGp=3(deg)となっている。
【0267】
上記位置カウント値Ncntopの算出式において、Kop×61/3.75はディテントレバー15の最大回転角Kopをモータ駆動ステップ数(励磁回数)に換算した値である。「61」は減速機構26の減速比であり、「3.75」は1ステップ(励磁1回当たり)のロータ32の回転角である。この位置カウント値Ncntopは、オープンループ制御開始時の位置カウント値Ncntopの初期値として用いられる。
【0268】
位置カウント値Ncntopの算出後、ステップ805に進み、リカバリ処理の実行回数をカウントするリカバリ処理実行回数カウンタCrcvをカウントアップし、次のステップ806で、オープンループ制御実行フラグXopenをONにセットして、後述する図60のオープンループ制御ルーチンによりオープンループ制御を実行する。
【0269】
リカバリ処理(オープンループ制御)の実行中は、本ルーチンが起動される毎に、ステップ801で「No」と判定されて、ステップ807に進み、オープンループ制御完了フラグXopcmpがオープンループ制御完了を意味するONにセットされているか否かを判定し、Xopcmp=OFFであれば、そのまま本ルーチンを終了し、オープンループ制御を継続する。
【0270】
その後、オープンループ制御が完了した時点で、ステップ808に進み、初期駆動を再実行するために、初期駆動終了フラグXend=OFF(初期駆動未終了)、レンジ切換操作フラグXchg=OFF(レンジ切換操作なし)、通電時間カウンタCT=0、励磁回数カウンタCASE=0、エンコーダカウント値Ncnt=0、初期位置ずれ学習値Gcnt=0にセットする。更に、ステップ809で、突き当て制御を再実行するために、Pレンジ側突き当て完了フラグXp=OFF(Pレンジ側突き当て制御未終了)、NotPレンジ側突き当て完了フラグXnp=OFF(NotPレンジ側突き当て制御未終了)にセットする。そして、次のステップ810で、制御モード判定値mode=初期値「$FF」にセットした後、ステップ811に進み、オープンループ制御実行フラグXopen=OFFにセットしてオープンループ制御(リカバリ処理)を終了する。更に、次のステップ812で、リカバリ処理実行フラグXrcv=OFF、A相信号、B相信号の異常検出フラグXfab=OFF、Xfta=OFF、Xftb=OFF、後述する第3の異常検出フラグXfrcv=OFFにセットする。
【0271】
[AB相信号異常検出]
図53に示すAB相信号異常検出ルーチンは、所定周期(例えば1ms周期)で起動され、エンコーダ46のA相信号とB相信号の異常の有無を次のようにして判定する。本ルーチンが起動されると、まずステップ821で、F/B許可フラグXfb=ON、且つ、Pレンジ側突き当て制御中フラグXexp=OFF、且つ、NotPレンジ側突き当て制御中フラグXexnp=OFFであるか否か、つまり、現在、F/B制御中で、且つ突き当て制御を実行していない状態であるか否かを判定する。このステップ821で「No」と判定された場合、つまり、F/B許可フラグXfb=OFF、又は、Pレンジ側突き当て制御中フラグXexp=ON、又は、NotPレンジ側突き当て制御中フラグXexnp=ONの場合は、ステップ822に進み、A相信号カウンタNa=0、B相信号カウンタNb=0、A相信号エッジ間隔カウンタΔTa=0、B相信号エッジ間隔カウンタΔTb=0にリセットして本ルーチンを終了する。
【0272】
これに対して、ステップ821で「Yes」と判定された場合は、AB相信号異常判定実行条件が成立して、ステップ823に進み、A相信号カウント値NaとB相信号カウント値Nbとの偏差ΔNabを算出する。
ΔNab=|Na−Nb|
ここで、A相信号カウント値NaとB相信号カウント値Nbは、A相信号のエッジとB相信号のエッジを別々にカウントした値である。
【0273】
そして、次のステップ824で、AB相信号カウント値偏差ΔNabを異常判定値Kab(例えば3)と比較し、もし、AB相信号カウント値偏差ΔNabが異常判定値Kab以上であれば、A相信号カウント値NaとB相信号カウント値Nbのいずれかが異常であると判断して、ステップ825に進み、AB相信号異常検出フラグXfabをON(異常あり)にセットして、次のステップ826に進む。
【0274】
一方、AB相信号カウント値偏差ΔNabが異常判定値Kab未満の場合は、AB相信号異常検出フラグXfabをOFF(異常なし)に維持してステップ826に進む。
【0275】
F/B制御中にA相信号とB相信号が正常に出力されていれば、A相信号カウント値NaとB相信号カウント値Nbとの偏差ΔNabが0又は1となるため、このAB相信号カウント値偏差ΔNabが2以上になれば、いずれか一方の信号の抜けやノイズパルスの混入が考えられる(図48参照)。従って、AB相信号カウント値偏差ΔNabが異常判定値Kab以上であるか否かで、A相信号とB相信号の異常の有無を判定することができる。本実施形態では、異常判定値Kabを余裕を見て3に設定したが、2又は4以上の値に設定しても良い。
【0276】
以上のようにして、AB相信号カウント値偏差ΔNabによる異常判定処理を行った後、ステップ826に進み、A相信号のエッジ間隔ΔTaとB相信号のエッジ間隔ΔTbをカウントするカウンタをそれぞれカウントアップした後、ステップ827に進み、A相信号エッジ間隔ΔTaを異常判定値Kta(例えばΔTaの平均値の10倍の値)と比較し、もし、A相信号エッジ間隔ΔTaが異常判定値Kta以上であれば、A相信号が異常であると判断して、ステップ828に進み、A相信号異常検出フラグXftaをON(異常あり)にセットして、次のステップ829に進む。
【0277】
一方、A相信号エッジ間隔ΔTaが異常判定値Kta未満の場合は、A相信号異常検出フラグXftaをOFF(異常なし)に維持してステップ829に進む。そして、このステップ829で、B相信号エッジ間隔ΔTbを異常判定値Ktb(例えばΔTbの平均値の10倍の値)と比較し、もし、B相信号エッジ間隔ΔTbが異常判定値Ktb以上であれば、B相信号が異常であると判断して、ステップ830に進み、B相信号異常検出フラグXftbをON(異常あり)にセットして本ルーチンを終了する。
【0278】
一方、B相信号エッジ間隔ΔTbが異常判定値Ktb未満の場合は、B相信号異常検出フラグXftbをOFF(異常なし)に維持して、本ルーチンを終了する。
【0279】
各信号のエッジ間隔ΔTa,ΔTbは、ロータ回転速度に応じて変化するため、F/B制御中に、各信号のエッジ間隔ΔTa,ΔTbが長くなり過ぎる場合は、ロータ32の異常停止、異常速度低下、パルス抜けが考えられるため(図48参照)、各信号のエッジ間隔ΔTa,ΔTbが異常判定値Kta,Kta(例えばΔTa,ΔTbの平均値の10倍)以上であるか否かで、A相信号とB相信号の異常の有無を判定することができる。
【0280】
尚、各信号のエッジ間隔ΔTa,ΔTbが短くなり過ぎる場合は、ノイズパルスが正規のパルス信号と誤認されている可能性があるため、各信号のエッジ間隔ΔTa,ΔTbが所定の異常判定値以下であるか否かで、A相信号とB相信号の異常の有無を判定するようにしても良い。
【0281】
また、AB相信号カウント値偏差ΔNabによる異常判定処理(ステップ823〜825)と各信号のエッジ間隔ΔTa,ΔTbによる異常判定処理(ステップ826〜830)のいずれか一方の処理のみを行い、他方の処理を省略するようにしても良い。
【0282】
[逆転カウンタ]
図54に示す逆転カウンタルーチンは、AB相割り込み処理により実行され、ロータ32の回転方向が回転方向指示に反して連続して逆転した回数を次のようにしてカウントする。本ルーチンが起動されると、まずステップ831で、回転方向指示値Dが1(Pレンジ→NotPレンジの回転方向)、0(停止)、−1(NotPレンジ→Pレンジの回転方向)のいずれに該当するかを判定し、回転方向指示値Dが0(停止)であれば、以降の処理を行うことなく、本ルーチンを終了する。
【0283】
一方、回転方向指示値Dが1(Pレンジ→NotPレンジの回転方向)であれば、ステップ832に進み、前回のエンコーダカウント値Ncnt(i-1) と今回のエンコーダカウント値Ncnt(i) との差が1以上であるか否かで、ロータ32の回転方向が回転方向指示に反して逆転したか否か(エンコーダカウント値Ncntが減少したか否か)を判定し、逆転していれば、ステップ834に進み、逆転回数をカウントする逆転カウンタCrをカウントアップし、逆転していなければ、ステップ835に進み、逆転カウンタCrを0にリセットする。
【0284】
また、回転方向指示値Dが−1(NotPレンジ→Pレンジの回転方向)であれば、ステップ833に進み、前回のエンコーダカウント値Ncnt(i-1) と今回のエンコーダカウント値Ncnt(i) との差が−1以下であるか否かで、ロータ32の回転方向が回転方向指示に反して逆転したか否か(エンコーダカウント値Ncntが増加したか否か)を判定し、逆転していれば、ステップ836に進み、逆転カウンタCrをカウントアップし、逆転していなければ、ステップ835に進み、逆転カウンタCrを0にリセットする。
【0285】
[逆転判定]
図55に示す逆転判定ルーチンは、所定周期(例えば1ms周期)で起動される。本ルーチンが起動されると、まずステップ841で、F/B許可フラグXfb=ON、且つ、Pレンジ側突き当て制御中フラグXexp=OFF、且つ、NotPレンジ側突き当て制御中フラグXexnp=OFFであるか否か、つまり、現在、F/B制御中で、且つ突き当て制御を実行していない状態であるか否かを判定する。このステップ841で「No」と判定された場合、つまり、F/B許可フラグXfb=OFF、又は、Pレンジ側突き当て制御中フラグXexp=ON、又は、NotPレンジ側突き当て制御中フラグXexnp=ONの場合は、ステップ844に進み、逆転検出フラグXrをOFFにセットして、本ルーチンを終了する。
【0286】
これに対して、ステップ841で「Yes」と判定された場合は、逆転判定実行条件が成立して、ステップ842に進み、図54の逆転カウンタルーチンで求めた逆転カウント値Crが異常判定値Kr(例えば4)以上であるか否かで、ロータ32が回転方向指示に反して逆転し続けているか否かを判定し、逆転カウント値Crが異常判定値Kr以上であれば、ステップ843に進み、逆転検出フラグXrをONにセットして逆転の判定を確定し、逆転カウント値Crが異常判定値Kr未満であれば、ステップ844に進み、逆転検出フラグXrをOFFに維持する。
【0287】
[システム異常診断]
図56に示すシステム異常診断ルーチンは、所定周期(例えば8ms周期)で起動され、特許請求の範囲でいう故障監視手段としての役割を果たす。本ルーチンが起動されると、まずステップ851で、次の▲1▼〜▲3▼の異常診断実行条件が成立しているか否かを判定する。
【0288】
▲1▼イグニッションスイッチ(図示せず)の操作によりECU41に電源が投入された後、所定時間(例えば1s)が経過していること
▲2▼突き当て制御中でないこと(Pレンジ側突き当て制御中フラグXexp=OFF、且つ、NotPレンジ側突き当て制御中フラグXexnp=OFFであること)
▲3▼リカバリ処理実行中でないこと(リカバリ処理実行フラグXrcv=OFFであること)
これら3つの条件▲1▼〜▲3▼のうち、1つでも満たさない条件があれば、異常診断実行条件が不成立となり、ステップ852に進み、後述する仮異常状態継続時間カウンタCfnsw、Cfcntを0にリセットして、本ルーチンを終了する。
【0289】
これに対し、上記▲1▼〜▲3▼の条件を全て満たせば、異常診断実行条件が成立し、ステップ851からステップ853に進み、突き当て制御が完了しているか否か(Pレンジ側突き当て完了フラグXp=ON、且つ、NotPレンジ側突き当て完了フラグXnp=ONであるか否か)を判定する。その結果、突き当て制御が完了していると判定されれば、ステップ854に進み、出力軸センサ14が正常で、且つ、指令シフトレンジと、出力軸センサ14の出力信号Vnswから判定したレンジとが一致しているか否かを判定し、その判定結果が「Yes」であれば、ステップ856に進み、第1の仮異常状態継続時間カウンタCfnswを0にリセットする。
【0290】
これに対し、上記ステップ854の判定結果が「No」であれば、ステップ855に進み、第1の仮異常状態継続時間カウンタCfnswをカウントアップして、指令シフトレンジと出力軸センサ14の出力信号Vnswとが一致していない状態の継続時間を計測し、次のステップ857で、第1の仮異常状態継続時間カウンタCfnswの値が異常判定値Kfnswよりも大きいか否かを判定する。ここで、異常判定値Kfnswは、正常なレンジ切換動作に要する最長時間よりも十分に長い時間(例えば10s)に設定されている。従って、第1の仮異常状態継続時間カウンタCfnswの値が異常判定値Kfnswよりも大きければ、レンジ切換動作が正常に行われない状態になっているため、システムの異常ありと判断して、ステップ858に進み、第1の異常検出フラグXfnswをONにセットする。上記ステップ857の判定結果が「No」であれば、第1の異常検出フラグXfnswをOFF(異常なし)に維持する。
【0291】
以上のようにして、出力軸センサ14の出力信号Vnswを用いて1回目の異常診断を行った後、図57のステップ859に進み、エンコーダカウント値Ncntと目標カウント値Acntとの偏差|Ncnt−Acnt|が所定値Kcnt(例えば5°相当値)よりも大きいか否かを判定し、このカウント値偏差|Ncnt−Acnt|が所定値Kcnt以下であれば、ステップ861に進み、第2の仮異常状態継続時間カウンタCfcntを0にリセットする。
【0292】
これに対し、上記ステップ859の判定結果が「Yes」であれば、ステップ860に進み、第2の仮異常状態継続時間カウンタCfcntをカウントアップして、カウント値偏差|Ncnt−Acnt|が所定値Kcntよりも大きい状態の継続時間を計測し、次のステップ862で、第2の仮異常状態継続時間カウンタCfcntの値が異常判定値Kfcntよりも大きいか否かを判定する。ここで、異常判定値Kfcntは、正常なレンジ切換動作に要する最長時間より十分に長い時間(例えば10s)に設定されている。従って、第2の仮異常状態継続時間カウンタCfcntの値が異常判定値Kfcntよりも大きければ、レンジ切換動作が正常に行われない状態になっているため、システムの異常ありと判断して、ステップ863に進み、第2の異常検出フラグXfcntをONにセットする。上記ステップ862の判定結果が「No」であれば、第2の異常検出フラグXfcntをOFF(異常なし)に維持する。
【0293】
以上のようにして、カウント値偏差|Ncnt−Acnt|を用いて2回目の異常診断を行った後、ステップ864に進み、図51のリカバリ処理ルーチンのステップ805でカウントされるリカバリ処理実行回数Crcvが異常判定値Kcrv(例えば3回)以上であるか否かを判定し、リカバリ処理実行回数Crcvが異常判定値Kcrv以上であれば、ステップ865に進み、システムの異常ありと判断して、ステップ865に進み、第3の異常検出フラグXfrcvをONにセットして本ルーチンを終了する。つまり、リカバリ処理が連続して異常判定値Kcrv(例えば3回)以上も繰り返される場合は、F/B制御系が正常に機能しない状態になっているため、システムの異常ありと判断するものである。
【0294】
一方、リカバリ処理実行回数Crcvが異常判定値Kcrv未満であれば、第3の異常検出フラグXfrcvをOFF(異常なし)に維持して本ルーチンを終了する。
【0295】
[フェールセーフ処理]
図58に示すフェールセーフ処理ルーチンは、所定周期(例えば8ms周期)で起動され、特許請求の範囲でいうフェールセーフ手段としての役割を果たす。本ルーチンが起動されると、まずステップ901で、次の▲1▼、▲2▼のフェールセーフ処理実行条件が成立しているか否かを判定する。
【0296】
▲1▼オープンループ制御によるレンジ切り換えが可能な状態であること(システム故障フラグXfailoff=OFFであること)
▲2▼図56のシステム異常診断ルーチンでセットされる3つの異常検出フラグXfnsw、Xfcnt、Xfrcvのうちの少なくとも1つがON(異常あり)であること
【0297】
これら2つの条件▲1▼、▲2▼のうち、いずれか一方でも満たさない条件があれば、フェールセーフ処理実行条件が不成立となり、以降の処理を行うことなく、本ルーチンを終了する。
【0298】
これに対し、上記2つの条件▲1▼、▲2▼を両方とも満たせば、フェールセーフ処理実行条件が成立し、ステップ901からステップ902に進み、フェールセーフ処理実行フラグXfsopをONにセットし、次のステップ903で、警告ランプを点灯したり、或は、メータパネルの情報表示部等に警告表示して、運転者に警告する。
【0299】
この後、ステップ904に進み、前回のフェールセーフ処理終了後の経過時間を計測するフェールセーフ処理間隔カウンタCfsopの値が所定値Kfsop未満であるか否かを判定する。ここで、所定値Kfsopは、前回のフェールセーフ処理終了後にディテントバネ23の弾性力によってディテントバネ23の係合部23aがディテントレバー15の保持凹部24,25の傾斜側壁に沿ってその底部に滑り落ちるのに要する時間よりもある程度長い時間(例えば500ms)に設定されている。
【0300】
フェールセーフ処理間隔カウンタCfsopの値(前回のフェールセーフ処理終了後の経過時間)が所定値Kfsop未満であれば、ステップ905に進み、フェールセーフ処理間隔カウンタCfsopをカウントアップして前回のフェールセーフ処理終了後の経過時間をカウントする。この後、ステップ906に進み、全相の通電をオフした状態を継続し、次のステップ907で、通電フラグXonを通電オフを意味するOFFにセットして本ルーチンを終了する。これにより、前回のフェールセーフ処理終了後の経過時間が所定値Kfsopを越えるまでは、全相の通電をオフした状態に維持される。
【0301】
その後、フェールセーフ処理間隔カウンタCfsopの値(前回のフェールセーフ処理終了後の経過時間)が所定値Kfsop以上になった時点で、ステップ904からステップ908に進み、オープンループ制御実行フラグXopenがOFFであるか否かを判定し、OFFであれば、ステップ909に進み、指令シフトレンジsftが切り換えられたか否かを判定する。その結果、指令シフトレンジsftが切り換えられていないと判定されれば、ステップ910に進み、全相の通電をオフした状態を継続する。
【0302】
これに対して、上記ステップ909で、指令シフトレンジsftが切り換えられたと判定されれば、ステップ911に進み、前記図51のリカバリ処理ルーチンのステップ804と同じ方法で、現在の出力軸センサ14の出力信号Vnswを用いて現在の位置カウント値Ncntopを算出する。この位置カウント値Ncntopは、オープンループ制御開始時の位置カウント値Ncntopの初期値として用いられる。
【0303】
この後、ステップ912に進み、オープンループ制御実行フラグXopenをONにセットして、後述する図60のオープンループ制御ルーチンによりオープンループ制御を実行し、次のステップ913で、フェールセーフ処理の実行回数をカウントするフェールセーフ処理実行回数カウンタCfsをカウントアップして、本ルーチンを終了する。
【0304】
また、前記ステップ908で、オープンループ制御実行フラグXopenがONであると判定されれば、図59のステップ914に進み、オープンループ制御完了フラグXopcmpがオープンループ制御完了を意味するONにセットされているか否かを判定し、Xopcmp=OFFであれば、以降の処理を行うことなく、本ルーチンを終了する。
【0305】
これに対し、ステップ914で、オープンループ制御完了フラグXopcmpがONにセットされていると判定されれば、ステップ915に進み、指令シフトレンジと、出力軸センサ14の出力信号Vnswから判定したレンジとが一致しているか否かを判定し、その判定結果が「Yes」であれば、ステップ916に進み、フェールセーフ処理実行回数カウンタCfsを0にリセットする。そして、次のステップ918で、オープンループ制御完了フラグXopcmpをOFFにセットすると共に、次のステップ919で、オープンループ制御実行フラグXopenをOFFにセットして、本ルーチンを終了する。
【0306】
また、上記ステップ915で、指令シフトレンジと出力軸センサ14の出力信号Vnswとが一致していないと判定された場合は、ステップ917に進み、フェールセーフ処理実行回数カウンタCfsの値が故障判定値(例えば3回)以上であるか否かを判定し、フェールセーフ処理実行回数カウンタCfsの値が故障判定値未満であれば、まだ故障とは判定せずに、オープンループ制御完了フラグXopcmp=OFF、オープンループ制御実行フラグXopen=OFFにセットして(ステップ918、919)、本ルーチンを終了する。
【0307】
その後、フェールセーフ処理実行回数カウンタCfsの値が故障判定値(例えば3回)以上になれば、その時点で、システムの故障(オープンループ制御でもレンジ切り換えが不可能な状態)と判断して、ステップ917からステップ920に進み、システム故障フラグXfailoffをONにセットし、次のステップ921で、全相の通電をオフして、本ルーチンを終了する。
【0308】
[オープンループ制御]
図60に示すオープンループ制御ルーチンは、所定周期(例えば1ms周期)で起動され、次のようにしてオープンループ制御を実行する。本ルーチンが起動されると、まずステップ931で、オープンループ制御実行フラグXopenがONにセットされているか否かを判定し、Xopen=OFFであれば、以降の処理を行うことなく、本ルーチンを終了する。
【0309】
これに対し、オープンループ制御実行フラグXopenがONにセットされていれば、ステップ931からステップ932に進み、時間を計測する時間カウンタTopをカウントアップし、次のステップ933で、時間カウンタTopの値が現在の通電相の励磁時間tm以上になったか否かを判定し、励磁時間tm未満であれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、ステップ934以降の処理は、励磁時間tm毎に実行される。
【0310】
その後、時間カウンタTopの値が現在の通電相の励磁時間tm以上になった時点で、ステップ933からステップ934に進み、目標カウント値Acntと現在の位置カウント値Ncntopとを比較して、ロータ32の駆動方向を判定する。その結果、現在の位置カウント値Ncntopが目標カウント値Acntよりも小さい場合は、ロータ32の駆動方向がPレンジ側からNotPレンジ側への回転方向(正回転方向)と判断して、ステップ935に進み、通電相判定値Mptnopを1ずつカウントアップし、次のステップ936で、位置カウント値Ncntopを2ずつカウントアップする。これは、1回の励磁でロータ32が2カウント分(3.75°)回転するためである。
【0311】
これに対し、現在の位置カウント値Ncntopが目標カウント値Acntよりも大きい場合は、ロータ32の駆動方向がNotPレンジ側からPレンジ側への回転方向(逆回転方向)と判断して、ステップ937に進み、通電相判定値Mptnopを1ずつカウントダウンし、次のステップ938で、位置カウント値Ncntopを2ずつカウントダウンする。
【0312】
この後、ステップ939に進み、通電相判定値Mptnopを“6”で割り算した時の余りMptnop%6を算出する。ここで、“6”は、オープンループ制御で通電相を一巡させる間の通電相判定値Mptnopの増減量に相当する。
【0313】
Mptnop%6の算出後、ステップ940に進み、図63のテーブルによってMptnop%6に応じて通電相を選択し、その通電相を励磁する。本実施形態では、オープンループ制御中は、1−2相励磁方式で駆動するように通電相を選択し、更に、オープンループ制御を開始するときの最初の励磁が2相通電(WU相通電又はUV相通電又はVW相通電)、つまりMptnop%6=1又は3又は5となるように通電相判定値Mptnopの初期値が設定されている。
【0314】
この後、図61のステップ941に進み、位置偏差devを次式により算出する。
dev=|Acnt−Ncntop|/2
上式から明らかなように、位置偏差devは、目標カウント値Acntと現在の位置カウント値Ncntopとの偏差(絶対値)の1/2である。
【0315】
そして、次のステップ942で、位置偏差devと回転速度パラメータmspdとを比較する。この回転速度パラメータmspdは、位置偏差devに応じて増減されるパラメータであり、この回転速度パラメータmspdに応じて図65のテーブルにより励磁時間tmを設定することで、ロータ32の回転速度、加速、減速を制御する。この場合、目標とする回転速度が高くなるほど、回転速度パラメータmspdが大きくなり、励磁時間tmが短い時間に設定されるようになっている。この回転速度パラメータmspdの初期値は0である。
【0316】
上記ステップ942で、位置偏差devが回転速度パラメータmspdより大きいと判定された場合は、ステップ943に進み、回転速度パラメータmspdを1だけカウントアップし、次のステップ944で、最小回転速度パラメータmspdminを0にセットする。この最小回転速度パラメータmspdminは、回転速度パラメータmspdの最小値を制限するパラメータ(下限ガード値)である。このように、位置偏差devが回転速度パラメータmspdより大きいときに、最小回転速度パラメータmspdminを0にセットすることで、オープンループ制御開始からロータ32が回転し始めるまでの期間に、励磁時間tmを最長時間(50ms)に設定できるようにしている。
【0317】
一方、上記ステップ942で、位置偏差devが回転速度パラメータmspdより小さいと判定された場合は、ステップ945に進み、回転速度パラメータmspdを1だけカウントダウンし、次のステップ946で、最小回転速度パラメータmspdminを4にセットする。これにより、ロータ32の回転が立ち上がった後は、励磁時間tmを例えば5ms以下に制限できるようにしている。
【0318】
また、上記ステップ942で、位置偏差devが回転速度パラメータmspdと一致すると判定された場合は、回転速度パラメータmspdを変化させずに、ステップ947に進み、最小回転速度パラメータmspdminを0にセットする。
【0319】
以上のようにして、回転速度パラメータmspdと最小回転速度パラメータmspdminを設定した後、ステップ948に進み、図64のテーブルを用いてバッテリ電圧(電源電圧)に応じて最大回転速度パラメータmspdmaxを設定する。この最大回転速度パラメータmspdmaxは、回転速度パラメータmspdの最大値を制限するパラメータ(上限ガード値)であり、バッテリ電圧が高くなるほど、最大回転速度パラメータmspdmaxを大きくして、ロータ32の回転速度を速くできるようにしている。
【0320】
そして、次のステップ949で、回転速度パラメータmspdを最小回転速度パラメータmspdminと最大回転速度パラメータmspdmaxとの範囲内に収めるようにガード処理する。例えば、ステップ943又は945で更新した回転速度パラメータmspdが最小回転速度パラメータmspdminよりも小さい場合は、mspd=mspdminとし、また、回転速度パラメータmspdが最大回転速度パラメータmspdmaxよりも大きい場合は、mspd=mspdmaxとし、mspdmin≦mspd≦mspdmaxの場合は、その回転速度パラメータmspdをそのまま用いる。
【0321】
この後、ステップ950に進み、図65のテーブルを用いて、回転速度パラメータmspdに応じて励磁時間tmを設定する。図65の例では、回転速度パラメータmspdが0〜3までの範囲では、励磁時間tmを最長時間(例えば50ms)に設定し、起動時にロータ32の回転位相と通電相との同期を確実にとることができるようにしている。そして、回転速度パラメータmspdが4〜9までの範囲では、回転速度パラメータmspdが大きくなるに従って、励磁時間tmを例えば5msから3msまで3段階に小さくして、ロータ32の回転速度を3段階に調整できるようになっている。尚、励磁時間tmの切り換えは、2段階以下又は4段階以上であっても良いことは言うまでもない。
【0322】
励磁時間tmの設定後、ステップ951に進み、通電フラグXonをONにセットし、次のステップ952で、時間カウンタTopをクリアして本ルーチンを終了する。
【0323】
また、図60のステップ934で、現在の位置カウント値Ncntopが目標カウント値Acntと一致すると判定された場合は、図62のステップ955に進み、時間カウンタTopの計測時間が所定時間Khld(例えば500ms)以上になったか否かを判定する。その結果、時間カウンタTopの計測時間が所定時間Khld未満と判定された場合は、ステップ956に進み、全相の通電をオフし、次のステップ957で、励磁時間tmを所定時間Khld(例えば500ms)にセットする。この後、図61のステップ952に進み、時間カウンタTopをクリアして本ルーチンを終了する。このような処理により、オープンループ制御終了後、所定時間Khld(例えば500ms)が経過するまで、前記図60のステップ934以降の処理が行われないため、次のオープンループ制御が開始されない。これは、オープンループ制御終了後に、ディテントバネ23の弾性力によりディテントバネ23の係合部23aがディテントレバー15の保持凹部24,25の傾斜側壁に沿ってその底部に滑り落ちるまで待つためである。
【0324】
また、図62のステップ955で、時間カウンタTopの値が所定値Khld以上になったと判定されれば、ステップ958に進み、通電相判定値Mptnop=0、回転速度パラメータmspd=0にセットし、次のステップ959で、オープンループ制御完了フラグXopcmpをONにセットする。この後、ステップ960に進み、励磁時間Tmを0にセットし、次のステップ961で、通電フラグXonをOFFにセットした後、図61のステップ952に進み、時間カウンタTopをクリアして本ルーチンを終了する。
【0325】
以上説明した本ルーチンでは、オープンループ制御中の励磁方式を1−2相励磁方式に設定し、オープンループ制御開始時の最初の励磁を2相通電で行うと共に、図50に示すように、オープンループ制御開始から例えば3ステップ分は、各通電相の励磁時間tmを最長時間(例えば50ms)に設定して、ロータ32を確実に掴んでロータ32の回転位相と通電相とを確実に同期させる。この後は、励磁時間tmを大幅に短くするが、ロータ32の回転速度の上昇に伴って励磁時間tmを徐々に短くして、ロータ32の回転速度を緩やかに上昇させる。
【0326】
このオープンループ制御中のロータ32の回転位置を推定するために、オープンループ制御開始時のロータ32の初期位置(位置カウント値Ncntopの初期値)を出力軸センサ14の出力信号に基づいて算出し、その後、通電相を切り換える毎に位置カウント値Ncntopを2ずつカウントアップ(又はカウントダウン)して、該位置カウント値Ncntopに基づいてロータ32の回転位置を推定し、該位置カウント値Ncntopと目標カウント値Acntとの偏差がある程度小さくなった段階で、減速領域に入ったと判断して、励磁時間tmを徐々に長くして、ロータ32の回転速度を緩やかに減速し、該位置カウント値Ncntopが目標カウント値Acntに到達した時点で、ロータ32が目標位置に到達したと判断して、オープンループ制御を終了する。
【0327】
尚、本ルーチンでは、励磁時間tmを回転速度パラメータmspdに応じて設定するようにしたが、駆動開始後の回転量、駆動開始後の経過時間、目標位置までの回転量、負荷トルクの少なくとも1つに基づいて励磁時間tmを設定するようにしても良い。
【0328】
また、本ルーチンでは、オープンループ制御開始時の最初の励磁を2相通電としたが、最初の励磁を1相通電としても良く、更には、オープンループ制御中の励磁方式も1−2相励磁方式に限定されず、1相励磁方式又は2相励磁方式を採用しても良い。
【0329】
[オープンループ制御時エンジントルク抑制]
図66に示すオープンループ制御時エンジントルク抑制ルーチンは、所定周期(例えば1ms周期)で起動される。本ルーチンが起動されると、まずステップ971で、オープンループ制御実行フラグXopen=ON(オープンループ制御実行中)であるか否かを判定し、Xopen=ONであれば、ステップ972に進み、エンジントルク抑制フラグXtrqをONにセットし、Xopen=OFFであれば、ステップ973に進み、エンジントルク抑制フラグXtrqをOFFにセットする。このエンジントルク抑制フラグXtrqの情報は、レンジ切換制御用のECU41からエンジン制御用のECU(図示せず)に送信される。
【0330】
エンジン制御用のECUは、オープンループ制御実行フラグXopen=ONの情報を受信したときに、エンジントルクを抑制する方向にエンジン制御パラメータを制御して、エンジントルクを抑制した状態で、オープンループ制御によるレンジ切換動作を実行する。
【0331】
この際、エンジントルクを抑制する方向に制御するエンジン制御パラメータは、空気系、燃料系、点火系のうちの少なくとも1つの制御パラメータを用いれば良く、例えば、空気系の場合は、スロットルバルブの開駆動を禁止してスロットル開度を現状維持するようにしたり、或は、運転に支障を来さない範囲内でスロットル開度を閉じるようにしても良い。また、燃料系の場合は、運転に支障を来さない範囲内で燃料噴射量を制限するようにすれば良く、点火系の場合は、運転に支障を来さない範囲内で点火時期を遅角するようにすれば良い。
【0332】
[指令シフトレンジ設定]
図67に示す指令シフトレンジ設定ルーチンは、所定周期(例えば8ms周期)で起動される。本ルーチンが起動されると、まずステップ981で、オープンループ制御実行フラグXopen=ON(オープンループ制御実行中)であるか否かを判定し、Xopen=ONの場合は、Pレンジスイッチ43の操作やNotPレンジスイッチ44の操作が行われても、その操作信号を無視して、指令シフトレンジsftの切り換えを禁止する。
【0333】
これに対して、オープンループ制御実行フラグXopen=OFFと判定された場合は、ステップ982に進み、Pレンジスイッチ43が操作されたか否かを判定し、Pレンジスイッチ43が操作されていれば、ステップ983に進み、指令シフトレンジsftをPレンジに設定する。
【0334】
また、Pレンジスイッチ43が操作されていない場合は、ステップ984に進み、NotPレンジスイッチ44が操作されたか否かを判定し、NotPレンジスイッチ44が操作されていれば、ステップ985に進み、指令シフトレンジsftをNotPレンジに設定する。
【0335】
要するに、図68に示すように、オープンループ制御中でない場合(Xopen=OFFの場合)は、Pレンジスイッチ43やNotPレンジスイッチ44が操作されれば、直ちに指令シフトレンジsftが操作信号に応じたレンジに切り換えられるが、オープンループ制御中(Xopen=ONの場合)であれば、Pレンジスイッチ43の操作やNotPレンジスイッチ44の操作が行われても、その操作信号が無視されて、指令シフトレンジsftの切り換えが行われない。
【0336】
そして、本ルーチンの最後のステップ986で、現在の指令シフトレンジsftがECU41のSRAM等の不揮発性メモリに記憶される。この不揮発性メモリに記憶された指令シフトレンジsftは、車両運転中にECU41のCPUが何等かの原因でリセットされてRAMの記憶データが初期化されたときに、指令シフトレンジsftの情報として用いられる。このようにすれば、車両運転中にECU41のCPUが何等かの原因でリセットされてRAMの記憶データが初期化されも、その直後に、シフトレンジをリセット直前のレンジに制御することができ、リセット後に運転者の意思に反してシフトレンジが切り換えられることを防止できる。
【0337】
次に、図47のタイムチャートを用いて、F/B制御状態が一時的に異常になった場合に実行されるリカバリ処理の実行例を説明する。図47は、シフトレンジをPレンジからNotPレンジに切り換える途中で、F/B制御状態が異常になって、ロータ32の異常停止又はエンコーダカウント値Ncntのカウント動作の異常停止が発生したときの制御例を示している。
【0338】
シフトレンジをPレンジからNotPレンジに切り換えるF/B制御中に、F/B制御状態が正常か異常かを監視し、異常が検出された時点で、リカバリ処理実行フラグXrcvをOFFからONに切り換える。これにより、F/B制御からオープンループ制御に切り換えてリカバリ処理を開始する。
【0339】
オープンループ制御(リカバリ処理)の開始時に、出力軸センサ14の出力信号Vnswを用いてオープンループ制御時の位置カウント値Ncntopの初期値を算出する。そして、オープンループ制御(リカバリ処理)中は、エンコーダカウント値Ncntの情報をフィードバックせずに通電相を順次切り換えてロータ32を回転駆動すると共に、当該オープンループ制御中に通電相を切り換える毎に位置カウント値Ncntopを2ずつカウントアップ(又はカウントダウン)して、この位置カウント値Ncntopが目標カウント値Acntに到達した時点で、ロータ32が目標位置に到達したと判断して、リカバリ処理実行フラグXrcvをONからOFFに切り換える。これにより、オープンループ制御(リカバリ処理)を終了し、F/B制御に復帰する。
【0340】
このようにすれば、F/B制御中に、エンコーダカウント値Ncntの異常や脱調等が発生してF/B制御状態(ロータ32の回転状態)が一時的に異常になっても、F/B制御からオープンループ制御に切り換えてロータ32を目標位置まで回転させることができ、モータ制御(レンジ切換制御)の信頼性を向上させることができる。
【0341】
そして、F/B制御に復帰する際に、初期駆動と一方向・他方向突き当て制御を再実行する。このようにすれば、オープンループ制御中にエンコーダカウント値Ncntとロータ32の回転位置(レンジ切換機構11の操作量)との関係がずれても、そのずれを初期駆動と一方向・他方向突き当て制御によって精度良く補正することができる。
【0342】
次に、図69及び図70のタイムチャートを用いて、F/B制御系が故障した場合に実行されるフェールセーフ処理の実行例を説明する。図69は、シフトレンジをPレンジからNotPレンジに切り換える際に、F/B制御系の故障(システム異常)が発生したときに、フェールセーフ処理(オープンループ制御)を実行してレンジ切換に成功した場合の制御例である。一方、図70は、フェールセーフ処理(オープンループ制御)によるレンジ切換に失敗した場合の制御例である。
【0343】
前述したリカバリ処理とフェールセーフ処理は、オープンループ制御によって実行する点で共通するが、リカバリ処理は、F/B制御状態が一時的に異常になった場合に実行する処理であるため、リカバリ処理(オープンループ制御)によりロータ32を目標位置まで回転させた時点で、F/B制御に復帰するのに対し、フェールセーフ処理は、F/B制御系の故障が発生してF/B制御が実行不能になったときに実行する処理であるため、フェールセーフ処理(オープンループ制御)によりロータ32を目標位置まで回転駆動できたとしても、F/B制御に復帰せず、次回以降のレンジ切換もフェールセーフ処理(オープンループ制御)により行われる。
【0344】
図69に示すように、シフトレンジをPレンジからNotPレンジに切り換える際に、F/B制御系の故障(システム異常)が検出されると、その時点で、フェールセーフ処理実行フラグXfsopがOFFからONに切り換えられ、フェールセーフ処理(オープンループ制御)が開始される。
【0345】
この後、フェールセーフ処理(オープンループ制御)によりロータ32を目標位置まで回転駆動する処理は、リカバリ処理(オープンループ制御)と同じである。そして、このフェールセーフ処理によって、位置カウント値Ncntopが目標カウント値Acntに到達した時点で、ロータ32が目標位置に到達したと判断して、オープンループ制御実行フラグXopenをOFFに切り換えると共に、オープンループ制御完了フラグXopcmpをONに切り換えて、オープンループ制御によるモータ駆動を終了する。
【0346】
その後、指令シフトレンジsftがNotPレンジからPレンジに切り換えられると、その時点で、オープンループ制御実行フラグXopenをONに切り換えると共に、オープンループ制御完了フラグXopcmpをOFFに切り換え、更に、目標カウント値AcntをPレンジ相当値にセットして、オープンループ制御によるレンジ切換を実行する。
【0347】
このように、一旦、フェールセーフ処理が実行されると、それ以後のレンジ切換もフェールセーフ処理によって実行される。この際、フェールセーフ処理により位置カウント値Ncntopが目標カウント値Acntに到達した時点で、フェールセーフ処理によるレンジ切換が成功したか否かを出力軸センサ14の出力信号に基づいて確認し、もし、レンジ切換が失敗していれば、フェールセーフ処理によるレンジ切換を再び試みる。
【0348】
図70は、フェールセーフ処理によりPレンジからNotPレンジに切り換えようとしても、出力軸センサ14の出力信号がPレンジ相当値のまま変化しない場合(Pレンジのまま動かない場合)の制御例を示している。この場合は、フェールセーフ処理により位置カウント値Ncntopが目標カウント値Acntに到達しても、出力軸センサ14の出力信号が目標カウント値Acntに対応する値となっていないため、レンジ切換が失敗したと判定され、フェールセーフ処理によるレンジ切換が再び試みられる。
【0349】
このフェールセーフ処理の繰り返し回数(失敗回数)をフェールセーフ処理実行回数カウンタCfsによりカウントし、フェールセーフ処理を例えば3回繰り返しても、レンジ切換に失敗した場合は、オープンループ制御でもレンジ切換不能と判断してシステム故障フラグXfailoffをONにセットすると共に、通電フラグXonをOFFに切り換えてSRモータ12への通電をオフする。
【0350】
以上説明した本実施形態によれば、F/B制御系の故障(システム異常)を検出したときに、フェールセーフ処理(オープンループ制御)に切り換えてSRモータ12を駆動するようにしたので、F/B制御系が何等かの原因で故障しても、可能な限り、ロータ32を目標位置まで回転させることができ、モータ制御の信頼性を向上させることができる。
【0351】
尚、本発明に用いるエンコーダは、磁気式のエンコーダ46に限定されず、例えば、光学式のエンコーダやブラシ式のエンコーダを用いても良い。
また、本発明に用いるモータは、SRモータ12に限定されず、エンコーダの出力信号のカウント値に基づいてロータの回転位置を検出してモータの通電相を順次切り換えるブラシレス型のモータであれば、SRモータ以外のブラシレス型のモータを用いても良い。
【0352】
また、本実施形態のレンジ切換装置は、PレンジとNotPレンジの2つのレンジを切り換える構成であるが、例えば、ディテントレバー15の回動動作に連動して自動変速機のレンジ切換弁とマニュアルバルブを切り換えて、自動変速機のP、R、N、D、…の各レンジを切り換えるレンジ切換装置にも本発明を適用して実施できる。
【0353】
その他、本発明は、レンジ切換装置に限定されず、SRモータ等のブラシレス型のモータを駆動源とする各種の装置に適用して実施できることは言うまでもない。
【図面の簡単な説明】
【図1】本発明の一実施形態を示すレンジ切換装置の斜視図
【図2】SRモータの構成を説明する図
【図3】SRモータを駆動する回路構成を示す回路図
【図4】レンジ切換装置の制御システム全体の構成を概略的に示す図
【図5】エンコーダのロータリマグネットの構成を説明する平面図
【図6】エンコーダの側面図
【図7】(a)はエンコーダの出力波形を示すタイムチャート、(b)は通電相切り換えパターンを示すタイムチャート
【図8】初期駆動ルーチンの処理の流れを示すフローチャート(その1)
【図9】初期駆動ルーチンの処理の流れを示すフローチャート(その2)
【図10】Pレンジ初期駆動ルーチンの処理の流れを示すフローチャート
【図11】NotPレンジ初期駆動ルーチンの処理の流れを示すフローチャート
【図12】Pレンジで初期駆動を行ったときの制御例を示すタイムチャート
【図13】初期駆動中にレンジ切換操作されたときの制御例を示すタイムチャート
【図14】初期駆動中にレンジ切換操作されたときの初期位置ずれ学習方法を説明するタイムチャート
【図15】エンコーダカウンタルーチンの処理の流れを示すフローチャート
【図16】カウントアップ値ΔN算出マップの一例を示す図
【図17】指令レンジシフト、A相信号、B相信号、エンコーダカウント値の関係を示すタイムチャート
【図18】SRモータの制御例を示すタイムチャート
【図19】F/B制御から目標位置停止保持処理へ移行するタイミングを説明するタイムチャート
【図20】制御モード設定ルーチンの処理の流れを示すフローチャート(その1)
【図21】制御モード設定ルーチンの処理の流れを示すフローチャート(その2)
【図22】制御モード設定ルーチンの処理の流れを示すフローチャート(その3)
【図23】時間同期モータ制御ルーチンの処理の流れを示すフローチャート
【図24】mode1ルーチンの処理の流れを示すフローチャート
【図25】mode3ルーチンの処理の流れを示すフローチャート
【図26】mode4ルーチンの処理の流れを示すフローチャート
【図27】通電処理ルーチンの処理の流れを示すフローチャート
【図28】1−2相励磁方式の場合のMptn%12から通電相への変換テーブルの一例を示す図
【図29】突き当て制御中にバッテリ電圧に応じて通電デューティ比を設定するテーブルの一例を示す図
【図30】F/B制御ルーチンの処理の流れを示すフローチャート
【図31】通電相設定ルーチンの処理の流れを示すフローチャート
【図32】UW相から回転を開始する時の通電処理を説明するタイムチャート
【図33】ロータ回転速度演算ルーチンの処理の流れを示すフローチャート
【図34】速度位相進み補正量設定ルーチンの処理の流れを示すフローチャート
【図35】ディテントバネの係合部とディテントレバーのPレンジ保持凹部とNotPレンジ保持凹部との関係を説明する図
【図36】遊び量学習ルーチンの処理の流れを示すフローチャート
【図37】バッテリ電圧に応じて乗り上げ補正量ΔVoverを設定するテーブルの一例を示す図
【図38】可動範囲の実測値ΔNactと設計値ΔNdと遊び量ΔGp,ΔGnpとの関係を説明する図
【図39】Pレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート(その1)
【図40】Pレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート(その2)
【図41】Pレンジ側突き当て制御の一例を説明するタイムチャート
【図42】NotPレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート(その1)
【図43】NotPレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート(その2)
【図44】Pレンジ側突き当て制御とNotPレンジ側突き当て制御の実行タイミングの一例を説明するタイムチャート
【図45】目標カウント値設定ルーチンの処理の流れを示すフローチャート(その1)
【図46】目標カウント値設定ルーチンの処理の流れを示すフローチャート(その2)
【図47】リカバリ処理の一例を説明するタイムチャート
【図48】エンコーダのA相信号・B相信号の異常を検出する方法を説明する図
【図49】F/B制御中のロータの逆転を検出する方法を説明する図
【図50】オープンループ制御の一例を説明するタイムチャート
【図51】リカバリ処理ルーチンの処理の流れを示すフローチャート
【図52】オープンループ制御開始時の位置カウント値Ncntの初期値を算出する方法を説明する図
【図53】AB相信号異常検出ルーチンの処理の流れを示すフローチャート
【図54】逆転カウンタルーチンの処理の流れを示すフローチャート
【図55】逆転判定ルーチンの処理の流れを示すフローチャート
【図56】システム異常診断ルーチンの処理の流れを示すフローチャート(その1)
【図57】システム異常診断ルーチンの処理の流れを示すフローチャート(その2)
【図58】フェールセーフ処理ルーチンの処理の流れを示すフローチャート(その1)
【図59】フェールセーフ処理ルーチンの処理の流れを示すフローチャート(その2)
【図60】オープンループ制御ルーチンの処理の流れを示すフローチャート(その1)
【図61】オープンループ制御ルーチンの処理の流れを示すフローチャート(その2)
【図62】オープンループ制御ルーチンの処理の流れを示すフローチャート(その3)
【図63】Mptnop%6から通電相への変換テーブルの一例を示す図
【図64】バッテリ電圧から最大回転速度パラメータmspdmaxを求めるテーブルの一例を示す図
【図65】回転速度パラメータmspdから励磁時間tmを求めるテーブルの一例を示す図
【図66】オープンループ制御時エンジントルク抑制ルーチンの処理の流れを示すフローチャート
【図67】指令シフトレンジ設定ルーチンの処理の流れを示すフローチャート
【図68】指令シフトレンジsftの切り換えとオープンループ制御との関係を説明するタイムチャート
【図69】P→NotPレンジ切換時にPレンジで異常となった場合のフェールセーフ処理(オープンループ制御可能時)の制御例を説明するタイムチャート
【図70】P→NotPレンジ切換時にPレンジで異常となった場合のフェールセーフ処理(オープンループ制御不能時)の制御例を説明するタイムチャート
【符号の説明】
11…レンジ切換機構、12…SRモータ、14…出力軸センサ、15…ディテントレバー、18…パーキングロッド、20…パーキングギヤ、21…ロックレバー、23…ディテントバネ、23a…係合部、24…Pレンジ保持凹部、25…NotPレンジ保持凹部、26…減速機構、27…自動変速機、31…ステータ、32…ロータ、33,34…巻線、35,36…モータ励磁部、37,38…モータドライバ、41…ECU(制御手段,フェールセーフ手段,故障監視手段)、43…Pレンジスイッチ、44…NotPレンジスイッチ、46…エンコーダ、47…ロータリマグネット、48…A相信号用の磁気検出素子、49…B相信号用の磁気検出素子、50…Z相信号用の磁気検出素子。
Claims (11)
- 制御対象を回転駆動するモータのロータの回転に同期してパルス信号を出力するエンコーダと、このエンコーダのパルス信号のカウント値(以下「エンコーダカウント値」という)に基づいて前記ロータの回転位置を検出して前記モータの通電相を順次切り換えることで前記ロータを目標位置まで回転駆動するフィードバック制御(以下「F/B制御」と表記する)を実行する制御手段とを備えたモータ制御装置において、
前記モータのF/B制御系の故障の有無を監視する故障監視手段と、
前記故障監視手段により前記F/B制御系の故障が検出されたときに、前記F/B制御からオープンループ制御に切り換え、前記エンコーダカウント値の情報をフィードバックせずに前記モータの通電相を順次切り換えると共に、その通電相の切換回数をカウントしてそのカウント値に基づいて前記ロータを前記目標位置まで回転駆動するフェールセーフ手段と
を備えていることを特徴とするモータ制御装置。 - 前記フェールセーフ手段は、前記オープンループ制御により前記モータを停止状態から駆動するときに最初の励磁を2相通電で行い、その後は、1相通電と2相通電とを交互に切り換えることを特徴とする請求項1に記載のモータ制御装置。
- 前記フェールセーフ手段は、前記オープンループ制御により前記モータを停止状態から駆動するときに初めの所定回数の励磁の通電時間をその以後の励磁の通電時間よりも長い時間に設定することを特徴とする請求項1又は2に記載のモータ制御装置。
- 前記フェールセーフ手段は、前記オープンループ制御中に、ロータ回転速度、駆動開始後の回転量、駆動開始後の経過時間、前記目標位置までの回転量、負荷トルクの少なくとも1つに基づいて励磁の通電時間を設定することを特徴とする請求項1乃至3のいずれかに記載のモータ制御装置。
- 前記フェールセーフ手段は、前記オープンループ制御により前記モータを前記目標位置に向かって回転駆動している期間は、該目標位置の切換操作信号が入力されてもその切換操作信号を無視することを特徴とする請求項1乃至4のいずれかに記載のモータ制御装置。
- 前記モータの出力軸の回転位置又はそれに相関する位置情報を検出する出力軸センサを設け、
前記フェールセーフ手段は、前記オープンループ制御中に前記通電相の切換回数のカウント値に基づいて推定した前記ロータの回転位置が前記目標位置に到達した時点で該オープンループ制御を終了すると共に、前記出力軸センサの出力信号に基づいて該オープンループ制御によるモータ駆動が成功か失敗かを判定し、失敗であれば再びオープンループ制御によるモータ駆動を繰り返すことを特徴とする請求項1乃至5のいずれかに記載のモータ制御装置。 - 前記フェールセーフ手段は、前記オープンループ制御によるモータ駆動を連続して所定回数以上失敗したときに、オープンループ制御不能と判断して前記モータの通電をオフすることを特徴とする請求項6に記載のモータ制御装置。
- 前記フェールセーフ手段は、前記オープンループ制御開始時の前記ロータの初期位置を前記出力軸センサの出力信号に基づいて推定し、該オープンループ制御中に前記ロータの初期位置推定値と前記通電相の切換回数のカウント値とに基づいて前記ロータの回転位置を推定することを特徴とする請求項6又は7に記載のモータ制御装置。
- 前記モータは、スイッチトリラクタンスモータであることを特徴とする請求項1乃至8のいずれかに記載のモータ制御装置。
- 前記制御対象は、車両のパーキングレンジと他のレンジとを切り換えるレンジ切換装置であることを特徴とする請求項1乃至9のいずれかに記載のモータ制御装置。
- 前記フェールセーフ手段は、前記オープンループ制御によるレンジ切換中にエンジントルクを抑制するトルク抑制制御を実行することを特徴とする請求項10に記載のモータ制御装置。
Priority Applications (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002207557A JP3849930B2 (ja) | 2002-07-16 | 2002-07-16 | モータ制御装置 |
US10/448,409 US7312595B2 (en) | 2002-07-09 | 2003-05-30 | Motor control apparatus |
DE10362132.6A DE10362132B4 (de) | 2002-07-09 | 2003-07-08 | Motorsteuerungsgerät |
DE10330809.1A DE10330809B8 (de) | 2002-07-09 | 2003-07-08 | Motorsteuerungsgerät |
US11/320,962 US7667427B2 (en) | 2002-07-09 | 2005-12-30 | Motor control apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002207557A JP3849930B2 (ja) | 2002-07-16 | 2002-07-16 | モータ制御装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2004056855A JP2004056855A (ja) | 2004-02-19 |
JP3849930B2 true JP3849930B2 (ja) | 2006-11-22 |
Family
ID=31931971
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002207557A Expired - Fee Related JP3849930B2 (ja) | 2002-07-09 | 2002-07-16 | モータ制御装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3849930B2 (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013096436A (ja) * | 2011-10-28 | 2013-05-20 | Denso Corp | シフトバイワイヤシステム |
WO2019088245A1 (ja) * | 2017-11-06 | 2019-05-09 | 株式会社デンソー | シフトレンジ制御装置 |
WO2019088244A1 (ja) * | 2017-11-06 | 2019-05-09 | 株式会社デンソー | シフトレンジ制御装置 |
DE112019005115T5 (de) | 2018-10-10 | 2021-07-29 | Denso Corporation | Schaltbereichssteuerungsvorrichtung |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4367620B2 (ja) | 2003-12-22 | 2009-11-18 | 株式会社デンソー | モータ駆動システムの異常診断装置 |
JP2008296709A (ja) * | 2007-05-30 | 2008-12-11 | Hitachi Ltd | 車両の制御装置 |
JP5454962B2 (ja) | 2011-12-05 | 2014-03-26 | 株式会社デンソー | モータ制御装置 |
JP5303050B1 (ja) * | 2012-03-30 | 2013-10-02 | 三菱電機株式会社 | 電動過給機の保護制御装置 |
JP2014050136A (ja) * | 2012-08-29 | 2014-03-17 | Toshiba Schneider Inverter Corp | インバータ装置 |
JP6565841B2 (ja) * | 2016-09-09 | 2019-08-28 | 株式会社デンソー | シフトレンジ制御装置 |
JP7428527B2 (ja) * | 2020-02-04 | 2024-02-06 | ニデックインスツルメンツ株式会社 | モータ制御方法、モータ駆動装置、産業用ロボットの制御方法、及び産業用ロボット |
CN113057619B (zh) * | 2021-03-03 | 2024-04-26 | 上海联影医疗科技股份有限公司 | 病床运动控制的方法 |
CN115503683B (zh) * | 2022-11-18 | 2023-02-28 | 华侨大学 | 混合动力摩托车及其停机方法、装置 |
-
2002
- 2002-07-16 JP JP2002207557A patent/JP3849930B2/ja not_active Expired - Fee Related
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013096436A (ja) * | 2011-10-28 | 2013-05-20 | Denso Corp | シフトバイワイヤシステム |
WO2019088245A1 (ja) * | 2017-11-06 | 2019-05-09 | 株式会社デンソー | シフトレンジ制御装置 |
WO2019088244A1 (ja) * | 2017-11-06 | 2019-05-09 | 株式会社デンソー | シフトレンジ制御装置 |
JP2019088075A (ja) * | 2017-11-06 | 2019-06-06 | 株式会社デンソー | シフトレンジ制御装置 |
JP2019088074A (ja) * | 2017-11-06 | 2019-06-06 | 株式会社デンソー | シフトレンジ制御装置 |
DE112018005273T5 (de) | 2017-11-06 | 2020-06-25 | Denso Corporation | Schaltbereichssteuervorrichtung |
DE112018005276T5 (de) | 2017-11-06 | 2020-06-25 | Denso Corporation | Schaltbereichssteuervorrichtung |
JP7009936B2 (ja) | 2017-11-06 | 2022-01-26 | 株式会社デンソー | シフトレンジ制御装置 |
DE112019005115T5 (de) | 2018-10-10 | 2021-07-29 | Denso Corporation | Schaltbereichssteuerungsvorrichtung |
Also Published As
Publication number | Publication date |
---|---|
JP2004056855A (ja) | 2004-02-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7667427B2 (en) | Motor control apparatus | |
US7084597B2 (en) | Motor control apparatus | |
JP3886042B2 (ja) | モータ制御装置 | |
US7161314B2 (en) | Motor control apparatus having current supply phase correction | |
JP5454962B2 (ja) | モータ制御装置 | |
JP3849930B2 (ja) | モータ制御装置 | |
JP3849864B2 (ja) | モータ制御装置 | |
JP3800529B2 (ja) | モータ制御装置 | |
JP3849931B2 (ja) | モータ制御装置 | |
JP2004023890A (ja) | モータ制御装置 | |
JP3947922B2 (ja) | モータ制御装置 | |
JP4189953B2 (ja) | 位置切換制御装置 | |
JP3888940B2 (ja) | モータ制御装置 | |
JP4082164B2 (ja) | モータ制御装置 | |
JP2017161455A (ja) | 制御装置 | |
JP3871130B2 (ja) | モータ制御装置 | |
JP3800532B2 (ja) | モータ制御装置 | |
JP3888278B2 (ja) | モータ制御装置 | |
JP3849627B2 (ja) | モータ制御装置 | |
JP2004023889A (ja) | モータ制御装置 | |
JP4748611B2 (ja) | 位置切換制御装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040311 |
|
A711 | Notification of change in applicant |
Free format text: JAPANESE INTERMEDIATE CODE: A711 Effective date: 20040311 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20040311 |
|
RD02 | Notification of acceptance of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7422 Effective date: 20040408 |
|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20041216 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20060712 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20060824 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20060824 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 3849930 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100908 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100908 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110908 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110908 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120908 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120908 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130908 Year of fee payment: 7 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
LAPS | Cancellation because of no payment of annual fees |