(57)【要約】【課題】モータのＦ／Ｂ制御中にＦ／Ｂ制御状態が一時的に異常になっても、可能な限りロータを目標位置まで回転させることができるようにする。【解決手段】エンコーダカウント値に基づいてモータをフィードバック制御（Ｆ／Ｂ制御）する途中で、モータの異常停止又はエンコーダカウント値のカウント動作の異常が発生したした時点で、Ｆ／Ｂ制御からオープンループ制御に切り換える。オープンループ制御中は、エンコーダカウント値の情報をフィードバックせずにモータの通電相を順次切り換えてモータを回転駆動すると共に、通電相を切り換える毎に位置カウント値Ｎｃｎｔｏｐをカウントアップ（又はカウントダウン）して、この位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔに到達した時点で、ロータが目標位置に到達したと判断してオープンループ制御を終了し、Ｆ／Ｂ制御に復帰する。【選択図】　図４７
2004048837.tif 000002
【特許請求の範囲】
【請求項１】
制御対象を回転駆動するモータのロータの回転に同期してパルス信号を出力するエンコーダと、このエンコーダのパルス信号のカウント値（以下「エンコーダカウント値」という）に基づいて前記ロータの回転位置を検出して前記モータの通電相を順次切り換えることで前記ロータを目標位置まで回転駆動するフィードバック制御（以下「Ｆ／Ｂ制御」と表記する）を実行する制御手段とを備えたモータ制御装置において、
前記モータのＦ／Ｂ制御状態の異常の有無を監視する異常監視手段を備え、
前記制御手段は、前記異常監視手段により前記Ｆ／Ｂ制御状態の異常が検出されたときに、前記Ｆ／Ｂ制御からオープンループ制御に切り換えて、前記エンコーダカウント値の情報をフィードバックせずに前記モータの通電相を順次切り換えて前記ロータを回転駆動することを特徴とするモータ制御装置。
【請求項２】
前記異常監視手段は、前記Ｆ／Ｂ制御中に前記エンコーダのパルス信号の出力間隔又は前記ロータの回転速度を監視して前記Ｆ／Ｂ制御状態の異常の有無を監視することを特徴とする請求項１に記載のモータ制御装置。
【請求項３】
前記エンコーダは、前記ロータの回転に同期して所定の位相差を有するＡ相信号とＢ相信号を出力し、
前記制御手段は、前記Ｆ／Ｂ制御中に前記Ａ相信号及び前記Ｂ相信号をカウントしてエンコーダカウント値を更新する際に、前記Ａ相信号と前記Ｂ相信号の発生順序によって前記ロータの回転方向を判定して、その回転方向に応じて前記エンコーダカウント値をカウントアップ又はカウントダウンし、そのエンコーダカウント値と前記ロータの回転方向に応じて通電相を選択して通電し、
前記異常監視手段は、前記Ｆ／Ｂ制御中に前記Ａ相信号と前記Ｂ相信号とを個別にカウントし、前記Ａ相信号のカウント値と前記Ｂ相信号のカウント値とを比較して前記Ｆ／Ｂ制御状態の異常の有無を監視することを特徴とする請求項１又は２に記載のモータ制御装置。
【請求項４】
前記異常監視手段は、前記Ｆ／Ｂ制御中に前記ロータの回転方向を監視し、該ロータの回転方向が前記目標位置へ向かう回転方向から逆転したか否かで前記Ｆ／Ｂ制御状態の異常の有無を監視することを特徴とする請求項１乃至３のいずれかに記載のモータ制御装置。
【請求項５】
前記制御手段は、電源投入後の初期駆動時に前記モータの通電相の切り換えを所定のタイムスケジュールで実施させて、前記ロータの回転位置と通電相との対応関係を学習する手段と、前記ロータを前記制御対象の可動範囲の少なくとも一方の限界位置に突き当たるまで回転させてその限界位置を学習（以下「突き当て制御」と表記する）する手段とを備え、前記オープンループ制御からＦ／Ｂ制御に復帰させるときにも、前記初期駆動と前記突き当て制御を再実行することを特徴とする請求項１乃至４のいずれかに記載のモータ制御装置。
【請求項６】
前記異常監視手段は、前記突き当て制御中に前記Ｆ／Ｂ制御状態の異常の有無の監視を中止することを特徴とする請求項５に記載のモータ制御装置。
【請求項７】
前記制御手段は、前記Ｆ／Ｂ制御状態の異常が検出されたとき、前記オープンループ制御中の前記通電相の切換回数をカウントしてそのカウント値に基づいて前記ロータが前記目標位置に到達したと判断したときに前記Ｆ／Ｂ制御に復帰することを特徴とする請求項１乃至６のいずれかに記載のモータ制御装置。
【請求項８】
前記異常監視手段は、前記オープンループ制御からＦ／Ｂ制御に復帰しても、再び前記Ｆ／Ｂ制御状態の異常が検出されて前記オープンループ制御に切り換えられるという状態が所定回数続いたときに、最終的に異常の判定を確定し、以後、前記Ｆ／Ｂ制御に復帰しないことを特徴とする請求項７に記載のモータ制御装置。
【請求項９】
前記モータは、スイッチトリラクタンスモータであることを特徴とする請求項１乃至８のいずれかに記載のモータ制御装置。
【請求項１０】
前記制御対象は、車両のパーキングレンジと他のレンジとを切り換えるレンジ切換装置であることを特徴とする請求項１乃至９のいずれかに記載のモータ制御装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、エンコーダのパルス信号のカウント値に基づいてロータの回転位置を検出してモータの通電相を順次切り換えることでロータを目標位置まで回転駆動するモータ制御装置に関するものである。
【０００２】
【従来の技術】
近年、構造が簡単で安価なモータとして需要が増加しているスイッチトリラクタンスモータ等のブラシレス型のモータは、ロータの回転に同期してパルス信号を出力するエンコーダを搭載し、このエンコーダのパルス信号をカウントして、そのエンコーダカウント値に基づいてロータの回転位置を検出して通電相を順次切り換えることでロータを回転駆動するようにしたものがある。このようなエンコーダ付きのモータは、起動後のエンコーダカウント値に基づいてロータの回転位置を検出することができるため、フィードバック制御系（閉ループ制御系）によりロータを目標位置まで回転させる位置切換制御（位置決め制御）を行う各種の位置切換装置の駆動源として用いられている。
【０００３】
【発明が解決しようとする課題】
ところで、エンコーダカウント値に基づいてロータを目標位置まで回転させるフィードバック制御（以下「Ｆ／Ｂ制御」と表記する）中に、例えば、エンコーダのパルス信号が何等かの原因で一時的に欠けたり、エンコーダの信号ラインに重畳したノイズパルスが正規のパルス信号と誤認されたりすると、通電相（エンコーダカウント値）とロータの回転位相との同期が取れなくなって、ロータを正常に駆動できなくなってしまい、それによって、ロータが停止したり、逆回転することがあり、Ｆ／Ｂ制御を正常に続けられない状態になって制御不能に陥ることがある。
【０００４】
本発明はこのような事情を考慮してなされたものであり、従ってその目的は、Ｆ／Ｂ制御中に、何等かの原因でＦ／Ｂ制御状態が一時的に異常になっても、可能な限り、ロータを目標位置まで回転させることができ、モータ制御の信頼性を向上させることができるモータ制御装置を提供することにある。
【０００５】
【課題を解決するための手段】
上記目的を達成するために、本発明の請求項１のモータ制御装置は、Ｆ／Ｂ制御中にＦ／Ｂ制御状態の異常の有無を異常監視手段により監視し、その結果、Ｆ／Ｂ制御状態の異常が検出されたときに、Ｆ／Ｂ制御からオープンループ制御に切り換えて、エンコーダカウント値の情報をフィードバックせずにモータの通電相を順次切り換えてロータを回転駆動するようにしたものである。
【０００６】
Ｆ／Ｂ制御中に、例えばエンコーダのパルス抜けやノイズによりエンコーダカウント値が異常になったりすると、通電相（エンコーダカウント値）とロータの回転位相との同期が取れなくなって、Ｆ／Ｂ制御状態（ロータの回転状態）が異常になるが、本発明では、この異常が異常監視手段により検出されて、Ｆ／Ｂ制御からオープンループ制御に切り換えられる。その結果、本発明では、Ｆ／Ｂ制御中に、エンコーダカウント値の異常等が発生してＦ／Ｂ制御状態（ロータの回転状態）が一時的に異常になっても、オープンループ制御によりロータを目標位置まで回転させることができ、モータ制御の信頼性を向上させることができる。
【０００７】
この場合、請求項２のように、Ｆ／Ｂ制御中に、エンコーダのパルス信号の出力間隔を監視してＦ／Ｂ制御状態の異常の有無を監視するようにしても良い。Ｆ／Ｂ制御状態が異常になると、ロータ回転速度が遅くなる。従って、Ｆ／Ｂ制御中に、エンコーダのパルス信号の出力間隔を監視すれば、迅速にＦ／Ｂ制御状態の異常の有無を判定することができる。
【０００８】
また、請求項３のように、ロータの回転に同期してエンコーダから所定の位相差（一般的には電気角で９０°の位相差）を有するＡ相信号とＢ相信号を出力する場合は、Ｆ／Ｂ制御中に前記Ａ相信号及び前記Ｂ相信号をカウントしてエンコーダカウント値を更新する際に、前記Ａ相信号と前記Ｂ相信号の発生順序によってロータの回転方向を判定して、その回転方向に応じて前記エンコーダカウント値をカウントアップ又はカウントダウンし、そのエンコーダカウント値と前記ロータの回転方向に応じて通電相を選択して通電するようにすると良い。このようにすれば、ロータが正回転／逆回転のいずれの方向に回転しても、エンコーダカウント値とロータの回転位置との対応関係を維持することができて、正回転／逆回転のいずれの回転方向でも、エンコーダカウント値に基づいて正しい通電相を選択することができる。
【０００９】
この場合、Ｆ／Ｂ制御中に、Ａ相信号とＢ相信号とを個別にカウントし、Ａ相信号のカウント値とＢ相信号のカウント値とを比較してＦ／Ｂ制御状態の異常の有無を監視するようにしても良い。Ｆ／Ｂ制御中にＡ相信号とＢ相信号が正常に出力されていれば、Ａ相信号のカウント値とＢ相信号のカウント値との差が０又は±１となるため、両信号のカウント値の差が大きくなれば、いずれか一方の信号の抜けやノイズパルスの混入が考えられる。このような状態になると、エンコーダカウント値とロータの回転位置との同期が取れなくなって、Ｆ／Ｂ制御状態が異常になるため、両信号のカウント値の差によってＦ／Ｂ制御状態の異常の有無を判定することができる。
【００１０】
また、請求項４のように、Ｆ／Ｂ制御中にロータの回転方向を監視し、該ロータの回転方向が目標位置へ向かう回転方向から逆転したか否かでＦ／Ｂ制御状態の異常の有無を監視するようにしても良い。このようにすれば、Ｆ／Ｂ制御中にロータが目標位置の方向とは逆方向に回転することを防止できる。
【００１１】
ところで、この種のエンコーダ付きのモータは、起動後のエンコーダカウント値に基づいてロータの起動位置からの回転量（回転角度）を検出できるだけであるので、電源投入後に、何等かの方法で、ロータの絶対的な回転位置を検出して、ロータの回転位置と通電相との対応関係をとらないと、モータを正常に駆動することができない。
【００１２】
そこで、請求項５のように、電源投入後の初期駆動時に、モータの通電相の切り換えを所定のタイムスケジュールで実施させて、ロータの回転位置と通電相との対応関係を学習するようにしても良い。このように、初期駆動時に通電相の切り換えを一巡させれば、いずれかの通電相で必ずロータの回転位置と通電相とが一致して、それ以後、通電相の切り換えに同期してロータが回転して、このロータの回転に同期してエンコーダからパルス信号が出力されるようになる。従って、初期駆動終了時のエンコーダカウント値を見れば、ロータが実際に通電相の切り換えに同期して回転した角度（回転量）が分かり、それによって、ロータの回転位置と通電相との対応関係が分かるため、この対応関係を学習することで、その後の通常駆動時に、正しい通電相を選択してモータを正常に回転させることができる。
【００１３】
ところで、このようなエンコーダ付きのモータの回転量（回転角度）は、回転伝達系を介して制御対象（位置切換装置）の操作量に変換されるが、回転伝達系を構成する部品間には、遊び（ガタ）が存在するため、仮に、エンコーダカウント値に基づいてロータの回転量を正確に制御できたとしても、制御対象の操作量には回転伝達系の遊び（ガタ）分の誤差が生じてしまい、制御対象の操作量を精度良く制御することができない。
【００１４】
そこで、請求項５のように、モータの回転量を制御対象の操作量に変換する回転伝達系の遊び量を学習する際に、ロータを制御対象の可動範囲の限界位置に突き当たるまで回転させる突き当て制御を実行して、その限界位置を学習するようにしても良い。
【００１５】
ところで、エンコーダのパルス抜け又はノイズがあると、エンコーダカウント値が異常となり、エンコーダカウント値とロータの回転位置（制御対象の操作量）との関係又はエンコーダカウント値と通電相との関係がずれる可能性がある。
【００１６】
そこで、請求項５のように、オープンループ制御からＦ／Ｂ制御に復帰させるときに、前述した初期駆動と突き当て制御を再実行するようにすると良い。このようにすれば、オープンループ制御中にエンコーダカウント値とロータの回転位置（制御対象の操作量）との関係又はエンコーダカウント値と通電相との関係がずれても、そのずれを初期駆動と突き当て制御によって精度良く補正することができる。
【００１７】
この場合、請求項６のように、突き当て制御中にＦ／Ｂ制御状態の異常の有無の監視を中止するようにした方が良い。これは、突き当て制御により限界位置で回転停止したのか、Ｆ／Ｂ制御の異常により回転停止したのか判別できないためである。従って、突き当て制御中にＦ／Ｂ制御状態の異常の有無の監視を中止するようにすれば、限界位置で回転停止した状態を誤判定することを未然に防止できる。
【００１８】
また、請求項７のように、Ｆ／Ｂ制御状態の異常が検出されたとき、オープンループ制御中の通電相の切換回数をカウントしてそのカウント値に基づいてロータが目標位置に到達したと判断したときにＦ／Ｂ制御に復帰するようにすると良い。このようにすれば、オープンループ制御によりロータを目標位置まで回転させてからＦ／Ｂ制御に復帰させることができる。
【００１９】
また、請求項８のように、オープンループ制御からＦ／Ｂ制御に復帰しても、再びＦ／Ｂ制御状態の異常が検出されてオープンループ制御に切り換えられるという状態が所定回数続いたときに、最終的に異常の判定を確定し、以後、Ｆ／Ｂ制御に復帰しないようにしても良い。このようにすれば、Ｆ／Ｂ制御系が正常に機能しなくなったときに、Ｆ／Ｂ制御とオープンループ制御とが頻繁に切り換えられるという事態を回避することができる。
【００２０】
また、請求項９のように、モータとしてスイッチトリラクタンスモータを使用するようにしても良い。スイッチトリラクタンスモータは、永久磁石が不要で構造が簡単であるため、安価であり、温度環境等に対する耐久性・信頼性も高いという利点がある。
【００２１】
以上説明した請求項１〜９に係る発明は、スイッチトリラクタンスモータ等のブラシレス型のモータを駆動源とする各種の位置切換装置に適用でき、例えば、請求項１０のように、車両の自動変速機のレンジを切り換えるレンジ切換機構を駆動するモータの制御装置に適用しても良い。これにより、信頼性の高いモータ駆動式のレンジ切換装置を構成することができる。
【００２２】
【発明の実施の形態】
以下、本発明を車両のレンジ切換装置に適用した一実施形態を図面に基づいて説明する。
まず、図１に基づいてレンジ切換機構１１の構成を説明する。レンジ切換機構１１の駆動源となるモータ１２は、例えばスイッチトリラクタンスモータにより構成され、減速機構２６（図４参照）を内蔵し、その出力軸１３の回転位置を検出する出力軸センサ１４が設けられている。この出力軸１３には、ディテントレバー１５が固定されている。
【００２３】
また、ディテントレバー１５にはＬ字形のパーキングロッド１８が固定され、このパーキングロッド１８の先端部に設けられた円錐体１９がロックレバー２１に当接している。このロックレバー２１は、円錐体１９の位置に応じて軸２２を中心にして上下動してパーキングギヤ２０をロック／ロック解除するようになっている。パーキングギヤ２０は、自動変速機２７の出力軸に設けられ、このパーキングギヤ２０がロックレバー２１によってロックされると、車両の駆動輪が回り止めされた状態（パーキング状態）に保持される。
【００２４】
一方、ディテントレバー１５をパーキングレンジ（以下「Ｐレンジ」と表記する）と他のレンジ（以下「ＮｏｔＰレンジ」と表記する）に保持するためのディテントバネ２３が支持ベース１７に固定され、このディテントバネ２３の先端に設けられた係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４に嵌まり込んだときに、ディテントレバー１５がＰレンジの位置に保持され、該ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５に嵌まり込んだときに、ディテントレバー１５がＮｏｔＰレンジの位置に保持されるようになっている。
【００２５】
Ｐレンジでは、パーキングロッド１８がロックレバー２１に接近する方向に移動して、円錐体１９の太い部分がロックレバー２１を押し上げてロックレバー２１の凸部２１ａがパーキングギヤ２０に嵌まり込んでパーキングギヤ２０をロックした状態となり、それによって、自動変速機２７の出力軸（駆動輪）がロックされた状態（パーキング状態）に保持される。
【００２６】
一方、ＮｏｔＰレンジでは、パーキングロッド１８がロックレバー２１から離れる方向に移動して、円錐体１９の太い部分がロックレバー２１から抜け出てロックレバー２１が下降し、それによって、ロックレバー２１の凸部２１ａがパーキングギヤ２０から外れてパーキングギヤ２０のロックが解除され、自動変速機２７の出力軸が回転可能な状態（走行可能な状態）に保持される。
【００２７】
尚、前述した出力軸センサ１４は、モータ１２の減速機構２６の出力軸１３の回転角度に応じた電圧を出力する回転センサ（例えばポテンショメータ）によって構成され、その出力電圧によって現在のレンジがＰレンジとＮｏｔＰレンジのいずれであるかを確認できるようになっている。
【００２８】
次に、図２に基づいてモータ１２の構成を説明する。本実施形態では、モータ１２として、スイッチトリラクタンスモータ（以下「ＳＲモータ」と表記する）が用いられている。このＳＲモータ１２は、ステータ３１とロータ３２が共に突極構造を持つモータで、永久磁石が不要で構造が簡単であるという利点がある。円筒状のステータ３１の内周部には、例えば１２個の突極３１ａが等間隔に形成され、これに対して、ロータ３２の外周部には、例えば８個の突極３２ａが等間隔に形成され、ロータ３２の回転に伴い、ロータ３２の各突極３２ａがステータ３１の各突極３１ａと微小ギャップを介して順番に対向するようになっている。ステータ３１の１２個の突極３１ａには、Ｕ相、Ｖ相、Ｗ相の合計６個の巻線３３と、Ｕ’相、Ｖ’相、Ｗ’相の合計６個の巻線３４が順番に巻回されている。尚、ステータ３１とロータ３２の突極３１ａ，３２ａの数は適宜変更しても良いことは言うまでもない。
【００２９】
本実施形態の巻線３３，３４の巻回順序は、ステータ３１の１２個の突極３１ａに対して、例えば、Ｖ相→Ｗ相→Ｕ相→Ｖ相→Ｗ相→Ｕ相→Ｖ’相→Ｗ’相→Ｕ’相→Ｖ’相→Ｗ’相→Ｕ’相の順序で巻回されている。図３に示すように、Ｕ相、Ｖ相、Ｗ相の合計６個の巻線３３と、Ｕ’相、Ｖ’相、Ｗ’相の合計６個の巻線３４は、２系統のモータ励磁部３５，３６を構成するように結線されている。一方のモータ励磁部３５は、Ｕ相、Ｖ相、Ｗ相の合計６個の巻線３３をＹ結線して構成され（同じ相の２個の巻線３３はそれぞれ直列に接続されている）、他方のモータ励磁部３６は、Ｕ’相、Ｖ’相、Ｗ’相の合計６個の巻線３４をＹ結線して構成されている（同じ相の２個の巻線３４はそれぞれ直列に接続されている）。２つのモータ励磁部３５，３６は、Ｕ相とＵ’相が同時に通電され、Ｖ相とＶ’相が同時に通電され、Ｗ相とＷ’相が同時に通電される。
【００３０】
これら２つのモータ励磁部３５，３６は、車両に搭載されたバッテリ４０を電源として、それぞれ別個のモータドライバ３７，３８によって駆動される。このように、モータ励磁部３５，３６とモータドライバ３７，３８をそれぞれ２系統ずつ設けることで、一方の系統が故障しても、他方の系統でＳＲモータ１２を回転させることができるようになっている。図３に示すモータドライバ３７，３８の回路構成例では、各相毎にトランジスタ等のスイッチング素子３９を１個ずつ設けたユニポーラ駆動方式の回路構成としているが、各相毎にスイッチング素子を２個ずつ設けたバイポーラ駆動方式の回路構成を採用しても良い。尚、本発明は、モータ励磁部とモータドライバをそれぞれ１系統ずつ設けた構成としても良いことは言うまでもない。
【００３１】
各モータドライバ３７，３８の各スイッチング素子３９のオン／オフは、ＥＣＵ４１（制御手段）によって制御される。図４に示すように、このＥＣＵ４１と各モータドライバ３７，３８は、レンジ切換制御装置４２に搭載され、このレンジ切換制御装置４２には、Ｐレンジへの切換操作を行うＰレンジスイッチ４３と、ＮｏｔＰレンジへの切換操作を行うＮｏｔＰレンジスイッチ４４の操作信号が入力される。Ｐレンジスイッチ４３又はＮｏｔＰレンジスイッチ４４の操作により選択されたレンジは、インストルメントパネル（図示せず）に設けられたレンジ表示部４５に表示される。
【００３２】
ＳＲモータ１２には、ロータ３２の回転位置を検出するためのエンコーダ４６が設けられている。このエンコーダ４６は、例えば磁気式のロータリエンコーダにより構成されており、その具体的な構成は、図５及び図６に示すように、Ｎ極とＳ極が円周方向に交互に等ピッチで着磁された円環状のロータリマグネット４７がロータ３２の側面に同軸状に固定され、このロータリマグネット４７に対向する位置に、３個のホールＩＣ等の磁気検出素子４８，４９，５０が配置された構成となっている。本実施形態では、ロータリマグネット４７のＮ極とＳ極の着磁ピッチが７．５°に設定されている。このロータリマグネット４７の着磁ピッチ（７．５°）は、ＳＲモータ１２の励磁１回当たりのロータ３２の回転角度と同じに設定されている。後述するように、１−２相励磁方式でＳＲモータ１２の通電相の切り換えを６回行うと、全ての通電相の切り換えが一巡してロータ３２とロータリマグネット４７が一体的に７．５°×６＝４５°回転する。このロータリマグネット４７の４５°の回転角度範囲に存在するＮ極とＳ極の数は、合計６極となっている。
【００３３】
更に、ロータ３２の基準回転位置に相当する位置のＮ極（Ｎ’）とその両側のＳ極（Ｓ’）がそれ以外の磁極よりも径方向の幅が広くなるように形成されている。尚、本実施形態では、ＳＲモータ１２の通電相の切り換えが一巡する間にロータ３２とロータリマグネット４７が一体的に４５°回転することを考慮して、ロータ３２の基準回転位置に相当する幅広な着磁部分（Ｎ’）が４５°ピッチで形成されており、従って、ロータリマグネット４７全体として、基準回転位置に相当する幅広な着磁部分（Ｎ’）が合計８個形成されている。尚、基準回転位置に相当する幅広な着磁部分（Ｎ’）は、ロータリマグネット４７全体として、１個のみ形成した構成としても良い。
【００３４】
このロータリマグネット４７に対して３個の磁気検出素子４８，４９，５０が次のような位置関係で配置されている。Ａ相信号を出力する磁気検出素子４８とＢ相信号を出力する磁気検出素子４９は、ロータリマグネット４７の幅狭な着磁部分（Ｎ，Ｓ）と幅広な着磁部分（Ｎ’，Ｓ’）の両方に対向し得る位置の同一円周上に配置されている。一方、Ｚ相信号を出力する磁気検出素子５０は、ロータリマグネット４７の幅狭な着磁部分（Ｎ，Ｓ）よりも径方向外側又は内側の位置で、且つ、幅広な着磁部分（Ｎ’，Ｓ’）のみに対向し得る位置に配置されている。Ａ相信号とＢ相信号を出力する２個の磁気検出素子４８，４９の間隔は、図７に示すように、Ａ相信号とＢ相信号の位相差が、電気角で９０°（機械角で３．７５°）となるように設定されている。ここで、“電気角”はＡ・Ｂ相信号の発生周期を１周期（３６０°）とした場合の角度で、“機械角”は機械的な角度（ロータ３２の１回転を３６０°とした場合の角度）であり、Ａ相信号の立ち下がり（立ち上がり）からＢ相信号の立ち下がり（立ち上がり）までにロータ３２が回転する角度がＡ相信号とＢ相信号の位相差の機械角に相当する。また、Ｚ相信号を出力する磁気検出素子５０は、Ｚ相信号とＢ相信号（又はＡ相信号）との位相差が０となるように配置されている。
【００３５】
各磁気検出素子４８，４９，５０の出力は、Ｎ極（Ｎ’極）と対向したときにハイレベル“１”となり、Ｓ極（Ｓ’極）と対向したときにローレベル“０”となる。尚、Ｚ相信号用の磁気検出素子５０の出力は、ロータ３２の基準回転位置に相当する幅広なＮ’極に対向する毎にハイレベル“１”となり、それ以外の位置では、ローレベル“０”となる。
【００３６】
本実施形態では、ＥＣＵ４１が後述するエンコーダカウンタルーチンによってＡ相信号とＢ相信号の立ち上がり／立ち下がりの両方のエッジをカウントして、そのエンコーダカウント値に応じてＳＲモータ１２の通電相を切り換えることでロータ３２を回転駆動する。この際、Ａ相信号とＢ相信号の発生順序によってロータ３２の回転方向を判定し、正回転（Ｐレンジ→ＮｏｔＰレンジの回転方向）ではエンコーダカウント値をカウントアップし、逆回転（ＮｏｔＰレンジ→Ｐレンジの回転方向）ではエンコーダカウント値をカウントダウンする。これにより、ロータ３２が正回転／逆回転のいずれの方向に回転しても、エンコーダカウント値とロータ３２の回転位置との対応関係が維持されるため、正回転／逆回転のいずれの回転方向でも、エンコーダカウント値によってロータ３２の回転位置（回転角度）を検出して、その回転位置に対応した相の巻線３３，３４に通電してロータ３２を回転駆動する。
【００３７】
図７は、ロータ３２を逆回転方向（ＮｏｔＰレンジ→Ｐレンジの回転方向）に回転させたときのエンコーダ４６の出力波形と通電相の切換パターンを示している。逆回転方向（ＮｏｔＰレンジ→Ｐレンジの回転方向）と正回転方向（Ｐレンジ→ＮｏｔＰレンジの回転方向）のいずれの場合も、ロータ３２が７．５°回転する毎に１相通電と２相通電とを交互に切り換えるようになっており、ロータ３２が４５°回転する間に、例えば、Ｕ相通電→ＵＷ相通電→Ｗ相通電→ＶＷ相通電→Ｖ相通電→ＵＶ相通電の順序で通電相の切り換えを一巡するようになっている。そして、この通電相の切り換え毎に、ロータ３２が７．５°ずつ回転して、Ａ相、Ｂ相信号用の磁気検出素子４８，４９に対向するロータリマグネット４７の磁極がＮ極→Ｓ極（Ｎ’極→Ｓ’極）又はＳ極→Ｎ極（Ｓ’極→Ｎ’極）に変化してＡ相信号とＢ相信号のレベルが交互に反転し、それによって、ロータ３２が７．５°回転する毎に、エンコーダカウント値が２ずつカウントアップ（又はカウントダウン）する。また、通電相の切り換えが一巡してロータ３２が４５°回転する毎に、Ｚ相用の磁気検出素子５０がロータ３２の基準回転位置に相当する幅広なＮ’極に対向して、Ｚ相信号がハイレベル“１”となる。尚、本明細書では、Ａ相、Ｂ相、Ｚ相信号がハイレベル“１”となることを、Ａ相、Ｂ相、Ｚ相信号が出力されると言う場合がある。
【００３８】
ところで、エンコーダカウント値は、ＥＣＵ４１のＲＡＭに記憶されるため、ＥＣＵ４１の電源がオフされると、エンコーダカウント値の記憶が消えてしまう。そのため、ＥＣＵ４１の電源投入直後のエンコーダカウント値（０）は、実際のロータ３２の回転位置（通電相）に対応したものとならい。従って、エンコーダカウント値に応じて通電相を切り換えるためには、電源投入後にエンコーダカウント値と実際のロータ３２の回転位置とを対応させて、エンコーダカウント値と通電相とを対応させる必要がある。
【００３９】
そこで、本実施形態では、レンジ切換制御装置４２のＥＣＵ４１によって後述する図８及び図９に示す初期駆動ルーチンを実行することで、ＥＣＵ４１への電源投入後の初期駆動時に、ＳＲモータ１２の通電相の切り換えを所定のタイムスケジュールで一巡させてエンコーダ４６のＡ相信号及びＢ相信号のエッジをカウントし、初期駆動終了時のエンコーダカウント値とロータ３２の回転位置と通電相との対応関係を学習し、その後の通常駆動時に、エンコーダカウント値と初期駆動終了時の学習結果とに基づいて通電相を決定するようにしている。
【００４０】
この初期駆動時の学習は、具体的には次のようにして行われる。図１２に示すように、ＰレンジでＥＣＵ４１に電源が投入されたときに初期駆動を行う場合は、例えば、Ｗ相通電→ＵＷ相通電→Ｕ相通電→ＵＶ相通電→Ｖ相通電→ＶＷ相通電の順序で通電相の切り換えを所定のタイムスケジュールで一巡し、ロータ３２を正回転方向（Ｐレンジ→ＮｏｔＰレンジの回転方向）に駆動する。
【００４１】
一方、ＮｏｔＰレンジでＥＣＵ４１に電源が投入されたときに初期駆動を行う場合は、例えば、Ｖ相通電→ＵＶ相通電→Ｕ相通電→ＵＷ相通電→Ｗ相通電→ＶＷ相通電の順序で通電相の切り換えを所定のタイムスケジュールで一巡し、ロータ３２を逆回転方向（ＮｏｔＰレンジ→Ｐレンジの回転方向）に駆動する。
【００４２】
この初期駆動時には、１相通電の時間Ｔ１を２相通電の時間Ｔ２よりも短くし、例えばＴ１＝１０ｍｓ、Ｔ２＝１００ｍｓに設定する。初期駆動中にロータ３２の回転位置と通電相との同期がとれた後でも、トルクが小さい１相通電では、ロータ３２が振動するため、１相通電の時間Ｔ１を短くして、できるだけ速やかに次の２相通電に切り換えることで、ロータ３２の振動を速やかに停止させてエンコーダ４６の出力信号を安定させるようにしている。
【００４３】
このように、初期駆動時に通電相の切り換えを一巡させれば、初期駆動が終了するまでに、いずれかの通電相で必ずロータ３２の回転位置と通電相とが一致して、それ以後、通電相の切り換えに同期してロータ３２が回転して、このロータ３２の回転に同期してエンコーダ４６からＡ相信号及びＢ相信号が出力されるようになる。
【００４４】
この初期駆動中に、エンコーダ４６のＡ相信号及びＢ相信号の立ち上がり／立ち下がりの両方のエッジをカウントする。従って、初期駆動終了時のエンコーダカウント値を見れば、初期駆動が終了するまでにロータ３２が実際に通電相の切り換えに同期して回転した角度（回転量）が分かり、それによって、初期駆動終了時のエンコーダカウント値とロータ３２の回転位置と通電相との対応関係が分かる。
【００４５】
図１２の例では、初期駆動時に最初の通電相（Ｗ相）からロータ３２が回転し、通電相の切り換え毎にロータ３２が７．５°ずつ回転してエンコーダカウント値が２ずつカウントアップし、初期駆動終了時にエンコーダカウント値が１２となる。
【００４６】
これに対し、例えば、初めの３回の励磁（Ｗ相通電→ＵＷ相通電→Ｕ相通電）でロータ３２が回転しない場合、つまり４回目以降の励磁（ＵＶ相通電→Ｖ相通電→ＶＷ相通電）でロータ３２の回転位置と通電相とが同期してロータ３２が３回の励磁分だけ回転する場合は、初期駆動終了時までにロータ３２が７．５°×３＝２２．５°回転して、エンコーダカウント値が２×３＝６となる。従って、初期駆動終了時のエンコーダカウント値を見れば、初期駆動が終了するまでにロータ３２が実際に通電相の切り換えに同期して回転した角度（回転量）が判明する。
【００４７】
初期駆動の最後の通電相は、常にＶＷ相となるが、エンコーダカウント値は、必ずしも１２になるとは限らず、例えば８、或は４である場合もある。初期駆動終了後の通常駆動時には、エンコーダカウント値に基づいて通電相が決定されるため、初期駆動によるエンコーダカウント値のずれを修正しないと、通常駆動時に正しい通電相を選択することができない。
【００４８】
そこで、本実施形態では、初期駆動終了時のエンコーダカウント値を初期位置ずれ学習値として学習し、その後の通常駆動時にエンコーダカウント値を初期位置ずれ学習値で補正することで、初期駆動終了時のエンコーダカウント値と通電相（ロータ３２の回転位置）とのずれを補正して、通常駆動時に正しい通電相を選択できるようにしている。
【００４９】
初期駆動終了後は、図１２に示すように、後述するＦ／Ｂ制御開始位置停止保持処理により、初期駆動終了時の通電相（ＶＷ相）と同じ相に例えば１０ｍｓ通電してロータ３２の位置を初期駆動終了時の位置に保持し、その後、後述するフィードバック制御（以下「Ｆ／Ｂ制御」と表記する）により、その時点のエンコーダカウント値と初期位置ずれ学習値とに基づいて通電相を切り換えてロータ３２を目標位置Ａｃｎｔの方向へ回転させる。これにより、ロータ３２の回転位置（エンコーダカウント値）が目標位置Ａｃｎｔから例えば０．５°以内に到達した時点で、通電相の切り換えを終了してロータ３２を停止させ、その後は、後述する目標位置停止保持処理により、同じ相に通電し続けてロータ３２の停止状態を保持し、この保持状態を例えば５０ｍｓ継続する。この後、目標位置Ａｃｎｔが変化しなければ、通電を停止する。
【００５０】
また、初期駆動の途中で、Ｐレンジスイッチ４３又はＮｏｔＰレンジスイッチ４４が操作されてレンジ切換要求が発生した場合は、次の２相通電（２相通電の実行中にレンジ切換要求が発生したときはその２相通電）が終了してから通常駆動に移行すると共に、該２相通電終了時のエンコーダカウント値とロータ３２の回転位置と通電相との対応関係を学習し、その後の通常駆動時に、エンコーダカウント値と２相通電終了時の学習結果とに基づいて通電相を決定するようにしている。
【００５１】
２相通電では、トルクが大きいため、ロータ３２の位置が２相通電に対応する位置から多少ずれていたとしても、ロータ３２を２相通電に対応する位置まで回転させることができる。このため、初期駆動中に２相通電を１〜２回行うだけでロータ３２の回転位置と通電相との同期がとれる確率は高いものと思われる。従って、初期駆動の途中でレンジ切換要求が発生したときには、次の２相通電（又は現在の２相通電）が終了してから通常駆動に移行するようにすれば、初期駆動の途中で、エンコーダカウント値とロータ３２の回転位置と通電相との対応関係を学習してから、通常駆動に速やかに移行することができる。
【００５２】
例えば、図１３のタイムチャートに示すように、初期駆動の２回目の励磁（ＵＷ相通電）中に、ＰレンジからＮｏｔＰレンジへのレンジ切換要求が発生したときには、このＵＷ相通電で初期駆動を終了して通常駆動に移行すると共に、ＵＷ相通電終了時のエンコーダカウント値とロータ３２の回転位置と通電相との対応関係を学習する。本実施形態では、初期駆動の途中で通常駆動に移行する場合でも、その初期駆動を最後まで実行したと仮定して、本来の初期駆動終了時のエンコーダカウント値を推定し、その推定値を初期位置ずれ学習値とするようにしている。例えば、図１３に示すように、初期駆動をＷ相通電とＵＷ相通電の２回の励磁で終了する場合は、その後に予定されていた４回の励磁を行わずに初期駆動を終了するため、未終了の４回の励磁（Ｕ相通電→ＵＶ相通電→Ｖ相通電→ＶＷ相通電）を行ったものと仮定して、４回の励磁分の回転角度に相当するカウントアップ値（２×４＝８）をＵＷ相通電終了時のエンコーダカウント値に加算して初期位置ずれ学習値を求める。
【００５３】
ところで、従来のレンジ切換制御では、指令シフトレンジ（目標位置）がＰレンジからＮｏｔＰレンジ又はその反対方向に切り換えられる毎に、ロータ３２を回転駆動して、エンコーダカウント値に基づいてＳＲモータ１２の通電相を順次切り換えることでロータ３２を目標位置まで回転駆動するフィードバック制御（以下「Ｆ／Ｂ制御」と表記する）を実行した後に、ＳＲモータ１２への通電をオフするようにしている。
【００５４】
この場合、Ｆ／Ｂ制御終了後に、目標位置に対応する相の巻線に通電し続ければ、ロータ３２を目標位置で電磁力により保持し続けることができるが、この構成では、停止時間が長くなると、同じ相の巻線に連続して長い時間通電し続けることになるため、巻線が過熱して焼損するおそれがある。そのため、ロータ３２の停止中は、巻線への通電をオフして巻線の過熱・焼損を防止するようにしている。
【００５５】
しかし、ロータ３２の停止中に、通電をオフすると、ロータ３２を目標位置（Ｆ／Ｂ制御終了時の位置）に保持する電磁力が消滅するため、ロータ３２の位置が目標位置からずれる可能性がある。本実施形態では、ロータ３２を目標位置でディテントバネ２３のバネ力により保持する機械的な停止保持機構を設けているが、この場合でも、停止保持機構のガタや製造ばらつき等によりロータ３２の位置が目標位置からずれることがある。
【００５６】
また、従来のレンジ切換制御では、Ｆ／Ｂ制御開始時に前回のＦ／Ｂ制御終了時のエンコーダカウント値を用いて最初の通電相を決定し、更に、最初の通電相決定後、直ちにＦ／Ｂ制御を開始するようにしている。
【００５７】
従って、ロータ３２の位置が停止中にずれた場合、従来のレンジ切換制御では、実際に最初に通電すべき通電相とは異なる通電相からＦ／Ｂ制御を開始してしまうことになる。このため、Ｆ／Ｂ制御開始時に脱調が発生して起動に失敗したり、ロータ３２が目標位置とは反対方向に回転するなど、ロータ３２を正常に目標位置へ回転させることができなくなる可能性がある。
【００５８】
また、停止中のロータ３２のずれ量が小さく、ロータ３２の位置が前回のＦ／Ｂ制御終了時のエンコーダカウント値に相当する範囲内に収まっていた場合は、最初に通電すべき通電相は前回のＦ／Ｂ制御終了時の通電相となる。従って、この場合は、従来のレンジ切換制御でも、最初に通電すべき通電相に関しては問題ない。
【００５９】
しかしながら、Ｆ／Ｂ制御は、通電時のロータ３２の位置を基準にして行われるため、仮に、ロータ３２の位置ずれが前回のＦ／Ｂ制御終了時のエンコーダカウント値に相当する範囲内に収まっていたとしても、最初の通電相に通電を行ってから、ロータ３２の位置が通電時のロータ３２の位置に移動・保持される前にＦ／Ｂ制御が開始されると、Ｆ／Ｂ制御開始時に脱調が発生して起動に失敗する可能性がある。
【００６０】
この対策として、本実施形態では、図１８に示すように、ＳＲモータ１２の通電オフ状態からＦ／Ｂ制御を開始するときに、ロータ３２を現在の位置に２相通電で停止保持する処理（以下「Ｆ／Ｂ制御開始位置停止保持処理」という）を所定時間（例えば１０ｍｓ）だけ実行し、その後、Ｆ／Ｂ制御を実行してロータ３２を目標位置まで回転駆動するようにしている。
【００６１】
このようにすれば、仮に、ロータ３２の停止中にロータ３２の位置がずれても、Ｆ／Ｂ制御開始直前にＦ／Ｂ制御開始位置停止保持処理によってロータ３２の位置ずれを修正して、Ｆ／Ｂ制御開始時のロータ３２の位置を正確に位置決めすることができる。これにより、Ｆ／Ｂ制御開始時に最初の通電相からロータ３２の位置と通電相（エンコーダカウント値）とを確実に同期させることができて、Ｆ／Ｂ制御開始時の脱調やロータ３２が目標位置と反対方向に回転することを防止でき、安定したＦ／Ｂ制御を行ってロータ３２を確実に目標位置まで回転させることができて、安定性・信頼性の高いレンジ切換制御（位置決め制御）を行うことができる。
【００６２】
ところで、レンジ切換制御を高応答化するために、ロータ３２の回転速度を高速化して目標位置までの到達時間を短くするようにしている。このため、ロータ３２が目標位置に到達した直後は、ロータ３２が完全に停止せずにまだ振動した状態になっており、このような状態で通電をオフすると、慣性力によりロータ３２の停止位置が目標位置から大きくずれてしまう可能性がある。このようなＦ／Ｂ制御終了時のロータ３２の位置ずれが大きくなりすぎると、次のＦ／Ｂ制御開始直前にＦ／Ｂ制御開始位置停止保持処理を行っても、ロータ３２の位置ずれを修正することができなくなる可能性がある。
【００６３】
この対策として、本実施形態では、Ｆ／Ｂ制御終了後に、ロータ３２を当該Ｆ／Ｂ制御終了時の位置に２相通電で停止保持する処理（以下「目標位置停止保持処理」という）を所定時間（例えば５０ｍｓ）だけ実行した後、ＳＲモータ１２への通電をオフするようにしている。このようにすれば、ロータ３２が目標位置に到達した後、ロータ３２の振動が収まってから通電をオフすることができるので、慣性力によりロータ３２の停止位置が目標位置から大きくずれることを防止することができる。これにより、レンジ切換制御の安定性・信頼性を維持しながら、レンジ切換制御の高応答化の要求も満たすことができる。
【００６４】
更に、本実施形態では、Ｆ／Ｂ制御中に指令シフトレンジ（目標位置）が変更されてロータ３２の回転方向を反転させる必要が生じたときに、ロータ３２を反転位置で２相通電により停止保持する処理（以下「反転位置停止保持処理」という）を所定時間（例えば５０ｍｓ）だけ実行し、その後、Ｆ／Ｂ制御を再開してロータ３２を変更後の目標位置まで回転駆動するようにしている。このようにすれば、Ｆ／Ｂ制御中に指令シフトレンジ（目標位置）が変更されたときに、ロータ３２の反転位置を位置決めして反転動作を安定して行うことができ、反転位置がずれて脱調（通電相のずれ）が発生することを防止できて、ロータ３２を変更後の目標位置まで確実に回転駆動することができる。
【００６５】
また、本実施形態では、Ｆ／Ｂ制御中にエンコーダカウント値と目標位置に相当する目標カウント値との差が所定値（例えば通電相の位相進み分に相当するカウント値）以下になったときに、Ｆ／Ｂ制御を終了して目標位置停止保持処理に移行するようにしている。つまり、ロータ３２を回転させるためには、図１９に示すように、通電相の位相をロータ３２の実際の位置よりも例えば２〜４カウント分（ロータ回転角で３．７５°〜１５°）だけ進める必要があるため、Ｆ／Ｂ制御中にエンコーダカウント値と目標カウント値との差が例えば通電相の位相進み分に相当するカウント値になったときに、Ｆ／Ｂ制御を終了するようにすれば、Ｆ／Ｂ制御の最後の通電相がロータ３２を目標位置に停止保持する通電相と一致するため、目標位置停止保持処理移行後も、Ｆ／Ｂ制御の最後の通電相に引き続き通電することができ、Ｆ／Ｂ制御から目標位置停止保持処理への移行をスムーズに行うことができる。
【００６６】
ところで、ロータ３２を回転駆動するトルクを発生させるためには、ロータ３２の回転位相に対して通電相の位相を進める必要がある。Ｆ／Ｂ制御開始後に、ロータ３２の回転速度が上昇するのに伴って、エンコーダカウント値の変化速度が速くなって、通電相の切り換えタイミングが速くなるが、通電相の巻線３３，３４に通電を開始してから実際にトルクが発生するまでに、巻線３３，３４のインダクタンス分の遅れが生じるため、ロータ３２の回転速度が速くなると、通電相の巻線３３，３４に通電を開始してから実際にトルクを発生するまでの間に、ロータ３２がかなりの角度回転して、実際のロータ３２の回転位相に対して通電相のトルク発生タイミングが遅れた状態となる。このような状態になると、駆動トルクが低下してロータ３２の回転速度が抑えられてしまい、レンジ切換速度の高速化（ロータの回転速度の高速化）の要求を満たすことができない。
【００６７】
この対策として、予め、通電相の位相進み量を大きく設定しておくことが考えられるが、Ｆ／Ｂ制御開始時（起動時）に、通電相の位相進み量が大きいと、起動トルクが小さくなってＳＲモータ１２の起動が不安定になったり、起動に失敗するおそれがある。
【００６８】
また、予め、通電相の位相進み量を大きく設定してロータ３２の回転速度を高速化すると、Ｆ／Ｂ制御終了時にロータ３２が慣性により目標位置を越えてオーバーシュートしやすくなり、ロータ３２を正確に目標位置で停止させることが難しくなる。
【００６９】
そこで、本実施形態では、Ｆ／Ｂ制御中に、ロータ３２の回転速度に応じて該ロータ３２の回転位相に対する通電相の位相進み量を補正すると共に、ロータ３２の回転速度を減速させる必要が生じたときに（例えばロータ３２が目標位置に近付いたときに）、通電相の位相進み量を小さくする方向に補正するようにしている。具体的には、Ｆ／Ｂ制御開始時に、通電相の位相進み量を小さくするように補正することで、起動トルクを大きくすることができ、ロータ３２の回転速度を素早く立ち上げることができる。そして、ロータ３２の回転速度が上昇するのに伴って、通電相の位相進み量を大きくするように補正することで、高速回転時でも、通電相のトルク発生タイミングと実際のロータの回転位相との同期関係を維持することができ、ロータ３２を高速で安定して回転させることができる。これにより、起動性能と高速性能とを両立させることができる。
【００７０】
その後、ロータ３２が目標位置に近付いたときに、通電相の位相進み量を小さくする方向に補正すれば、実際のロータ３２の回転位相に対して通電相のトルク発生タイミングが遅れた状態となり、それによって、駆動トルクを低下させたり、或は、ロータ３２の回転方向と反対方向のトルク（制動トルク）を発生させることができ、ロータ３２の回転速度を確実に減速させることができて、ロータ３２を正確に目標位置で停止させることができる。これにより、起動性能と高速性能と停止性能（減速性能）に優れたＦ／Ｂ制御を行うことができる。
【００７１】
ところで、ロータ３２の回転量（回転角度）は、減速機構２６、出力軸１３、ディテントレバー１５等からなる回転伝達系を介してレンジ切換機構１１の操作量（パーキングロッド１８のスライド量）に変換されるが、回転伝達系を構成する部品間には、遊び（ガタ）が存在する。例えば、減速機構２６の歯車間のバックラッシが存在し、また、モータ１２の回転軸の先端部に形成した断面非円形の連結部を出力軸１３の嵌合穴に嵌め込んで連結する構成では、両者の嵌め込み作業を容易にするためのクリアランスが必要となる。
【００７２】
また、図３５に示すように、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４やＮｏｔＰレンジ保持凹部２５に嵌まり込んだときに、係合部２３ａと各保持凹部２４，２５の側壁との間に僅かな隙間（ガタ）が存在する。このように、ロータ３２の回転量をレンジ切換機構１１の操作量（パーキングロッド１８のスライド量）に変換する回転伝達系には、バックラッシや部品間の隙間等による遊び（ガタ）が存在するため、仮に、エンコーダカウント値に基づいてロータ３２の回転量を正確に制御できたとしても、レンジ切換機構１１の操作量には回転伝達系の遊び（ガタ）分の誤差が生じてしまい、レンジ切換機構１１の操作量を精度良く制御することができない。
【００７３】
そこで、本実施形態では、この回転伝達系の遊び量を学習する機能を備えている。具体的には、回転伝達系の遊び量を学習する際に、ディテントバネ２３の係合部２３ａがレンジ切換機構１１の可動範囲のＰレンジ側の限界位置であるＰレンジ保持凹部２４の側壁に突き当たるまでロータ３２を回転させるＰレンジ側突き当て制御（一方向突き当て制御）と、ＮｏｔＰレンジ側の限界位置であるＮｏｔＰレンジ保持凹部２５の側壁に突き当たるまでロータ３２を回転させるＮｏｔＰレンジ側突き当て制御（他方向突き当て制御）とを実行して、Ｐレンジ側の限界位置からＮｏｔＰレンジ側の限界位置までのエンコーダカウント値の増減量をレンジ切換機構１１の可動範囲の実測値として求める。そして、この可動範囲の実測値と該可動範囲の設計値との差分を回転伝達系の遊び量として学習し、その後、ロータ３２を目標位置まで回転させる際に、当該目標位置を回転伝達系の遊び量の学習値を考慮して設定する。このようにすれば、回転伝達系に遊び（ガタ）があっても、その遊びを含めた目標位置を設定することができ、レンジ切換機構１１の操作量を精度良く制御することができる。
【００７４】
この場合、ＳＲモータ１２を制御するＥＣＵ４１の電源投入（イグニッションスイッチのオン操作）からレンジ切換機構１１の制御開始までに回転伝達系の遊び量を学習する時間的な余裕があれば、ＥＣＵ４１の電源投入後に、Ｐレンジ側突き当て制御とＮｏｔＰレンジ側突き当て制御とを連続して実行して、レンジ切換機構１１の制御開始前に回転伝達系の遊び量を学習するようにしても良いが、ＥＣＵ４１の電源投入後にレンジ切換機構１１の制御を速やかに開始する必要がある場合は、ＥＣＵ４１の電源投入後に回転伝達系の遊び量を学習する時間的な余裕がない場合がある。
【００７５】
そこで、本実施形態では、遊び量学習を行わずにレンジ切換機構１１の制御を開始した後、ロータ３２がＰレンジで停止しているときに、Ｐレンジ側突き当て制御を実行して、Ｐレンジ側突き当て時のエンコーダカウント値をＥＣＵ４１のＲＡＭに記憶し、ロータ３２がＮｏｔＰレンジで停止しているときに、ＮｏｔＰレンジ側突き当て制御を実行して、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値をＥＣＵ４１のＲＡＭに記憶し、前記Ｐレンジ側突き当て時のエンコーダカウント値と前記ＮｏｔＰレンジ側突き当て時のエンコーダカウント値との差分をレンジ切換機構１１の可動範囲の実測値として求め、この可動範囲の実測値と該可動範囲の設計値との差分を回転伝達系の遊び量として学習するようにしている。
【００７６】
このようにすれば、ＥＣＵ４１の電源投入からレンジ切換機構１１の制御開始までに回転伝達系の遊び量を学習する時間的な余裕がなく、遊び量学習を行わずにレンジ切換機構１１の制御を開始しても、その後、ロータ３２がＰレンジ又はＮｏｔＰレンジで停止している期間に各突き当て制御を実行して回転伝達系の遊び量を学習することができる。この場合、遊び量学習が終了する前は、回転伝達系の遊び量を考慮しない従来同様の制御を行うようにしても良いが、予め設定した平均的な遊び量又は前回の遊び量学習値の記憶値を用いて制御対象を制御するようにしても良い。尚、以下の説明で、単に「突き当て制御」と表記する場合は、Ｐレンジ側突き当て制御とＮｏｔＰレンジ側突き当て制御の両方に該当することを意味する。
【００７７】
また、本実施形態では、突き当て制御の実行時に、ＳＲモータ１２の通電デューティ比（通電率）を通常駆動時よりも低下させることで、ＳＲモータ１２のトルクを通常駆動時よりも低下させるようにしている。ＳＲモータ１２のトルクは、レンジ切換時にディテントバネ２３の係合部２３ａがディテントレバー１５の両保持凹部２４，２５間の山部を確実に乗り越えることができるように大きなトルクに設定されているが、突き当て制御では、ＳＲモータ１２のトルクによってディテントバネ２３の係合部２３ａをディテントレバー１５の各保持凹部２４，２５の側壁に突き当てた状態にするため、ＳＲモータ１２のトルクが大きいと、突き当て制御の実行回数が増えるに従って、ディテントバネ２３の係合部２３ａ等の回転伝達系の部品が徐々に変形・損傷する可能性があり、耐久性・信頼性を低下させるおそれがある。
【００７８】
この対策として、突き当て制御実行時にＳＲモータ１２のトルクを低下させれば、ディテントバネ２３の係合部２３ａをディテントレバー１５の各保持凹部２４，２５の側壁に突き当てる力を弱めることができ、突き当て制御によるディテントバネ２３の係合部２３ａ等の回転伝達系の部品の変形・損傷を防止できて、耐久性・信頼性を確保することができる。尚、本実施形態の突き当て制御では、ディテントバネ２３の係合部２３ａがディテントレバー１５の両保持凹部２４，２５間の山部を乗り越える必要がないため、突き当て制御実行時にＳＲモータ１２のトルクを低下させても、ディテントバネ２３の係合部２３ａをディテントレバー１５の各保持凹部２４，２５の側壁に突き当てるだけの必要最小限のトルクがあれば、突き当て制御を正常に実行できる。
【００７９】
また、本実施形態では、突き当て制御実行時に、ロータ３２の回転速度を遅くするように通電相の位相進み量を補正するようにしている。つまり、突き当て制御実行時に、ロータ３２の回転速度が速いと、ディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁に衝突する速度が速くなって、その衝撃力でディテントバネ２３の係合部２３ａ等の回転伝達系の部品が徐々に変形・損傷する可能性があるが、突き当て制御実行時に、ロータ３２の回転速度を遅くすれば、突き当て制御実行時にディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁に衝突する速度が遅くなって、その衝撃力を弱めることができ、ディテントバネ２３の係合部２３ａ等の回転伝達系の部品の変形・損傷を防止することができて、耐久性・信頼性を確保することができる。
【００８０】
また、本実施形態では、突き当て制御実行時に、ディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁に突き当たった状態で該係合部２３ａが保持凹部２４，２５の側壁を僅かに乗り上げる角度（乗り上げ補正量）をＳＲモータ１２の電源電圧であるバッテリ電圧に基づいて推定し、その推定値分だけレンジ切換機構１１の可動範囲の実測値を補正するようにしている。つまり、突き当て制御実行時に、ディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁を乗り上げる角度（乗り上げ補正量）は、ＳＲモータ１２のトルクが大きくなるほど大きくなる。一般に、ＳＲモータ１２のトルクは、その電源電圧（バッテリ電圧）によって変化するため、電源電圧（バッテリ電圧）とＳＲモータ１２のトルクとの間には相関関係があり、電源電圧（バッテリ電圧）をＳＲモータ１２のトルクの代用情報として用いることができる。従って、突き当て制御実行時に、ディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁を乗り上げる角度（乗り上げ補正量）を、ＳＲモータ１２のトルクの代用情報である電源電圧（バッテリ電圧）に基づいて推定し、その推定値分だけレンジ切換機構１１の可動範囲の実測値を補正するようにすれば、レンジ切換機構１１の可動範囲の実測値を精度良く求めることができる。
【００８１】
ところで、Ｆ／Ｂ制御中に、例えば、エンコーダ４６のＡ相信号又はＢ相信号が何等かの原因で一時的に欠けたり、エンコーダ４６の信号ラインに重畳したノイズパルスが正規のパルス信号と誤認されたりすると、通電相（エンコーダカウント値）とロータ３２の回転位相との同期が取れなくなって、ロータ３２を正常に駆動できなくなってしまい、それによって、ロータ３２が停止したり、逆回転することがあり、Ｆ／Ｂ制御を正常に続けられない状態になって制御不能に陥ることがある。
【００８２】
そこで、本実施形態では、Ｆ／Ｂ制御中に、Ｆ／Ｂ制御状態（ロータ３２の回転状態）が正常か異常かを監視し、異常が検出されれば、その時点で、Ｆ／Ｂ制御からオープンループ制御に切り換えてリカバリ処理を実行する。図４７に示すリカバリ処理の実行例では、シフトレンジをＰレンジからＮｏｔＰレンジに切り換えるＦ／Ｂ制御の途中で、そのＦ／Ｂ制御状態が異常になって、ロータ３２の異常停止又はエンコーダカウント値Ｎｃｎｔのカウント動作の異常停止が発生したした時点で、Ｆ／Ｂ制御からオープンループ制御に切り換えてリカバリ処理を実行する。
【００８３】
オープンループ制御（リカバリ処理）中は、エンコーダカウント値Ｎｃｎｔの情報をフィードバックせずに通電相を順次切り換えてロータ３２を回転駆動すると共に、当該オープンループ制御中に通電相を切り換える毎にオープンループ制御時の位置カウント値Ｎｃｎｔｏｐをカウントアップ（又はカウントダウン）して、この位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔに到達した時点で、ロータ３２が目標位置に到達したと判断してオープンループ制御（リカバリ処理）を終了し、Ｆ／Ｂ制御に復帰する。その結果、本実施形態では、Ｆ／Ｂ制御中に、エンコーダカウント値Ｎｃｎｔの異常や脱調等が発生してＦ／Ｂ制御状態（ロータ３２の回転状態）が一時的に異常になっても、オープンループ制御によりロータ３２を目標位置まで回転させることができる。
【００８４】
この際、Ｆ／Ｂ制御状態の異常検出方法は、次の３つの異常検出方法▲１▼〜▲３▼のいずれか１つ又は２つ、或は全てを用いるようにすれば良い。
【００８５】
［異常検出方法▲１▼］
図４８に示すように、Ｆ／Ｂ制御中に、Ａ相信号のエッジとＢ相信号のエッジとを別々にカウントし、Ａ相信号のカウント値ＮａとＢ相信号のカウント値Ｎｂとの偏差｜Ｎａ−Ｎｂ｜が異常判定値（例えば３）以上であるか否かでＦ／Ｂ制御状態の異常の有無を監視する。Ｆ／Ｂ制御中にＡ相信号とＢ相信号が正常に出力されていれば、Ａ相信号のカウント値ＮａとＢ相信号のカウント値Ｎｂとの差が０又は１となるため、両信号のカウント値の偏差｜Ｎａ−Ｎｂ｜が２以上になれば、いずれか一方の信号の抜けやノイズパルスの混入が考えられる。このような状態になると、エンコーダカウント値Ｎｃｎｔとロータ３２の回転位置との同期が取れなくなって、ロータ３２の回転状態（Ｆ／Ｂ制御状態）が異常になるため、両信号のカウント値の偏差｜Ｎａ−Ｎｂ｜によってロータ３２の回転状態（Ｆ／Ｂ制御状態）の異常の有無を判定することができる。
【００８６】
［異常検出方法▲２▼］
図４８に示すように、Ｆ／Ｂ制御中に、Ａ相信号のエッジ間隔ΔＴａとＢ相信号のエッジ間隔ΔＴｂを計測して、各信号のエッジ間隔ΔＴａ，ΔＴｂが異常判定値（例えばΔＴａ，ΔＴｂの平均値の１０倍）以上であるか否かで、Ｆ／Ｂ制御状態の異常の有無を監視する。
【００８７】
尚、異常検出方法▲２▼として、ロータ回転速度を監視することにより、異常検出するようにしても良く、例えば、単位時間当りのエンコーダ４６の出力パルス数に基づいて異常検出するようにしても良い。
【００８８】
［異常検出方法▲３▼］
図４９に示すように、Ｆ／Ｂ制御中に、エンコーダカウント値Ｎｃｎｔの変化方向からロータ３２の回転方向を監視し、該ロータ３２の回転方向が目標位置へ向かう回転方向から逆転したか否かでＦ／Ｂ制御状態（ロータ３２の回転状態）の異常の有無を監視する。本実施形態では、エンコーダカウント値Ｎｃｎｔが目標位置と反対方向に連続して更新される回数をカウントし、そのカウント値Ｃｒが異常判定値（例えば４）以上であるか否かで、Ｆ／Ｂ制御状態（ロータ３２の回転状態）の異常の有無を監視する。つまり、エンコーダカウント値Ｎｃｎｔが目標位置と反対方向に連続して例えば４回以上更新されたときにロータ３２の逆転と判断して、逆転検出フラグＸｒをＯＮに切り換える。
【００８９】
更に、本実施形態では、オープンループ制御（リカバリ処理）中の励磁方式を１−２相励磁方式に設定し、図５０に示すように、オープンループ制御開始から例えば３ステップ分は、各通電相の励磁時間を最長時間（例えば５０ｍｓ）に設定して、ロータ３２を確実に掴んでロータ３２の回転位相と通電相とを確実に同期させる。この後は、励磁時間を大幅に短くするが、ロータ３２の回転速度の上昇に伴って励磁時間を徐々に短くして、ロータ３２の回転速度を緩やかに上昇させる。
【００９０】
オープンループ制御中は、通電相を切り換える毎にオープンループ制御時の位置カウント値Ｎｃｎｔｏｐをカウントアップ（又はカウントダウン）して、この位置カウント値Ｎｃｎｔｏｐに基づいてロータ３２の回転位置を推定し、この位置カウント値Ｎｃｎｔｏｐと目標カウント値Ａｃｎｔとの差が所定値以下になった時点で、減速領域に入ったと判断して、励磁時間を徐々に長くして、ロータ３２の回転速度を緩やかに減速し、該位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔに到達した時点で、ロータ３２が目標位置に到達したと判断して、オープンループ制御を終了し、Ｆ／Ｂ制御に復帰する。
【００９１】
ところで、エンコーダ４６のパルス抜け又はノイズがあると、エンコーダカウント値Ｎｃｎｔとロータ３２の回転位置（レンジ切換機構１１の操作量）との関係又はエンコーダカウント値Ｎｃｎｔと通電相との関係がずれる可能性がある。
【００９２】
そこで、本実施形態では、オープンループ制御からＦ／Ｂ制御に復帰させるときに、前述した初期駆動と突き当て制御を再実行するようにしている。これにより、オープンループ制御中にエンコーダカウント値Ｎｃｎｔとロータ３２の回転位置（レンジ切換機構１１の操作量）との関係又はエンコーダカウント値Ｎｃｎｔと通電相との関係がずれても、そのずれを初期駆動と突き当て制御によって精度良く補正することができる。
【００９３】
以上説明したレンジ切換制御は、レンジ切換制御装置４２のＥＣＵ４１によって後述する各ルーチンに従って実行される。以下、これら各ルーチンの処理内容を説明する。
【００９４】
［初期駆動］
図８及び図９に示す初期駆動ルーチンに従って実行される。本ルーチンは、ＥＣＵ４１への電源投入直後（イグニッションスイッチをＯＦＦ位置からＡＣＣ位置へ操作した直後）に、初期駆動が終了するまで所定周期（例えば１ｍｓ周期）で実行される。
【００９５】
本ルーチンが起動されると、まずステップ１０１で、フェールセーフ処理実行フラグＸｆｓｏｐ＝ＯＮ、又は、リカバリ処理実行フラグＸｒｃｖ＝ＯＮであるか否かを判定する。ここで、フェールセーフ処理実行フラグＸｆｓｏｐは、エンコーダ４６又はＳＲモータ１２が故障したときに実行されるフェールセーフ処理（オープンループ制御によるレンジ切り換え）が実行されているか否かを判定するフラグであり、ＯＮは実行されていることを意味する。また、リカバリ処理実行フラグＸｒｃｖは、一時的なＦ／Ｂ制御状態の異常が発生したときに一時的に実行されるリカバリ処理（オープンループ制御）が実行されているか否かを判定するフラグであり、ＯＮは実行されていることを意味する。
【００９６】
もし、上記ステップ１０１で、「Ｙｅｓ」と判定されれば、以降の処理を行うことなく、本ルーチンを終了し、「Ｎｏ」と判定されれば、ステップ１０２に進み、ＥＣＵ４１のイニシャル処理から出力軸センサ１４の出力電圧が安定するまで待つための所定時間（例えば１００ｍｓ）が経過したか否かを判定する。そして、イニシャル処理から所定時間経過した時点で、ステップ１０３に進み、出力軸センサ１４の出力電圧を読み込んで、この出力電圧がレンジ判定値以下であるか否かで、現在のレンジがＰレンジかＮｏｔＰレンジかを判定し、Ｐレンジであれば、ステップ１０４に進み、レンジ判定フラグＸｎｐをＰレンジを意味する「０」にセットし、ＮｏｔＰレンジであれば、ステップ１０５に進み、レンジ判定フラグＸｎｐをＮｏｔＰレンジを意味する「１」にセットする。
【００９７】
この後、ステップ１０６に進み、レンジ判定フラグＸｎｐ＝０（Ｐレンジ）であるか否かを判定し、レンジ判定フラグＸｎｐ＝０（Ｐレンジ）であれば、ステップ１０７に進み、図１０のＰレンジ初期駆動ルーチンを実行し、レンジ判定フラグＸｎｐ＝１（ＮｏｔＰレンジ）であれば、ステップ１０８に進み、図１１のＮｏｔＰレンジ初期駆動ルーチンを実行する。
【００９８】
上記ステップ１０７で、図１０のＰレンジ初期駆動ルーチンが起動されると、ステップ２０１〜２０６で、初期駆動中の励磁回数をカウントする励磁回数カウンタＣＡＳＥが０〜５のいずれであるかを判定する。この励磁回数カウンタＣＡＳＥは、イニシャル処理でセットされる初期値が０で、励磁を１回行う毎に１ずつカウントアップされる（図９のステップ１１４）。そして、励磁回数カウンタＣＡＳＥの判定結果に応じて通電相と通電時間Ｔを次のように設定する。
【００９９】
ＣＡＳＥ＝０（１回目の励磁）の場合は、ステップ２０７に進み、Ｗ相通電を選択し、その通電時間ＴをＴ１（例えば１０ｍｓ）にセットする。
ＣＡＳＥ＝１（２回目の励磁）の場合は、ステップ２０８に進み、ＵＷ相通電を選択し、その通電時間ＴをＴ２（例えば１００ｍｓ）にセットする。
【０１００】
ＣＡＳＥ＝２（３回目の励磁）の場合は、ステップ２０９に進み、Ｕ相通電を選択し、その通電時間ＴをＴ１（例えば１０ｍｓ）にセットする。
ＣＡＳＥ＝３（４回目の励磁）の場合は、ステップ２１０に進み、ＵＶ相通電を選択し、その通電時間ＴをＴ２（例えば１００ｍｓ）にセットする。
【０１０１】
ＣＡＳＥ＝４（５回目の励磁）の場合は、ステップ２１１に進み、Ｖ相通電を選択し、その通電時間ＴをＴ１（例えば１０ｍｓ）にセットする。
ＣＡＳＥ＝５（６回目の励磁）の場合は、ステップ２１２に進み、ＶＷ相通電を選択し、その通電時間ＴをＴ２（例えば１００ｍｓ）にセットする。
【０１０２】
これにより、Ｐレンジで初期駆動を行う場合は、Ｗ相通電→ＵＷ相通電→Ｕ相通電→ＵＶ相通電→Ｖ相通電→ＶＷ相通電の順序で通電相の切り換えを一巡し、ロータ３２を正回転方向（Ｐレンジ→ＮｏｔＰレンジの回転方向）に駆動する。この際、１相通電の時間Ｔ１を２相通電の時間Ｔ２よりも短く設定する。
【０１０３】
一方、ステップ１０８で、図１１のＮｏｔＰレンジ初期駆動ルーチンが起動されると、ステップ２２１〜２２６で、励磁回数カウンタＣＡＳＥが０〜５のいずれであるかを判定し、その判定結果に応じて通電相と通電時間Ｔを次のように設定する。
【０１０４】
ＣＡＳＥ＝０（１回目の励磁）の場合は、ステップ２２７に進み、Ｖ相通電を選択し、その通電時間ＴをＴ１（例えば１０ｍｓ）にセットする。
ＣＡＳＥ＝１（２回目の励磁）の場合は、ステップ２２８に進み、ＵＶ相通電を選択し、その通電時間ＴをＴ２（例えば１００ｍｓ）にセットする。
【０１０５】
ＣＡＳＥ＝２（３回目の励磁）の場合は、ステップ２２９に進み、Ｕ相通電を選択し、その通電時間ＴをＴ１（例えば１０ｍｓ）にセットする。
ＣＡＳＥ＝３（４回目の励磁）の場合は、ステップ２３０に進み、ＵＷ相通電を選択し、その通電時間ＴをＴ２（例えば１００ｍｓ）にセットする。
【０１０６】
ＣＡＳＥ＝４（５回目の励磁）の場合は、ステップ２３１に進み、Ｗ相通電を選択し、その通電時間ＴをＴ１（例えば１０ｍｓ）にセットする。
ＣＡＳＥ＝５（６回目の励磁）の場合は、ステップ２３２に進み、ＶＷ相通電を選択し、その通電時間ＴをＴ２（例えば１００ｍｓ）にセットする。
【０１０７】
これにより、ＮｏｔＰレンジで初期駆動を行う場合は、Ｖ相通電→ＵＶ相通電→Ｕ相通電→ＵＷ相通電→Ｗ相通電→ＶＷ相通電の順序で通電相の切り換えを一巡し、ロータ３２を逆回転方向（ＮｏｔＰレンジ→Ｐレンジの回転方向）に駆動する。この場合も、１相通電の時間Ｔ１を２相通電の時間Ｔ２よりも短く設定する。
【０１０８】
以上のようにして、図１０のＰレンジ初期駆動ルーチン又は図１１のＮｏｔＰレンジ初期駆動ルーチンを実行した後、図８のステップ１０９に進み、初期駆動中にレンジ切換操作（Ｐレンジスイッチ４３又はＮｏｔＰレンジスイッチ４４の操作）が行われたか否かを判定し、初期駆動中にレンジ切換操作が行われれば、ステップ１１０に進み、レンジ切換操作フラグＸｃｈｇをＯＮにセットし、レンジ切換操作が行われていなければ、ステップ１１１に進み、レンジ切換操作フラグＸｃｈｇをＯＦＦにセットする。
【０１０９】
この後、図９のステップ１１２に進み、現在の通電相の通電時間をカウントする通電時間カウンタＣＴをカウントアップし、次のステップ１１３で、現在の通電相の通電時間ＣＴが前記図１０又は図１１のルーチンで設定した通電時間Ｔ（＝Ｔ１又はＴ２）を越えたか否かを判定し、越えていなければ、以降の処理を行うことなく、本ルーチンを終了する。これにより、現在の通電相の通電時間ＣＴが図１０又は図１１のルーチンで設定した通電時間Ｔ（＝Ｔ１又はＴ２）を越えるまで、現在の通電相への通電が継続される。
【０１１０】
その後、現在の通電相の通電時間ＣＴが図１０又は図１１のルーチンで設定した通電時間Ｔ（＝Ｔ１又はＴ２）を越えた時点で、ステップ１１４に進み、励磁回数カウンタＣＡＳＥを１だけカウントアップし、通電相を次の通電相に切り換える。そして、次のステップ１１５で、通電時間カウンタＣＴをリセットした後、ステップ１１６に進み、励磁回数カウンタＣＡＳＥが初期駆動の終了を意味する「６」に達したか否かを判定し、もし、励磁回数カウンタＣＡＳＥが「６」に達していれば、ステップ１１８に進み、初期駆動終了フラグＸｅｎｄを初期駆動の終了を意味する「ＯＮ」にセットする。
【０１１１】
また、励磁回数カウンタＣＡＳＥが「６」に達していない場合、つまり、初期駆動の途中である場合は、ステップ１１７に進み、初期駆動の途中終了条件が成立しているか否かを判定する。この初期駆動の途中終了条件は、次の３つの条件▲１▼〜▲３▼によって判定される。
▲１▼レンジ判定フラグＸｎｐが０（Ｐレンジ）であること
▲２▼励磁回数カウンタＣＡＳＥが２又は４、つまり２相通電終了時であること
▲３▼レンジ切換操作フラグＸｃｈｇがＯＮ、つまり初期駆動中にレンジ切換操作が行われたこと
これら３つの条件▲１▼〜▲３▼のうち、１つでも満たさない条件があれば、初期駆動の途中終了条件が成立せず、初期駆動を継続する。これに対し、３つの条件▲１▼〜▲３▼を全て満たしていれば、初期駆動の途中終了条件が成立して、ステップ１１８に進み、初期駆動終了フラグＸｅｎｄを初期駆動の終了を意味する「ＯＮ」にセットする。
【０１１２】
この後、ステップ１１９に進み、レンジ判定フラグＸｎｐ＝１であるか否か（ＮｏｔＰレンジで初期駆動を行ったか否か）を判定し、レンジ判定フラグＸｎｐ＝１であれば、ステップ１２０に進み、初期駆動終了時のエンコーダカウント値Ｎｃｎｔを初期位置ずれ学習値Ｇｃｎｔとして記憶する。そして、次のステップ１２１で、エンコーダカウント値Ｎｃｎｔを次式によりＮｏｔＰレンジを基準にした値に補正する。
Ｎｃｎｔ＝Ｎｃｎｔ＋２８８
【０１１３】
本実施形態では、Ｐレンジの保持位置を０点位置としてエンコーダカウント値Ｎｃｎｔをカウントアップし、ＮｏｔＰレンジの保持位置までロータ３２が回転したときに、エンコーダカウント値Ｎｃｎｔが例えば２８８となるようになっている。従って、ＮｏｔＰレンジで初期駆動を行った場合は、初期駆動終了時のエンコーダカウント値Ｎｃｎｔに２８８を加算することで、エンコーダカウント値ＮｃｎｔをＮｏｔＰレンジを基準にした値に補正する。
【０１１４】
一方、上記ステップ１１９で、レンジ判定フラグＸｎｐ＝０（Ｐレンジで初期駆動）と判定されれば、ステップ１２２に進み、初期駆動終了時のエンコーダカウント値Ｎｃｎｔを用いて初期位置ずれ学習値Ｇｃｎｔを次式により算出する。
Ｇｃｎｔ＝Ｎｃｎｔ＋２×（６−ＣＡＳＥ）
【０１１５】
この場合、初期駆動が最後まで行われれば、ステップ１１４の処理によりＣＡＳＥ＝６となるため、初期駆動終了時のエンコーダカウント値Ｎｃｎｔがそのまま初期位置ずれ学習値Ｇｃｎｔとなるが、Ｐレンジで初期駆動を行う場合は、初期駆動の途中でレンジ切換操作が行われたときに、次の２相通電（２相通電の実行中にレンジ切換要求が発生したときはその２相通電）が終了してから通常駆動に移行するため、その初期駆動を最後まで実行したと仮定して、本来の初期駆動終了時のエンコーダカウント値Ｎｃｎｔを推定し、その推定値を初期位置ずれ学習値Ｇｃｎｔとするようにしている。２×（６−ＣＡＳＥ）は、未終了の励磁回数分の回転角度に相当するカウントアップ値（以下「Ｎｃｎｔ補正量」という）である。
【０１１６】
図１４は、初期駆動時の励磁回数カウンタＣＡＳＥ、Ｎｃｎｔ補正量、通電相、Ａ相信号、Ｂ相信号、エンコーダカウント値Ｎｃｎｔの関係を説明するタイムチャートである。例えば、初期駆動中に、ＵＷ相通電終了時（励磁回数カウンタＣＡＳＥが１から２になったとき）に初期駆動を終了する場合は、Ｎｃｎｔ補正量＝２×（６−ＣＡＳＥ）＝２×（６−２）＝８となり、ＵＶ相通電終了時（励磁回数カウンタＣＡＳＥが３から４になったとき）に初期駆動を終了する場合は、Ｎｃｎｔ補正量＝２×（６−ＣＡＳＥ）＝２×（６−４）＝４となる。
【０１１７】
［エンコーダカウンタ］
次に、図１５に示すエンコーダカウンタルーチンの処理内容を説明する。本ルーチンは、ＡＢ相割り込み処理によりＡ相信号とＢ相信号の立ち上がり／立ち下がりの両方のエッジに同期して起動され、Ａ相信号とＢ相信号の立ち上がり／立ち下がりの両方のエッジを次のようにしてカウントする。本ルーチンが起動されると、まずステップ３０１で、Ａ相信号とＢ相信号の値Ａ（ｉ）　、Ｂ（ｉ）　を読み込み、次のステップ３０２で、図１６のカウントアップ値ΔＮ算出マップを検索して、Ａ相信号とＢ相信号の今回値Ａ（ｉ）　、Ｂ（ｉ）　と、前回値Ａ（ｉ−１）　、Ｂ（ｉ−１）　に応じたカウントアップ値ΔＮを算出する。
【０１１８】
ここで、Ａ相信号とＢ相信号の今回値Ａ（ｉ）　、Ｂ（ｉ）　と、前回値Ａ（ｉ−１）　、Ｂ（ｉ−１）　を用いる理由は、Ａ相信号とＢ相信号の発生順序によってロータ３２の回転方向を判定するためであり、図１７に示すように、正回転（Ｐレンジ→ＮｏｔＰレンジの回転方向）ではカウントアップ値ΔＮをプラス値にしてエンコーダカウント値Ｎｃｎｔをカウントアップし、逆回転（ＮｏｔＰレンジ→Ｐレンジの回転方向）ではカウントアップ値ΔＮをマイナス値にしてエンコーダカウント値Ｎｃｎｔをカウントダウンする。
【０１１９】
カウントアップ値ΔＮの算出後、ステップ３０３に進み、前回のエンコーダカウント値Ｎｃｎｔに上記ステップ３０２で算出したカウントアップ値ΔＮを加算して、今回のエンコーダカウント値Ｎｃｎｔを求める。この後、ステップ３０４に進み、次回のカウント処理のために、Ａ相信号とＢ相信号の今回値Ａ（ｉ）　、Ｂ（ｉ）　をそれぞれＡ（ｉ−１）　、Ｂ（ｉ−１）　として記憶して本ルーチンを終了する。
【０１２０】
［制御モード設定］
図２０乃至図２２に示す制御モード設定ルーチンは、初期駆動終了後に所定周期（例えば１ｍｓ周期）で実行され、制御モード判定値ｍｏｄｅを０、１、３、４、５のいずれかに設定して、下記のように制御モードを指定する。
【０１２１】
ｍｏｄｅ＝０：通電オフ（スタンバイ）
ｍｏｄｅ＝１：通常駆動
（Ｆ／Ｂ制御開始位置停止保持処理及びＦ／Ｂ制御）
ｍｏｄｅ＝３：目標位置停止保持処理
ｍｏｄｅ＝４：反転位置停止保持処理
ｍｏｄｅ＝５：オープンループ制御
【０１２２】
制御モード設定ルーチンが起動されると、まずステップ４０１で、システム故障フラグＸｆａｉｌｏｆｆがレンジ切換制御装置４２の故障を意味するＯＮにセットされているか否かを判定し、もし、Ｘｆａｉｌｏｆｆ＝ＯＮに設定されていれば、ステップ４０２に進み、ＳＲモータ１２を通電オフ状態に維持するための処理を実行する。これにより、回転方向指示値Ｄ＝０（停止）、通電フラグＸｏｎ＝ＯＦＦ（通電オフ）、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ（Ｆ／Ｂ制御禁止）、制御モード判定値ｍｏｄｅ＝０（通電オフ）にセットする。
【０１２３】
一方、システム故障フラグＸｆａｉｌｏｆｆがＯＦＦ（故障無し）の場合は、ステップ４０１からステップ４０３に進み、フェールセーフ処理実行フラグＸｆｓｏｐ＝ＯＦＦ、且つ、リカバリ処理実行フラグＸｒｃｖ＝ＯＦＦであるか否かを判定する。もし、フェールセーフ処理実行フラグＸｆｓｏｐとリカバリ処理実行フラグＸｒｃｖのいずれか一方又は両方がＯＮにセットされている場合は、ステップ４０４に進み、オープンループ制御を実行するために、回転方向指示値Ｄ＝０（停止）、制御モード判定値ｍｏｄｅ＝５（オープンループ制御）、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ（Ｆ／Ｂ制御禁止）にセットする。
【０１２４】
フェールセーフ処理実行フラグＸｆｓｏｐとリカバリ処理実行フラグＸｒｃｖの両方がＯＦＦにセットされている場合は、ステップ４０５に進み、通電フラグＸｏｎ＝ＯＮ（通電オン）にセットされているか否かを判定し、通電フラグＸｏｎ＝ＯＦＦ（通電オフ）にセットされている場合は、ステップ４０６に進み、目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（目標位置とロータ３２と位置との差）を求めて、この差（Ａｃｎｔ−Ｎｃｎｔ）に基づいて正回転（Ｐレンジ→ＮｏｔＰレンジ方向への回転）、逆回転（ＮｏｔＰレンジ→Ｐレンジ方向への回転）、停止のいずれに該当するか判定する。この際、エンコーダカウント値Ｎｃｎｔは、前記図８及び図９の初期駆動ルーチンで学習された初期位置ずれ学習値Ｇｃｎｔによって補正された値を用いる。
Ｎｃｎｔ＝Ｎｃｎｔ−Ｇｃｎｔ
尚、目標カウント値Ａｃｎｔは、後述する図４５及び図４６の目標カウント値設定ルーチンで設定される。
【０１２５】
目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）が＋Ｋｔｈ以上（例えば＋１０°以上）であれば、ロータ３２を正回転方向（Ｐレンジ→ＮｏｔＰレンジの回転方向）に回転駆動する必要があると判断して、ステップ４０７に進み、回転方向指示値Ｄ＝１（正回転）、通電フラグＸｏｎ＝ＯＮ（通電オン）、制御モード判定値ｍｏｄｅ＝１（Ｆ／Ｂ制御開始位置停止保持処理及びＦ／Ｂ制御）にセットする。
【０１２６】
目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）が−Ｋｔｈ以下（例えば−１０°以下）であれば、ロータ３２を逆回転方向（ＮｏｔＰレンジ→Ｐレンジの回転方向）に回転駆動する必要があると判断して、ステップ４０９に進み、回転方向指示値Ｄ＝−１（逆回転）、通電フラグＸｏｎ＝ＯＮ（通電オン）、制御モード判定値ｍｏｄｅ＝１（Ｆ／Ｂ制御開始位置停止保持処理及びＦ／Ｂ制御）にセットする。
【０１２７】
目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）が−Ｋｔｈから＋Ｋｔｈの範囲内（例えば−１０°から＋１０°の範囲内）であれば、ロータ３２を目標位置にディテントバネ２３のバネ力により保持することが可能である（ＳＲモータ１２への通電は不要）と判断して、ステップ４０８に進み、ＳＲモータ１２を通電オフ状態に維持するために、回転方向指示値Ｄ＝０（停止）、通電フラグＸｏｎ＝ＯＦＦ（通電オフ）、制御モード判定値ｍｏｄｅ＝０（通電オフ）にセットする。
【０１２８】
一方、前記ステップ４０５で、通電フラグＸｏｎ＝ＯＮ（通電オン）にセットされていると判定された場合は、図２１のステップ４１０〜４１５の処理によって、指令シフトレンジ（目標位置）が反転されたか否かを判定し、反転されていれば、回転方向指示値Ｄを反転させる。
【０１２９】
具体的には、まずステップ４１０で、回転方向指示値Ｄ＝１（正回転）であるか否かを判定し、回転方向指示値Ｄ＝１（正回転）であれば、ステップ４１１に進み、目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）がマイナス値であるか否かで、ロータ３２の回転方向を正回転から逆回転に反転させる必要があるか否かを判定し、その必要があれば、ステップ４１２に進み、回転方向指示値Ｄ＝−１（逆回転）にセットする。
【０１３０】
これに対して、上記ステップ４１０で、回転方向指示値Ｄが１（正回転）でないと判定された場合（つまりＤ＝０又は−１の場合）は、ステップ４１３に進み、回転方向指示値Ｄ＝−１（逆回転）であるか否かを判定し、回転方向指示値Ｄ＝−１（逆回転）であれば、ステップ４１４に進み、目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）がプラス値であるか否かで、ロータ３２の回転方向を逆回転から正回転に反転させる必要があるか否かを判定し、その必要があれば、ステップ４１５に進み、回転方向指示値Ｄ＝１（正回転）にセットする。
【０１３１】
以上のようにして、回転方向指示値Ｄが反転された場合は、ステップ４１６に進み、ロータ３２の回転方向を反転させるために、制御モード判定値ｍｏｄｅ＝４（反転位置停止保持処理）、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ（Ｆ／Ｂ制御禁止）にセットしてステップ４１７に進む。これに対し、回転方向指示値Ｄが反転されない場合は、上記ステップ４１６の処理を行わずにステップ４１７に進む。
【０１３２】
このステップ４１７では、制御モード判定値ｍｏｄｅ＝４（反転位置停止保持処理）にセットされているか否かを判定し、「Ｙｅｓ」であれば、ステップ４１８に進み、通電フラグＸｏｎ＝ＯＮ（通電オン）にセットして、反転位置停止保持処理を実行する。
【０１３３】
これに対して、上記ステップ４１７で「Ｎｏ」と判定された場合（反転位置停止保持処理ではない場合）は、図２２のステップ４１９〜４２１で、Ｆ／Ｂ制御の終了タイミングであるか否かを判定する。具体的には、まずステップ４１９で、回転方向指示値Ｄ≧０（正回転又は停止）であるか否かを判定し、回転方向指示値Ｄ≧０であれば、ステップ４２０に進み、目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）が＋Ｋｒｅｆ以下（例えば＋０．５°以下）であるか否かで、Ｆ／Ｂ制御の終了タイミングであるか否かを判定する。また、回転方向指示値Ｄ＝−１（逆回転）であれば、ステップ４２１に進み、目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差（Ａｃｎｔ−Ｎｃｎｔ）が−Ｋｒｅｆ以上（例えば−０．５°以上）であるか否かで、Ｆ／Ｂ制御の終了タイミングであるか否かを判定する。
【０１３４】
つまり、Ｆ／Ｂ制御の終了判定値Ｋｒｅｆを例えば通電相の位相進み分（例えば２〜４カウント分）に設定することで、目標カウント値Ａｃｎｔよりも通電相の位相進み分だけ前のタイミングでＦ／Ｂ制御を終了するようにしたものである。これにより、Ｆ／Ｂ制御の最後の通電相がロータ３２を目標位置（目標カウント値Ａｃｎｔ）に停止保持する通電相と一致するようになる。
【０１３５】
上記ステップ４２０又は４２１で「Ｎｏ」と判定された場合（Ｆ／Ｂ制御の終了タイミングでない場合）は、ステップ４２２に進み、目標位置停止保持処理の時間をカウントする停止保持時間カウンタＣＴｈｏｌｄをリセットする。
【０１３６】
一方、上記ステップ４２０又は４２１で「Ｙｅｓ」と判定された場合（Ｆ／Ｂ制御の終了タイミングである場合）は、ステップ４２３に進み、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ（Ｆ／Ｂ制御禁止）にセットし、Ｆ／Ｂ制御を終了して目標位置停止保持処理に移行する。そして、次のステップ４２４で、停止保持時間カウンタＣＴｈｏｌｄをカウントアップして、目標位置停止保持処理の時間をカウントする。
【０１３７】
この後、ステップ４２５に進み、目標位置停止保持処理の時間ＣＴｈｏｌｄが所定時間（例えば５０ｍｓ）に達したか否かを判定し、目標位置停止保持処理の時間ＣＴｈｏｌｄが所定時間（例えば５０ｍｓ）に達していなければ、ステップ４２６に進み、目標位置停止保持処理を続行するために、回転方向指示値Ｄ＝０（停止）、通電フラグＸｏｎ＝ＯＮ（通電オン）、制御モード判定値ｍｏｄｅ＝３（目標位置停止保持処理）に維持する。
【０１３８】
その後、目標位置停止保持処理の時間ＣＴｈｏｌｄが所定時間（例えば５０ｍｓ）に達した時点で、ステップ４２７に進み、ＳＲモータ１２の通電をオフするために、回転方向指示値Ｄ＝０（停止）、通電フラグＸｏｎ＝ＯＦＦ（通電オフ）、制御モード判定値ｍｏｄｅ＝０（通電オフ）にセットする。
【０１３９】
［時間同期モータ制御］
図２３に示す時間同期モータ制御ルーチンは、初期駆動終了後に所定周期（例えば１ｍｓ周期）で起動され、Ｆ／Ｂ制御開始位置停止保持処理、目標位置停止保持処理、反転位置停止保持処理を実行する。
【０１４０】
本ルーチンが起動されると、まずステップ５０１で、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ（Ｆ／Ｂ制御禁止）であるか否かを判定し、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＮ（Ｆ／Ｂ制御実行）の場合は、以降の処理を行うことなく、本ルーチンを終了する。この場合は、後述する図３０に示すＦ／Ｂ制御ルーチンによって通電相の設定と通電処理が実行される。
【０１４１】
これに対して、上記ステップ５０１で、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ（Ｆ／Ｂ制御禁止）と判定された場合は、ステップ５０２〜５０４で、制御モード判定値ｍｏｄｅ＝１，３，４のいずれかに該当するか否かを判定し、制御モード判定値ｍｏｄｅ＝１（Ｆ／Ｂ制御開始位置停止保持処理及びＦ／Ｂ制御）の場合は、ステップ５０２からステップ５０５に進み、後述する図２４に示すｍｏｄｅ１ルーチンを実行して、Ｆ／Ｂ制御開始位置停止保持処理実行時の通電相を設定するための通電相判定値Ｍｐｔｎを算出する。
【０１４２】
また、制御モード判定値ｍｏｄｅ＝３（目標位置停止保持処理）の場合は、ステップ５０３からステップ５０６に進み、後述する図２５に示すｍｏｄｅ３ルーチンを実行して、目標位置停止保持処理実行時の通電相を設定するための通電相判定値Ｍｐｔｎを算出する。
【０１４３】
また、制御モード判定値ｍｏｄｅ＝４（反転位置停止保持処理）の場合は、ステップ５０４からステップ５０７に進み、後述する図２６に示すｍｏｄｅ４ルーチンを実行して、反転位置停止保持処理実行時の通電相を設定するための通電相判定値Ｍｐｔｎを算出する。
【０１４４】
以上のようにして、制御モード判定値ｍｏｄｅ＝１，３，４の場合は、通電相判定値Ｍｐｔｎを算出した後、ステップ５０８に進み、後述する図２７に示す通電処理ルーチンを実行して、Ｆ／Ｂ制御開始位置停止保持処理、目標位置停止保持処理、反転位置停止保持処理を実行する。
【０１４５】
一方、上記ステップ５０２〜５０４で、いずれも「Ｎｏ」と判定された場合、つまり、制御モード判定値ｍｏｄｅ＝０，５の場合は、ステップ５０８に進み、後述する図２７に示す通電処理ルーチンを実行して、通電オフ又はオープンループ制御を実行する。
【０１４６】
［ｍｏｄｅ１］
図２４に示すｍｏｄｅ１ルーチンは、図２３の時間同期モータ制御ルーチンのステップ５０５で起動されるサブルーチンであり、Ｆ／Ｂ制御開始位置停止保持処理時の通電相判定値Ｍｐｔｎ（通電相）を次のようにして設定する。
【０１４７】
本ルーチンが起動されると、まずステップ５１１で、Ｆ／Ｂ制御開始位置停止保持処理の時間をカウントする通電時間カウンタＣＴ１をカウントアップし、次のステップ５１２で、Ｆ／Ｂ制御開始位置停止保持処理の時間ＣＴ１が所定時間（例えば１０ｍｓ）を越えたか否かを判定する。
【０１４８】
もし、Ｆ／Ｂ制御開始位置停止保持処理の時間ＣＴ１が所定時間（例えば１０ｍｓ）を越えていなければ、ステップ５１３に進み、停止保持時通電相記憶済みフラグＸｈｏｌｄ＝ＯＦＦ（未記憶）であるか否か（つまりＦ／Ｂ制御開始位置停止保持処理の開始直前のタイミングであるか否か）を判定し、停止保持時通電相記憶済みフラグＸｈｏｌｄ＝ＯＦＦであれば、ステップ５１４に進み、Ｆ／Ｂ制御開始位置停止保持処理時の通電相判定値Ｍｐｔｎを現在の位置カウンタ値（Ｎｃｎｔ−Ｇｃｎｔ）にセットする。
Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔ
ここで、位置カウンタ値（Ｎｃｎｔ−Ｇｃｎｔ）は、エンコーダカウント値Ｎｃｎｔを初期位置ずれ学習値Ｇｃｎｔで補正した値であり、ロータ３２の現在位置を正確に表した値となっている。
【０１４９】
この後、ステップ５１５に進み、通電相判定値Ｍｐｔｎを“１２”で割り算して、その余りＭｐｔｎ％１２を求める。ここで、“１２”は、通電相を一巡させる間のエンコーダカウント値Ｎｃｎｔ（通電相判定値Ｍｐｔｎ）の増減量に相当する。このＭｐｔｎ％１２の値に基づいて、図２８の変換テーブルによって通電相が決定される。
【０１５０】
そして、次のステップ５１６で、Ｍｐｔｎ％１２＝２，３，６，７，１０，１１であるか否かによって１相通電（Ｕ相通電、Ｖ相通電、Ｗ相通電）であるか否かを判定し、１相通電であれば、ステップ５１７に進み、通電相判定値Ｍｐｔｎを１ステップ分に相当する“２”だけ増加して２相通電（ＵＶ相通電、ＶＷ相通電、ＵＷ相通電）に補正する。これにより、Ｆ／Ｂ制御開始位置停止保持処理を１相通電と比べて保持トルクの大きい２相通電で実行することで、ロータ３２がＦ／Ｂ制御開始位置付近で振動することを防止して、ロータ３２をＦ／Ｂ制御開始位置に確実に停止保持できるようにする。
【０１５１】
そして、次のステップ５１８で、停止保持時通電相記憶済みフラグＸｈｏｌｄ＝ＯＮ（記憶済み）にセットして本ルーチンを終了する。この後、本ルーチンが起動されたときには、ステップ５１３で「Ｎｏ」と判定され、ステップ５１４〜５１８の処理が実行されない。これにより、Ｆ／Ｂ制御開始位置停止保持処理時の通電相判定値Ｍｐｔｎ（通電相）を設定する処理は、Ｆ／Ｂ制御開始位置停止保持処理の開始直前に１回のみ実行される。
【０１５２】
その後、Ｆ／Ｂ制御開始位置停止保持処理の時間ＣＴ１が所定時間（例えば１０ｍｓ）を越えた時点で、ステップ５１２で「Ｙｅｓ」と判定されて、Ｆ／Ｂ制御開始位置停止保持処理を終了し、Ｆ／Ｂ制御に移行する。これにより、最初に、ステップ５１９で、Ｆ／Ｂ制御開始位置停止保持処理時の通電相判定値Ｍｐｔｎに、回転方向に応じて通電相の位相進み分のカウント値（例えば４又は３）を加算又は減算してＦ／Ｂ制御開始時の最初の通電相判定値Ｍｐｔｎを設定し、それによって、ロータ３２の回転駆動を開始する。この後、ステップ５２０に進み、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＮ（Ｆ／Ｂ制御実行）にセットする。
【０１５３】
図３２はＵＷ相から回転を開始する場合に最初に通電する相を説明するタイムチャートである。この場合、正回転（Ｐレンジ→ＮｏｔＰレンジ方向への回転）を開始する場合は、通電相判定値Ｍｐｔｎは、エンコーダカウント値Ｎｃｎｔ、初期位置ずれ学習値Ｇｃｎｔ、正回転方向位相進み量Ｋ１を用いて次式により算出される。
Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔ＋Ｋ１
【０１５４】
ここで、正回転方向位相進み量Ｋ１を例えば４とすると、通電相判定値Ｍｐｔｎは、次式により算出される。
Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔ＋４
ＵＷ相から正回転を開始する場合は、ｍｏｄ（Ｎｃｎｔ−Ｇｃｎｔ）は４となるため、Ｍｐｔｎ％１２＝４＋４＝８となり、最初の通電相はＵＶ相となる。
【０１５５】
一方、ＵＷ相から逆回転（ＮｏｔＰレンジ→Ｐレンジ方向への回転）を開始する場合は、逆回転方向位相進み量Ｋ２を例えば３とすると、通電相判定値Ｍｐｔｎは、次式により算出される。
Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔ−Ｋ２＝Ｎｃｎｔ−Ｇｃｎｔ−３
ＵＷ相から逆回転を開始する場合は、Ｍｐｔｎ％１２＝４−３＝１となり、最初の通電相はＶＷ相となる。
【０１５６】
このように、正回転方向位相進み量Ｋ１と逆回転方向位相進み量Ｋ２をそれぞれ４と３に設定することで、正回転方向と逆回転方向の通電相の切換パターンを対称にすることができ、正回転方向と逆回転方向のいずれの場合も、ロータ３２の現在位置から２ステップ分ずらした位置の相を最初に励磁して回転を開始することができる。
【０１５７】
［ｍｏｄｅ３］
図２５に示すｍｏｄｅ３ルーチンは、図２３の時間同期モータ制御ルーチンのステップ５０６で起動されるサブルーチンであり、目標位置停止保持処理時の通電相判定値Ｍｐｔｎ（通電相）を次のようにして設定する。
【０１５８】
本ルーチンが起動されると、まずステップ５３１で、Ｆ／Ｂ制御終了時のＭｐｔｎ％１２＝２，３，６，７，１０，１１であるか否かによってＦ／Ｂ制御終了時の通電相が１相通電（Ｕ相通電、Ｖ相通電、Ｗ相通電）であるか否かを判定し、１相通電であれば、ステップ５３２〜５３４の処理によって、それまで行っていたＦ／Ｂ制御の回転方向に応じて通電相判定値Ｍｐｔｎを２だけ増加又は減少させることで、当該１相通電の次のステップの２相通電に変更する。
【０１５９】
この際、ステップ５３２で、回転方向を次のようにして判定する。本ルーチンに入る直前（Ｆ／Ｂ制御終了時）に、図２２のステップ４２６で、回転方向指示値Ｄが０（停止）にセットされるため、回転方向指示値Ｄを見ても回転方向を判定することができない。そこで、本ルーチンでは、Ｆ／Ｂ制御終了時の通電相判定値Ｍｐｔｎと位置カウント値（Ｎｃｎｔ−Ｇｃｎｔ）との間に、通電相の位相進み量Ｋ１，Ｋ２分の差があることに着目し、Ｆ／Ｂ制御終了時の通電相判定値Ｍｐｔｎと位置カウント値（Ｎｃｎｔ−Ｇｃｎｔ）との大小関係によって回転方向を次のように判定する。
【０１６０】
Ｍｐｔｎ＞Ｎｃｎｔ−Ｇｃｎｔの場合は、正回転（Ｐレンジ→ＮｏｔＰレンジの回転方向）と判定して、ステップ５３３に進み、通電相判定値Ｍｐｔｎを２だけ増加させることで、２相通電に補正する。
【０１６１】
一方、Ｍｐｔｎ＜Ｎｃｎｔ−Ｇｃｎｔの場合は、逆回転（ＮｏｔＰレンジ→Ｐレンジの回転方向）と判定して、ステップ５３４に進み、通電相判定値Ｍｐｔｎを２だけ減少させることで、２相通電に補正する。
尚、Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔの場合は、停止と判定して、通電相は変更しない。
【０１６２】
このように、目標位置停止保持処理についても、Ｆ／Ｂ制御開始位置停止保持処理と同じく、１相通電と比べて保持トルクの大きい２相通電で実行することで、ロータ３２が目標位置付近で振動することを防止して、ロータ３２を目標位置で確実に停止保持できるようにする。
【０１６３】
［ｍｏｄｅ４］
図２６に示すｍｏｄｅ４ルーチンは、図２３の時間同期モータ制御ルーチンのステップ５０７で起動されるサブルーチンであり、反転位置停止保持処理時の通電相判定値Ｍｐｔｎ（通電相）を次のようにして設定する。
【０１６４】
本ルーチンが起動されると、まずステップ５４１で、反転位置停止保持処理の時間をカウントする通電時間カウンタＣＴ４をカウントアップし、次のステップ５４２で、反転位置停止保持処理の時間ＣＴ４が所定時間（例えば５０ｍｓ）を越えたか否かを判定する。
【０１６５】
もし、反転位置停止保持処理の時間ＣＴ４が所定時間（例えば５０ｍｓ）を越えていなければ、ステップ５４３に進み、Ｍｐｔｎ％１２＝２，３，６，７，１０，１１であるか否かによって現在の通電相が１相通電（Ｕ相通電、Ｖ相通電、Ｗ相通電）であるか否かを判定し、１相通電であれば、ステップ５４４〜５４６の処理によって、それまで行っていたＦ／Ｂ制御の回転方向に応じて通電相判定値Ｍｐｔｎを２だけ増加又は減少させることで、当該１相通電の次のステップの２相通電に変更する。このステップ５４３〜５４６の処理は、前記図２５のｍｏｄｅ３ルーチンのステップ５３１〜５３４の処理と同じである。
【０１６６】
このように、反転位置停止保持処理についても、Ｆ／Ｂ制御開始位置停止保持処理や目標位置停止保持処理と同じく、１相通電と比べて保持トルクの大きい２相通電で実行することで、ロータ３２が反転位置付近で振動することを防止して、ロータ３２を反転位置で確実に停止保持できるようにする。
【０１６７】
その後、反転位置停止保持処理の時間ＣＴ４が所定時間（例えば５０ｍｓ）を越えた時点で、ステップ５４２で「Ｙｅｓ」と判定されて、反転位置停止保持処理を終了し、Ｆ／Ｂ制御を再開する。これにより、最初に、ステップ５４７で、反転位置停止保持処理時の通電相判定値Ｍｐｔｎに、回転方向に応じて通電相の位相進み分のカウント値（例えば４又は３）を加算又は減算してＦ／Ｂ制御再開時の最初の通電相判定値Ｍｐｔｎを設定し、それによって、ロータ３２の回転駆動を開始する。この後、ステップ５４８に進み、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＮ（Ｆ／Ｂ制御実行）、通電時間カウンタＣＴ４＝０、制御モード判定値ｍｏｄｅ＝１（通常駆動）にセットして本ルーチンを終了する。
【０１６８】
［通電処理］
図２７に示す通電処理ルーチンは、図２３の時間同期モータ制御ルーチンのステップ５０８で起動されるサブルーチンである。尚、本ルーチンは、後述する図３０のＦ／Ｂ制御ルーチンのステップ６０３でも起動される。
【０１６９】
図２７の通電処理ルーチンが起動されると、まずステップ５５１で、制御モード判定値ｍｏｄｅ＝０（通電オフ）であるか否かを判定し、制御モード判定値ｍｏｄｅ＝０（通電オフ）であれば、ステップ５５２に進み、ＳＲモータ１２の全相の通電をオフしてスタンバイ状態とする。
【０１７０】
一方、上記ステップ５５１で、「Ｎｏ」と判定されれば、ステップ５５３に進み、制御モード判定値ｍｏｄｅ＝５（オープンループ制御）であるか否かを判定し、制御モード判定値ｍｏｄｅ＝５（オープンループ制御）であれば、ステップ５５４に進み、オープンループ制御を実行する。このオープンループ制御は、エンコーダ４６の故障又はＳＲモータ１２の動作異常が発生したときに、例えば１ｍｓ周期の時間同期処理によって通電相を設定してロータ３２を目標位置まで回転駆動する。
【０１７１】
また、上記ステップ５５１、５５３で、いずれも「Ｎｏ」と判定された場合、つまり、制御モード判定値ｍｏｄｅ＝１，３，４（Ｆ／Ｂ制御開始位置停止保持処理、Ｆ／Ｂ制御、目標位置停止保持処理、反転位置停止保持処理）の場合は、ステップ５５５に進み、Ｍｐｔｎ％１２に応じて図２８の変換テーブルによって通電相を設定する。
【０１７２】
この後、ステップ５５６に進み、突き当て制御実行中（Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮ又はＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮ）であるか否かを判定し、突き当て制御実行中でなければ、ステップ５５７に進み、ＳＲモータ１２の通電デューティ比を例えば１００％に設定するが、突き当て制御実行中であれば、ステップ５５８に進み、ＳＲモータ１２の電源電圧であるバッテリ電圧に応じて図２９のテーブルによって通電デューティ比を例えば１０〜３０％に設定する。これにより、突き当て制御の実行時に、ＳＲモータ１２のトルクを通常駆動時よりも大幅に低下させる。
【０１７３】
尚、図２９のテーブルの例では、ＳＲモータ１２の電源電圧（バッテリ電圧）が高くなるほど、ＳＲモータ１２のトルクが大きくなるという特性を考慮して、電源電圧（バッテリ電圧）が高くなるほど、通電デューティ比が小さくなるように設定されている。これにより、電源電圧（バッテリ電圧）が高くても低くても、ＳＲモータ１２のトルクがほぼ一定となり、常にＳＲモータ１２のトルクが突き当て制御に必要最小限のトルクを確保できるようになっている。
【０１７４】
以上のようにして、通電デューティ比を設定した後、ステップ５５９に進み、ＥＣＵ４１からモータドライバ３７，３８に制御信号を出力して、ステップ５５５で設定された通電相の巻線に、ステップ５５７又は５５８で設定された通電デューティ比で通電してＳＲモータ１２を駆動する。
【０１７５】
［Ｆ／Ｂ制御］
次に、図３０に示すＦ／Ｂ制御ルーチンの処理内容を説明する。本ルーチンは、ＡＢ相割り込み処理により実行され、初期駆動終了後にＦ／Ｂ制御実行条件が成立しているときに、ロータ３２の回転位置（エンコーダカウント値Ｎｃｎｔ−Ｇｃｎｔ）が目標位置（目標カウント値Ａｃｎｔ）から例えば０．５°以内に到達するまで、エンコーダカウント値Ｎｃｎｔと初期位置ずれ学習値Ｇｃｎｔとに基づいて通電相を切り換えてロータ３２を回転させる。
【０１７６】
図３０のＦ／Ｂ制御ルーチンが起動されると、まずステップ６０１で、Ｆ／Ｂ許可フラグＸｆｂがＯＮにセットされているか否か（Ｆ／Ｂ制御実行条件が成立しているか否か）を判定し、Ｆ／Ｂ許可フラグＸｆｂがＯＦＦ（Ｆ／Ｂ制御実行条件が不成立）であれば、以降の処理を行うことなく、本ルーチンを終了する。
【０１７７】
これに対し、Ｆ／Ｂ許可フラグＸｆｂがＯＮにセットされていれば、ステップ６０２に進み、後述する図３１の通電相設定ルーチンを実行して、現在のエンコーダカウント値Ｎｃｎｔと初期位置ずれ学習値Ｇｃｎｔとに基づいて通電相を設定し、次のステップ６０３で、図２７の通電処理ルーチンを実行する。
【０１７８】
［通電相設定］
図３１に示す通電相設定ルーチンは、図３０のＦ／Ｂ制御ルーチンのステップ６０２で起動されるサブルーチンである。本ルーチンが起動されると、まずステップ６１１で、目標位置への回転方向を指示する回転方向指示値Ｄが正回転（Ｐレンジ→ＮｏｔＰレンジの回転方向）を意味する「１」であるか否かを判定する。その結果、回転方向指示値Ｄ＝１（正回転）と判定されれば、ステップ６１２に進み、ロータ３２の回転方向が回転方向指示に反して逆転したか否か（エンコーダカウント値Ｎｃｎｔが減少したか否か）を判定し、逆転していなければ、ステップ６１３に進み、現在のエンコーダカウント値Ｎｃｎｔ、初期位置ずれ学習値Ｇｃｎｔ、正回転方向位相進み量Ｋ１、速度位相進み補正量Ｋｓを用いて通電相判定値Ｍｐｔｎを次式により更新する。
Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔ＋Ｋ１＋Ｋｓ
ここで、正回転方向位相進み量Ｋ１は、ロータ３２を正回転させるのに必要な通電相の位相進み量（ロータ３２の現在の回転位相に対する通電相の位相進み量）であり、例えばＫ１＝４に設定されている。
【０１７９】
また、速度位相進み補正量Ｋｓは、ロータ３２の回転速度に応じて設定される位相進み補正量であり、後述する図３４の速度位相進み補正量設定ルーチンによって設定される。例えば、低速域では、速度位相進み補正量Ｋｓが０に設定され、高速になるに従って、速度位相進み補正量Ｋｓが例えば１又は２に増加される。これにより、ロータ３２の回転速度に適した通電相となるように通電相判定値Ｍｐｔｎが補正される。
【０１８０】
一方、上記ステップ６１２で、ロータ３２の回転方向が回転方向指示に反して逆転したと判定された場合は、逆転防止のために通電相判定値Ｍｐｔｎを更新しない。この場合は、逆転直前の通電相（前回の通電相）に通電され、ロータ３２の逆転を抑制する方向に制動トルクが発生する。
【０１８１】
また、上記ステップ６１１で、回転方向指示値Ｄ＝０（逆回転）、つまりＮｏｔＰレンジ→Ｐレンジの回転方向と判定された場合は、ステップ６１４に進み、ロータ３２の回転方向が回転方向指示に反して逆転したか否か（エンコーダカウント値Ｎｃｎｔが増加したか否か）を判定し、逆転していなければ、ステップ６１５に進み、現在のエンコーダカウント値Ｎｃｎｔ、初期位置ずれ学習値Ｇｃｎｔ、逆回転方向位相進み量Ｋ２、速度位相進み補正量Ｋｓを用いて通電相判定値Ｍｐｔｎを次式により更新する。
Ｍｐｔｎ＝Ｎｃｎｔ−Ｇｃｎｔ−Ｋ２−Ｋｓ
【０１８２】
ここで、逆回転方向位相進み量Ｋ２は、ロータ３２を逆回転させるのに必要な通電相の位相進み量（ロータ３２の現在の回転位相に対する通電相の位相進み量）であり、例えばＫ２＝３に設定されている。速度位相進み補正量Ｋｓは正回転の場合と同じく、後述する図３４の速度位相進み補正量設定ルーチンによって設定される。
【０１８３】
一方、上記ステップ６１４で、ロータ３２の回転方向が回転方向指示に反して逆転したと判定された場合は、逆転防止のために通電相判定値Ｍｐｔｎを更新しない。この場合は、逆転直前の通電相（前回の通電相）に通電され、ロータ３２の逆転を抑制する方向に制動トルクが発生する。
【０１８４】
以上のようにして、今回の通電相判定値Ｍｐｔｎを決定した後、図２７の通電処理ルーチンを実行し、Ｆ／Ｂ制御実行中は、ステップ５５５で、図２８の変換テーブルを検索して、Ｍｐｔｎ％１２に対応する通電相を選択し、その通電相に通電する。
【０１８５】
［ロータ回転速度演算］
図３３に示すロータ回転速度演算ルーチンは、ＡＢ相割り込み処理により実行され、次のようにしてロータ３２の回転速度ＳＰを演算する。本ルーチンが起動されると、まずステップ６２１で、Ｆ／Ｂ許可フラグＸｆｂがＯＮ（Ｆ／Ｂ制御実行中）であるか否かを判定し、Ｆ／Ｂ許可フラグＸｆｂがＯＦＦ（Ｆ／Ｂ制御禁止）であれば、ロータ３２の回転速度ＳＰに応じた通電相の位相進み補正を行わないため、ステップ６２４に進み、ロータ３２の回転速度ＳＰ，ＳＰａの記憶値をリセットして、本ルーチンを終了する。
【０１８６】
これに対して、Ｆ／Ｂ許可フラグＸｆｂがＯＮ（Ｆ／Ｂ制御実行中）であれば、次のようにしてロータ３２の回転速度ＳＰを演算する。まず、ステップ６２２で、エンコーダ４６のＡ相信号とＢ相信号の立ち上がり／立ち下がりエッジ間の時間間隔ΔＴ（ｎ）　（すなわちエンコーダカウント値が増減する時間間隔）を計測して、その時間間隔ΔＴ（ｎ）　の過去Ｎ回分の平均値ΔＴａｖを算出する。そして、回転速度演算値ＳＰａを次式により算出する。
ＳＰａ＝６０／（ΔＴａｖ×Ｋｐ）　　［ｒｐｍ］
【０１８７】
ここで、Ｋｐは、ロータ３２の１回転当たりの時間間隔ΔＴ（ｎ）　の数（ロータ３２の１回転当たりのエンコーダカウント値の変化量）であり、図５の構成のエンコーダ４６の場合は、Ｋｐ＝９６となる。ΔＴａｖ×Ｋｐは、ロータ３２が１回転するのに要する時間［ｓｅｃ］である。
【０１８８】
この後、ステップ６２３に進み、回転速度演算値ＳＰａを用いて、ロータ３２の回転速度ＳＰを次式によりなまし処理して求める。
ＳＰ（ｉ）　＝ＳＰ（ｉ−１）　＋｛ＳＰａ−ＳＰ（ｉ−１）　｝／Ｒ
ここで、ＳＰ（ｉ）　は今回の回転速度、ＳＰ（ｉ−１）　は前回の回転速度、Ｒはなまし係数である。
【０１８９】
［速度位相進み補正量設定］
図３４に示す速度位相進み補正量設定ルーチンは、所定周期（例えば１ｍｓ周期）で起動され、ロータ３２の回転速度ＳＰに応じて速度位相進み補正量Ｋｓを次のようにして設定する。本ルーチンが起動されると、まずステップ６３１で、Ｆ／Ｂ許可フラグＸｆｂがＯＮ（Ｆ／Ｂ制御実行中）であるか否かを判定し、Ｆ／Ｂ許可フラグＸｆｂがＯＦＦ（Ｆ／Ｂ制御禁止）であれば、通電相の位相進み補正は不要であるため、以降の処理を行うことなく、本ルーチンを終了する。
【０１９０】
これに対して、Ｆ／Ｂ許可フラグＸｆｂがＯＮ（Ｆ／Ｂ制御実行中）であれば、ステップ６３２〜６３６の処理により、図３３のロータ回転速度演算ルーチンで演算されたロータ３２の回転速度ＳＰに応じて速度位相進み補正量Ｋｓを次のようにして設定する。
【０１９１】
ステップ６３２で、ロータ３２の回転速度ＳＰが所定値Ｋｌｏｗ（例えば３００ｒｐｍ）よりも低いと判定されれば、ステップ６３４に進み、速度位相進み補正量Ｋｓを最小値Ｋａ（例えば０）に設定し、ステップ６３３で、ロータ３２の回転速度ＳＰが所定値Ｋｈｉｇｈ（例えば６００ｒｐｍ）よりも高いと判定されれば、ステップ６３６に進み、速度位相進み補正量Ｋｓを最大値Ｋｃ（例えば２）に設定する。また、ロータ３２の回転速度ＳＰがＫｌｏｗ〜Ｋｈｉｇｈの範囲内であれば、ステップ６３５に進み、速度位相進み補正量Ｋｓを中間値Ｋｂ（例えば１）に設定する。このような処理により、ロータ３２の回転速度ＳＰが速くなるほど、速度位相進み補正量Ｋｓを大きな値に設定する。
【０１９２】
この後、ステップ６３７に進み、目標カウント値Ａｃｎｔとエンコーダカウント値Ｎｃｎｔとの差の絶対値｜Ａｃｎｔ−Ｎｃｎｔ｜が所定値よりも小さいか否かで、ロータ３２の回転位置が目標位置に近付いたか否か（停止のための減速領域に入ったか否か）を判定する。
【０１９３】
もし、｜Ａｃｎｔ−Ｎｃｎｔ｜が所定値以上であれば、ステップ６３９に進み、突き当て制御実行中（Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮ又はＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮ）であるか否かを判定し、突き当て制御実行中でなければ、上記ステップ６３４〜６３６のいずれかで設定した速度位相進み補正量Ｋｓをそのまま用い、突き当て制御実行中であれば、ステップ６４０に進み、速度位相進み補正量Ｋｓを小さい値Ｋｅ（例えば０又は−１）に設定して、ロータ３２の回転速度を遅くする。
【０１９４】
一方、｜Ａｃｎｔ−Ｎｃｎｔ｜が所定値よりも小さい場合は、減速領域と判断して、ステップ６３７からステップ６３８に進み、速度位相進み補正量Ｋｓを小さい値Ｋｄ（例えば０又は−１）に設定する。
【０１９５】
尚、本ルーチンでは、ロータ３２の回転速度ＳＰに応じて速度位相進み補正量Ｋｓを３段階に切り換えるようにしたが、２段階又は４段階以上に切り換えるようにしても良い。
【０１９６】
［遊び量学習］
図３６に示す遊び量学習ルーチンは、初期駆動終了後に所定周期（例えば８ｍｓ周期）で実行される。本ルーチンが起動されると、まずステップ７００で、遊び量学習完了フラグＸｇ＝ＯＮ（遊び量学習完了後）であるか否かを判定し、もし、遊び量学習完了フラグＸｇ＝ＯＮであれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、遊び量学習は、イグニッションスイッチのオン期間中に１回のみ行われる。尚、遊び量学習完了フラグＸｇは、イグニッションスイッチのオン直後に実行される初期化処理ルーチン（図示せず）によってＯＦＦにセットされる。
【０１９７】
一方、上記ステップ７００で、遊び量学習完了フラグＸｇ＝ＯＦＦ（遊び量学習完了前）と判定されれば、ステップ７０１に進み、指令シフトレンジがＰレンジであるか否かを判定し、Ｐレンジであれば、ステップ７０２に進み、後述する図３９及び図４０のＰレンジ側突き当て制御ルーチンを実行し、Ｐレンジ側突き当て時のエンコーダカウント値ＮｐをＥＣＵ４１のＲＡＭに記憶する。一方、ＮｏｔＰレンジであれば、ステップ７０３に進み、後述する図４２及び図４３のＮｏｔＰレンジ側突き当て制御ルーチンを実行して、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値ＮｎｐをＥＣＵ４１のＲＡＭに記憶する。
【０１９８】
この後、ステップ７０４に進み、Ｐレンジ側とＰレンジ側の両方の突き当て制御を完了したか否か（Ｐレンジ側突き当て完了フラグＸｐ＝ＯＮ、且つ、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＮであるか否か）を判定し、Ｐレンジ側とＰレンジ側のいずれか一方でも突き当て制御が完了していなければ、以降の処理を行うことなく、本ルーチンを終了する。
【０１９９】
これに対して、レンジ側とＰレンジ側の両方の突き当て制御を完了していれば、ステップ７０５に進み、Ｐレンジ側の限界位置（Ｐレンジ保持凹部２４の側壁）からＮｏｔＰレンジ側の限界位置（ＮｏｔＰレンジ保持凹部２５の側壁）までのロータ３２の可動範囲（ディテントレバー１５の可動範囲）の実測値ΔＮａｃｔを次式により算出する。
ΔＮａｃｔ＝Ｎｎｐ−Ｎｐ
【０２００】
ここで、Ｎｎｐは、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値で、後述する図４２及び図４３のＮｏｔＰレンジ側突き当て制御ルーチンによって学習した値ＧＮｎｐが用いられる。Ｎｐは、Ｐレンジ側突き当て時のエンコーダカウント値で、後述する図３９及び図４０のＰレンジ側突き当て制御ルーチンによって学習した値ＧＮｐが用いられる。
【０２０１】
可動範囲の実測値ΔＮａｃｔの算出後、ステップ７０６に進み、図３８に示す関係を考慮して、Ｐレンジ側の遊び量ΔＧｐとＮｏｔＰレンジ側の遊び量ΔＧｎｐを可動範囲の実測値ΔＮａｃｔと設計値ΔＮｄを用いて次式により算出する。
ΔＧｐ＝ΔＧｎｐ＝（ΔＮａｃｔ−ΔＮｄ）／２
ここで、可動範囲の設計値ΔＮｄは、予め設計データに基づいて算出しても良いし、量産品の可動範囲の製造ばらつきの中心値（標準品の可動範囲の実測値）を用いても良い。
【０２０２】
図３８に示すように、可動範囲の実測値ΔＮａｃｔと設計値ΔＮｄとの差分（ΔＮａｃｔ−ΔＮｄ）は、Ｐレンジ側とＮｏｔＰレンジ側の合計遊び量（ΔＧｐ＋ΔＧｎｐ）に相当する。一般に、Ｐレンジ側の遊び量ΔＧｐとＮｏｔＰレンジ側の遊び量ΔＧｎｐは等しいため、上式により、Ｐレンジ側とＮｏｔＰレンジ側の各遊び量ΔＧｐ，ΔＧｎｐを算出することができる。
【０２０３】
各遊び量ΔＧｐ，ΔＧｎｐの算出後、ステップ７０７に進み、遊び量学習完了フラグＸｇを、遊び量学習完了を意味する「ＯＮ」にセットして、本ルーチンを終了する。
【０２０４】
尚、上記ステップ７０５、７０６で算出された可動範囲の実測値ΔＮａｃｔと遊び量ΔＧｐ，ΔＧｎｐは、ＥＣＵ４１のＳＲＡＭ等の不揮発性メモリ（図示せず）に更新記憶され、イグニッションスイッチのオフ後も、その記憶値が保持される。次回のイグニッションスイッチのオン後は、後述する図４５及び図４６の目標カウント値設定ルーチンで目標カウント値Ａｃｎｔを設定する際に、ＥＣＵ４１の不揮発性メモリに記憶されている可動範囲の実測値ΔＮａｃｔと遊び量ΔＧｐ，ΔＧｎｐを用いて目標カウント値Ａｃｎｔを設定する。
【０２０５】
［Ｐレンジ側突き当て制御］
図３９及び図４０に示すＰレンジ側突き当て制御ルーチンは、指令シフトレンジがＰレンジのときに図３６の遊び量学習ルーチンのステップ７０２で実行されるサブルーチンである。本ルーチンが起動されると、まずステップ７１１で、Ｐレンジ側突き当て完了フラグＸｐ＝ＯＮ（Ｐレンジ側突き当て制御終了後）であるか否かを判定し、既にＰレンジ側突き当て制御が終了していれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、Ｐレンジ側突き当て制御は、イグニッションスイッチのオン期間中に１回のみ行われる。
【０２０６】
一方、上記ステップ７１１で、Ｐレンジ側突き当て完了フラグＸｐ＝ＯＦＦ（Ｐレンジ側突き当て制御終了前）であると判定されれば、ステップ７１２に進み、制御モード判定値ｍｏｄｅが０、３に該当するか否かを判定する。ここで、制御モード判定値ｍｏｄｅ＝０は、通電オフ（スタンバイ）を意味し、制御モード判定値ｍｏｄｅ＝３は、目標位置停止保持処理を意味する。
【０２０７】
本ルーチンでは、ロータ３２がＰレンジで停止しているときにＰレンジ側突き当て制御を行うようにするために、制御モード判定値ｍｏｄｅ＝０又は３でＰレンジ側突き当て制御を行うようにしている。
【０２０８】
制御モード判定値ｍｏｄｅ＝０（通電オフ）の場合は、ステップ７１３に進み、Ｐレンジでｍｏｄｅ＝０になっている時間をカウントするｍｏｄｅ０時間カウンタＣＴ０ｐをカウントアップする。また、制御モード判定値ｍｏｄｅ＝３（目標位置停止保持処理）の場合は、ステップ７１４に進み、Ｐレンジでｍｏｄｅ＝３となっている時間をカウントするｍｏｄｅ３時間カウンタＣＴ３ｐをカウントアップする。これら２つの時間カウンタＣＴ０ｐ，ＣＴ３ｐは、Ｐレンジでロータ３２の振動が収束して停止状態になるまで待機するのに用いられる。
【０２０９】
尚、制御モード判定値ｍｏｄｅ＝１（通常駆動）、４（反転位置停止保持処理）、５（オープンループ制御）の場合は、ロータ３２がＰレンジで停止していないため、ステップ７３１に進み、時間カウンタＣＴ０ｐ，ＣＴ３ｐのカウント値をクリアする。
【０２１０】
そして、ステップ７１５で、ｍｏｄｅ０時間カウンタＣＴ０ｐの値が停止判定値Ｋ０ｐを越えたか否か、又は、ｍｏｄｅ３時間カウンタＣＴ３ｐの値が停止判定値Ｋ３ｐを越えたか否か判定する。ここで、停止判定値Ｋ０ｐは、Ｐレンジで制御モード判定値ｍｏｄｅ＝０（通電オフ）のときにロータ３２の振動が収束するのに必要な時間に相当し、停止判定値Ｋ３ｐは、Ｐレンジで制御モード判定値ｍｏｄｅ＝３（目標位置停止保持処理）のときにロータ３２の振動が収束するのに必要な時間に相当する。
【０２１１】
上記ステップ７１５で、「Ｎｏ」と判定されれば、ロータ３２の振動が収束していないと判断して、ステップ７１６に進み、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦにセットする。この場合は、まだ、Ｐレンジ側突き当て制御が実行されない。
【０２１２】
一方、上記ステップ７１５で、「Ｙｅｓ」と判定されれば、Ｐレンジでロータ３２の振動が収束したと判断して、ステップ７１７に進み、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮにセットする。
【０２１３】
この後、ステップ７１８に進み、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮであるか否かを判定し、Ｘｅｘｐ＝ＯＦＦであれば、ステップ７１９に進み、突き当て目標カウント値Ａｇ＝０、停止時間カウンタＣＴｓｔｏｐ＝０、突き当て制御時間カウンタＣＴｇ＝０にセットして、本ルーチンを終了する。
【０２１４】
これに対して、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮの場合は、ステップ７２０に進み、突き当て目標カウント値Ａｇを所定値Ｋｇｐに設定する。この突き当て目標カウント値Ａｇ（Ｋｇｐ）は、Ｐレンジ側突き当て制御によってディテントバネ２３の係合部２３ａをディテントレバー１５のＰレンジ保持凹部２４の側壁に確実に突き当てることができるように設定される。
【０２１５】
Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮの場合は、後述する図４５の目標カウント値設定ルーチンによって目標カウント値Ａｃｎｔが突き当て目標カウント値Ａｇ（Ｋｇｐ）にセットされるため、図４１に示すように、Ｐレンジ側突き当て制御が実行され、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当てられる。
【０２１６】
Ｐレンジ側突き当て制御中は、図４０のステップ７２１で、突き当て制御時間カウンタＣＴｇをカウントアップして、Ｐレンジ側突き当て制御の実行時間を計測する。そして、次のステップ７２２で、Ｐレンジ側突き当て制御の実行時間ＣＴｇが許容最大学習時間Ｋｇ（例えば５００ｍｓ）を越えたか否かを判定する。Ｐレンジ側突き当て制御が正常に実行されれば、許容最大学習時間Ｋｇよりも短い時間でディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たった状態になって、Ｐレンジ側突き当て時のエンコーダカウント値Ｎｐの学習（Ｐレンジ側突き当て制御）が終了する。従って、許容最大学習時間Ｋｇを越えてＰレンジ側突き当て制御が終了しない場合は、ＳＲモータ１２の故障やエンコーダ４６の故障等、何等かのシステム異常が発生しているものと思われるため、このような場合は、Ｐレンジ側突き当て制御を強制的に終了させるために、ステップ７２３に進み、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦ、Ｐレンジ側突き当て完了フラグＸｐ＝ＯＦＦ、停止時間カウンタＣＴｓｔｏｐ＝０、ｍｏｄｅ３時間カウンタＣＴ３ｐ＝０、ｍｏｄｅ０時間カウンタＣＴ０ｐ＝０、突き当て制御時間カウンタＣＴｇ＝０にセットして、本ルーチンを終了する。
【０２１７】
これに対して、Ｐレンジ側突き当て制御の実行時間ＣＴｇが許容最大学習時間Ｋｇを越えていない場合は、ステップ７２４に進み、出力軸センサ１４のＰレンジ出力学習値Ｖｐを次式により更新する。
Ｖｐ（ｉ）　＝Ｖｐ（ｉ−１）　＋｛Ｖｎｓｗ−Ｖｐ（ｉ−１）　｝／Ｒｎｓｗ
ここで、Ｖｐ（ｉ）　は今回のＰレンジ出力学習値、Ｖｐ（ｉ−１）　は前回のＰレンジ出力学習値、Ｖｎｓｗは今回の出力軸センサ１４の出力、Ｒｎｓｗはなまし係数である。
【０２１８】
そして、次のステップ７２５で、Ｐレンジ側突き当て時のエンコーダカウント値の学習値（以下「Ｐレンジ側突き当て学習値」という）ＧＮｐを次式により更新する。
ＧＮｐ（ｉ）　＝ｍｉｎ｛ＧＮｐ（ｉ−１）　，Ｎｃｎｔ｝
【０２１９】
ここで、ＧＮｐ（ｉ）　は今回のＰレンジ側突き当て学習値、ＧＮｐ（ｉ−１）　は前回のＰレンジ側突き当て学習値、Ｎｃｎｔは今回のエンコーダカウント値である。また、関数ｍｉｎはＧＮｐ（ｉ−１）　とＮｃｎｔを比較して小さい方を選択する関数である。尚、エンコーダカウント値Ｎｃｎｔは、前記図８及び図９の初期駆動ルーチンで学習された初期位置ずれ学習値Ｇｃｎｔにより補正された値を用いる。
【０２２０】
この後、ステップ７２６に進み、今回のＰレンジ側突き当て学習値ＧＮｐ（ｉ）　と前回のＰレンジ側突き当て学習値ＧＮｐ（ｉ−１）　が同じであるか否かで、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たった状態になったか否かを判定する。
【０２２１】
図４１に示すように、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たった状態になるまでは、ロータ３２が回転してエンコーダカウント値Ｎｃｎｔが徐々に減少していくため、今回のＰレンジ側突き当て学習値ＧＮｐ（ｉ）　が前回の学習値ＧＮｐ（ｉ−１）　よりも小さくなる。その後、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たった状態になると、ロータ３２の回転が停止して、エンコーダカウント値Ｎｃｎｔが変化しなくなるか、又は、振動するが、学習値ＧＮｐ（ｉ）　は更新されなくなるため、今回のＰレンジ側突き当て学習値ＧＮｐ（ｉ）　と前回のＰレンジ側突き当て学習値ＧＮｐ（ｉ−１）　が同じであるか、又は、今回のＰレンジ側突き当て学習値ＧＮｐ（ｉ）　の方が大きくなる。
【０２２２】
図４０のステップ７２６で、「Ｎｏ」と判定された場合は、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たった状態になっていないため、ステップ７２７に進み、停止時間カウンタＣＴｓｔｏｐをリセットする。
【０２２３】
これに対して、ステップ７２６で、「Ｙｅｓ」と判定された場合は、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たった可能性があると判断して、ステップ７２８に進み、この突き当て状態の時間をカウントする停止時間カウンタＣＴｓｔｏｐをカウントアップする。
【０２２４】
この後、ステップ７２９に進み、停止時間カウンタＣＴｓｔｏｐの値が所定時間Ｋｓｔｏｐ（例えば６０ｍｓ）を越えるまで、Ｐレンジ側突き当て制御を継続する。そして、突き当て状態が所定時間Ｋｓｔｏｐ以上続いた時点で、突き当て状態になっていることが確認できたと判断して、ステップ７３０に進み、Ｐレンジ側突き当て制御を終了するために、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦ、Ｐレンジ側突き当て完了フラグＸｐ＝ＯＮ、Ｐレンジ側突き当て時のエンコーダカウント値Ｎｐ＝ＧＮｐ＋ΔＮｏｖｅｒ（ΔＮｏｖｅｒは乗り上げ補正量）、停止時間カウンタＣＴｓｔｏｐ＝０、ｍｏｄｅ３時間カウンタＣＴ３ｐ＝０、ｍｏｄｅ０時間カウンタＣＴ０ｐ＝０にセットして、本ルーチンを終了する。
【０２２５】
乗り上げ補正量ΔＮｏｖｅｒは、突き当て制御実行時にディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁に突き当たった状態で該係合部２３ａが保持凹部２４，２５の側壁を僅かに乗り上げる角度に相当する。この乗り上げ補正量ΔＮｏｖｅｒは、ＳＲモータ１２の電源電圧であるバッテリ電圧に応じて図３７のテーブルにより設定される。
【０２２６】
突き当て制御実行時に、ディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁を乗り上げる角度（乗り上げ補正量ΔＮｏｖｅｒ）は、ＳＲモータ１２のトルクが大きくなるほど大きくなる。一般に、ＳＲモータ１２のトルクは、その電源電圧（バッテリ電圧）によって変化するため、電源電圧（バッテリ電圧）とＳＲモータ１２のトルクとの間には相関関係があり、電源電圧（バッテリ電圧）をＳＲモータ１２のトルクの代用情報として用いることができる。従って、突き当て制御実行時に、ディテントバネ２３の係合部２３ａがディテントレバー１５の各保持凹部２４，２５の側壁を乗り上げる角度（乗り上げ補正量ΔＮｏｖｅｒ）を、ＳＲモータ１２のトルクの代用情報である電源電圧（バッテリ電圧）に基づいて図３７のテーブルにより算出し、その乗り上げ補正量ΔＮｏｖｅｒだけロータ３２の可動範囲の実測値ΔＮａｃｔを補正するようにすれば、可動範囲の実測値を精度良く求めることができる。
【０２２７】
尚、ディテントレバー１５の各保持凹部２４，２５の側壁の形状をディテントバネ２３の係合部２３ａが乗り上げないように形成すれば、乗り上げ補正量ΔＮｏｖｅｒは必要なくなり、ΔＮａｃｔ＝Ｎｎｐ−Ｎｐとなる。
【０２２８】
［ＮｏｔＰレンジ側突き当て制御］
図４２及び図４３に示すＮｏｔＰレンジ側突き当て制御ルーチンは、指令シフトレンジがＮｏｔＰレンジのときに図３６の遊び量学習ルーチンのステップ７０３で実行されるサブルーチンである。本ルーチンが起動されると、まずステップ７４１で、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＮ（ＮｏｔＰレンジ側突き当て制御終了後）であるか否かを判定し、既にＮｏｔＰレンジ側突き当て制御が終了していれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、ＮｏｔＰレンジ側突き当て制御は、イグニッションスイッチのオン期間中に１回のみ行われる。
【０２２９】
一方、上記ステップ７４１で、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＦＦ（ＮｏｔＰレンジ側突き当て制御終了前）であると判定されれば、ステップ７４２に進み、制御モード判定値ｍｏｄｅが０（通電オフ）、３（目標位置停止保持処理）に該当するか否かを判定する。本ルーチンでは、ロータ３２がＮｏｔＰレンジで停止しているときにＮｏｔＰレンジ側突き当て制御を行うようにするために、制御モード判定値ｍｏｄｅ＝０又は３でＮｏｔＰレンジ側突き当て制御を行うようにしている。
【０２３０】
制御モード判定値ｍｏｄｅ＝０（通電オフ）の場合は、ステップ７４３に進み、ＮｏｔＰレンジでｍｏｄｅ＝０になっている時間をカウントするｍｏｄｅ０時間カウンタＣＴ０ｎｐをカウントアップする。また、制御モード判定値ｍｏｄｅ＝３（目標位置停止保持処理）の場合は、ステップ７４４に進み、ＮｏｔＰレンジでｍｏｄｅ＝３となっている時間をカウントするｍｏｄｅ３時間カウンタＣＴ３ｎｐをカウントアップする。これら２つの時間カウンタＣＴ０ｎｐ，ＣＴ３ｎｐは、ＮｏｔＰレンジでロータ３２の振動が収束して停止状態になるまで待機するのに用いられる。
【０２３１】
尚、制御モード判定値ｍｏｄｅ＝１（通常駆動）、４（反転位置停止保持処理）、５（オープンループ制御）の場合は、ロータ３２がＮｏｔＰレンジで停止していないため、ステップ７６１に進み、時間カウンタＣＴ０ｎｐ，ＣＴ３ｎｐのカウント値をクリアする。
【０２３２】
そして、ステップ７４５で、ｍｏｄｅ０時間カウンタＣＴ０ｎｐの値が停止判定値Ｋ０ｎｐを越えたか否か、又は、ｍｏｄｅ３時間カウンタＣＴ３ｎｐの値が停止判定値Ｋ３ｎｐを越えたか否か判定する。ここで、停止判定値Ｋ０ｎｐは、ＮｏｔＰレンジで制御モード判定値ｍｏｄｅ＝０（通電オフ）のときにロータ３２の振動が収束するのに必要な時間に相当し、停止判定値Ｋ３ｎｐは、ＮｏｔＰレンジで制御モード判定値ｍｏｄｅ＝３（目標位置停止保持処理）のときにロータ３２の振動が収束するのに必要な時間に相当する。
【０２３３】
上記ステップ７４５で、「Ｎｏ」と判定されれば、ロータ３２の振動が収束していないと判断して、ステップ７４６に進み、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦにセットする。この場合は、まだ、ＮｏｔＰレンジ側突き当て制御が実行されない。
【０２３４】
一方、上記ステップ７４５で、「Ｙｅｓ」と判定されれば、ＮｏｔＰレンジでロータ３２の振動が収束したと判断して、ステップ７４７に進み、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮにセットする。
【０２３５】
この後、ステップ７４８に進み、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮであるか否かを判定し、Ｘｅｘｎｐ＝ＯＦＦであれば、ステップ７４９に進み、突き当て目標カウント値Ａｇ＝０、停止時間カウンタＣＴｓｔｏｐ＝０、突き当て制御時間カウンタＣＴｇ＝０にセットして、本ルーチンを終了する。
【０２３６】
これに対して、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮの場合は、ステップ７５０に進み、突き当て目標カウント値Ａｇを所定値Ｋｇｎｐに設定する。この突き当て目標カウント値Ａｇ（Ｋｇｎｐ）は、ＮｏｔＰレンジ側突き当て制御によってディテントバネ２３の係合部２３ａをディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に確実に突き当てることができるように設定される。
【０２３７】
ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮの場合は、後述する図４５の目標カウント値設定ルーチンによって目標カウント値Ａｃｎｔが突き当て目標カウント値Ａｇ（Ｋｇｎｐ）にセットされるため、ＮｏｔＰレンジ側突き当て制御が実行され、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当てられる。
【０２３８】
ＮｏｔＰレンジ側突き当て制御中は、図４３のステップ７５１で、突き当て制御時間カウンタＣＴｇをカウントアップして、ＮｏｔＰレンジ側突き当て制御の実行時間を計測する。そして、次のステップ７５２で、ＮｏｔＰレンジ側突き当て制御の実行時間ＣＴｇが許容最大学習時間Ｋｇ（例えば５００ｍｓ）を越えたか否かを判定する。ＮｏｔＰレンジ側突き当て制御が正常に実行されれば、許容最大学習時間Ｋｇよりも短い時間でディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たった状態になって、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値Ｎｎｐの学習（ＮｏｔＰレンジ側突き当て制御）が終了する。従って、許容最大学習時間Ｋｇを越えてＮｏｔＰレンジ側突き当て制御が終了しない場合は、ＳＲモータ１２の故障やエンコーダ４６の故障等、何等かのシステム異常が発生しているものと思われるため、このような場合は、ＮｏｔＰレンジ側突き当て制御を強制的に終了させるために、ステップ７５３に進み、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦ、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＦＦ、停止時間カウンタＣＴｓｔｏｐ＝０、ｍｏｄｅ３時間カウンタＣＴ３ｎｐ＝０、ｍｏｄｅ０時間カウンタＣＴ０ｎｐ＝０、突き当て制御時間カウンタＣＴｇ＝０にセットして、本ルーチンを終了する。
【０２３９】
これに対して、ＮｏｔＰレンジ側突き当て制御の実行時間ＣＴｇが許容最大学習時間Ｋｇを越えていない場合は、ステップ７５４に進み、出力軸センサ１４のＮｏｔＰレンジ出力学習値Ｖｎｐを次式により更新する。
Ｖｎｐ（ｉ）　＝Ｖｎｐ（ｉ−１）　＋｛Ｖｎｓｗ−Ｖｎｐ（ｉ−１）　｝／Ｒｎｓｗ
ここで、Ｖｎｐ（ｉ）　は今回のＮｏｔＰレンジ出力学習値、Ｖｎｐ（ｉ−１）　は前回のＮｏｔＰレンジ出力学習値、Ｖｎｓｗは今回の出力軸センサ１４の出力、Ｒｎｓｗはなまし係数である。
【０２４０】
そして、次のステップ７５５で、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値の学習値（以下「ＮｏｔＰレンジ側突き当て学習値」という）ＧＮｎｐを次式により更新する。
ＧＮｎｐ（ｉ）　＝ｍａｘ｛ＧＮｎｐ（ｉ−１）　，Ｎｃｎｔ｝
【０２４１】
ここで、ＧＮｎｐ（ｉ）　は今回のＮｏｔＰレンジ側突き当て学習値、ＧＮｎｐ（ｉ−１）　は前回のＮｏｔＰレンジ側突き当て学習値、Ｎｃｎｔは今回のエンコーダカウント値である。また、関数ｍａｘはＧＮｎｐ（ｉ−１）　とＮｃｎｔを比較して大きい方を選択する関数である。尚、エンコーダカウント値Ｎｃｎｔは、前記図８及び図９の初期駆動ルーチンで学習された初期位置ずれ学習値Ｇｃｎｔによって補正された値を用いる。
【０２４２】
この後、ステップ７５６に進み、今回のＮｏｔＰレンジ側突き当て学習値ＧＮｎｐ（ｉ）　と前回のＮｏｔＰレンジ側突き当て学習値ＧＮｎｐ（ｉ−１）　が同じであるか否かで、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たった状態になったか否かを判定する。
【０２４３】
ＮｏｔＰレンジ突き当て制御中に、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たった状態になるまでは、ロータ３２が回転してエンコーダカウント値Ｎｃｎｔが徐々に増加していくため、今回のＮｏｔＰレンジ側突き当て学習値ＧＮｎｐ（ｉ）　が前回の学習値ＧＮｎｐ（ｉ−１）　よりも大きくなる。その後、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たった状態になると、ロータ３２の回転が停止して、エンコーダカウント値Ｎｃｎｔが変化しなくなるか、又は、振動するが、学習値ＧＮｎｐ（ｉ）　は更新されなくなるため、今回のＮｏｔＰレンジ側突き当て学習値ＧＮｎｐ（ｉ）　と前回のＮｏｔＰレンジ側突き当て学習値ＧＮｎｐ（ｉ−１）　が同じであるか、又は、今回のＮｏｔＰレンジ側突き当て学習値ＧＮｎｐ（ｉ）　の方が大きくなる。
【０２４４】
図４３のステップ７５６で、「Ｎｏ」と判定された場合は、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たった状態になっていないため、ステップ７５７に進み、停止時間カウンタＣＴｓｔｏｐをリセットする。
【０２４５】
これに対し、ステップ７５６で、「Ｙｅｓ」と判定された場合は、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たった可能性があると判断して、ステップ７５８に進み、この突き当て状態の時間をカウントする停止時間カウンタＣＴｓｔｏｐをカウントアップする。
【０２４６】
この後、ステップ７５９に進み、停止時間カウンタＣＴｓｔｏｐの値が所定時間Ｋｓｔｏｐ（例えば６０ｍｓ）を越えるまで、ＮｏｔＰレンジ側突き当て制御を継続する。そして、突き当て状態が所定時間Ｋｓｔｏｐ以上続いた時点で、突き当て状態になっていることが確認できたと判断して、ステップ７６０に進み、ＮｏｔＰレンジ側突き当て制御を終了するために、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦ、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＮ、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値Ｎｎｐ＝ＧＮｎｐ−ΔＮｏｖｅｒ（ΔＮｏｖｅｒは乗り上げ補正量）、停止時間カウンタＣＴｓｔｏｐ＝０、ｍｏｄｅ３時間カウンタＣＴ３ｎｐ＝０、ｍｏｄｅ０時間カウンタＣＴ０ｎｐ＝０にセットして、本ルーチンを終了する。
【０２４７】
図４４は、Ｐレンジ側突き当て制御とＮｏｔＰレンジ側突き当て制御の実行タイミングの一例を示すタイムチャートである。図４４の例では、イグニッションスイッチのオン操作後（電源投入後）、暫くして、指令シフトレンジがＰレンジからＮｏｔＰレンジに切り換えられると、目標カウント値ＡｃｎｔがＮｏｔＰレンジの暫定的な目標カウント値（例えば１８°）に設定される。この暫定的な目標カウント値Ａｃｎｔ（１８°）は、ディテントバネ２３の係合部２３ａがディテントレバー１５の両保持凹部２４，２５間の山部を確実に乗り越える回転角度に相当する。従って、Ｆ／Ｂ制御により暫定的な目標カウント値Ａｃｎｔ（１８°）までロータ３２を回転させた後は、ディテントバネ２３の弾性力によってディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の傾斜側壁に沿って底部に落ち込む力を利用して、ロータ３２をＮｏｔＰレンジの目標位置（ＮｏｔＰレンジ保持凹部２５の底部）まで回転させる。
【０２４８】
この後、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮにセットされた時点で、目標カウント値ＡｃｎｔがＮｏｔＰレンジ側の突き当て目標カウント値Ａｇ（Ｋｇｎｐ）にセットされ、ＮｏｔＰレンジ側突き当て制御が実行される。これにより、ディテントバネ２３の係合部２３ａがディテントレバー１５のＮｏｔＰレンジ保持凹部２５の側壁に突き当たったときに、エンコーダカウント値Ｎｎｐ（ＧＮｎｐ）が学習される。この学習終了後、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦにセットされ、ＮｏｔＰレンジ側突き当て制御が終了する。
【０２４９】
その後、指令シフトレンジがＮｏｔＰレンジからＰレンジに切り換えられると、目標カウント値ＡｃｎｔがＰレンジの暫定的な目標カウント値（例えば０°）に設定される。これにより、Ｆ／Ｂ制御により暫定的な目標カウント値Ａｃｎｔ（０°）までロータ３２を回転させた後は、ディテントバネ２３の弾性力によってディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の傾斜側壁に沿って底部に落ち込む力を利用して、ロータ３２をＰレンジの目標位置（Ｐレンジ保持凹部２４の底部）まで回転させる。
【０２５０】
この後、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮにセットされた時点で、目標カウント値ＡｃｎｔがＰレンジ側の突き当て目標カウント値Ａｇ（Ｋｇｐ）にセットされ、Ｐレンジ側突き当て制御が実行される。これにより、ディテントバネ２３の係合部２３ａがディテントレバー１５のＰレンジ保持凹部２４の側壁に突き当たったときに、エンコーダカウント値Ｎｐ（ＧＮｐ）が学習される。この学習終了後、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦにセットされ、Ｐレンジ側突き当て制御が終了する。
【０２５１】
［目標カウント値設定］
図４５及び図４６に示す目標カウント値設定ルーチンは、初期駆動終了後に所定周期（例えば８ｍｓ周期）で実行される。本ルーチンが起動されると、まずステップ７７１で、突き当て制御実行中（Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮ又はＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮ）であるか否かを判定し、突き当て制御実行中であれば、ステップ７７２に進み、目標カウント値Ａｃｎｔを突き当て目標カウント値Ａｇに設定する。この突き当て目標カウント値Ａｇは、図３９のステップ７２０又は図４２のステップ７５０で設定される。
【０２５２】
一方、突き当て制御実行中でなければ、ステップ７７３に進み、指令シフトレンジがＰレンジであるか否かを判定し、Ｐレンジであれば、ステップ７７４に進み、Ｐレンジ側突き当て制御を完了したか否か（Ｐレンジ側突き当て完了フラグＸｐ＝ＯＮであるか否か）を判定し、Ｐレンジ側突き当て制御が完了していれば、ステップ７７５に進み、Ｐレンジの目標カウント値Ａｃｎｔを次式により算出する。
Ａｃｎｔ＝Ｎｐ＋ΔＧｐ
【０２５３】
ここで、ＮｐはＰレンジ側突き当て時のエンコーダカウント値であり、図３９及び図４０のＰレンジ側突き当て制御ルーチンによって学習した値ＧＮｐが用いられる。また、ΔＧｐはＰレンジ側の遊び量の学習値であり、図３６の遊び量学習ルーチンのステップ７０６で、今回の遊び量の学習値ΔＧｐが算出されてＥＣＵ４１の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値が用いられる。
【０２５４】
一方、Ｐレンジ側突き当て制御が完了していない場合は、ステップ７７４で「Ｎｏ」と判定されて、ステップ７７６に進み、ＮｏｔＰレンジ側突き当て制御を完了したか否か（ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＮであるか否か）を判定し、ＮｏｔＰレンジ側突き当て制御が完了していれば、ステップ７７７に進み、Ｐレンジの目標カウント値Ａｃｎｔを次式により算出する。
Ａｃｎｔ＝Ｎｎｐ−ΔＮａｃｔ＋ΔＧｐ
【０２５５】
ここで、Ｎｎｐは、ＮｏｔＰレンジ側突き当て時のエンコーダカウント値で、図４２及び図４３のＮｏｔＰレンジ側突き当て制御ルーチンによって学習した値ＧＮｎｐが用いられる。また、ΔＮａｃｔは可動範囲の実測値であり、図３６の遊び量学習ルーチンのステップ７０５で、今回の可動範囲の実測値ΔＮａｃｔが算出されてＥＣＵ４１の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値が用いられる。
【０２５６】
尚、Ｐレンジ側とＮｏｔＰレンジ側の突き当て制御が両方とも完了していない場合（Ｐレンジ側・ＮｏｔＰレンジ側の両突き当て完了フラグＸｐ，Ｘｎｐが両方ともＯＦＦの場合）は、Ｐレンジ側突き当て時及びＮｏｔＰレンジ側突き当て時のエンコーダカウント値Ｎｐ，Ｎｎｐが学習されていないため、遊び量ΔＧｐ，ΔＧｎｐによる目標カウント値Ａｃｎｔの補正を行うことができない。従って、この場合は、ステップ７７８に進み、Ｐレンジの目標カウント値ＡｃｎｔをＰレンジの暫定的な目標カウント値である０に設定する。
【０２５７】
一方、上記ステップ７７３で、指令シフトレンジがＮｏｔＰレンジと判定された場合は、図４６のステップ７７９に進み、ＮｏｔＰレンジ側突き当て制御を完了したか否か（ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＮであるか否か）を判定し、ＮｏｔＰレンジ側突き当て制御が完了していれば、ステップ７８０に進み、ＮｏｔＰレンジの目標カウント値Ａｃｎｔを次式により算出する。
Ａｃｎｔ＝Ｎｎｐ−ΔＧｎｐ
【０２５８】
ここで、ΔＧｎｐはＮｏｔＰレンジ側の遊び量の学習値であり、図３６の遊び量学習ルーチンのステップ７０６で、今回の遊び量の学習値ΔＧｎｐが算出されてＥＣＵ４１の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値が用いられる。
【０２５９】
一方、ＮｏｔＰレンジ側突き当て制御が完了していない場合は、ステップ７７９で「Ｎｏ」と判定されて、ステップ７８１に進み、Ｐレンジ側突き当て制御を完了したか否か（Ｐレンジ側突き当て完了フラグＸｐ＝ＯＮであるか否か）を判定し、Ｐレンジ側突き当て制御が完了していれば、ステップ７８２に進み、ＮｏｔＰレンジの目標カウント値Ａｃｎｔを次式により算出する。
Ａｃｎｔ＝Ｎｐ＋ΔＮａｃｔ−ΔＧｎｐ
【０２６０】
尚、Ｐレンジ側とＮｏｔＰレンジ側の突き当て制御が両方とも完了していない場合（Ｐレンジ側・ＮｏｔＰレンジ側の両突き当て完了フラグＸｐ，Ｘｎｐが両方ともＯＦＦの場合）は、ステップ７８３に進み、ＮｏｔＰレンジの目標カウント値ＡｃｎｔをＮｏｔＰレンジの暫定的な目標カウント値Ｋｎｏｔｐ（例えば、１８．５°）に設定する。
【０２６１】
尚、本ルーチンでは、目標カウント値Ａｃｎｔを設定する際に、遊び量の学習値ΔＧｐ，ΔＧｎｐと可動範囲の実測値ΔＮａｃｔについては、ＥＣＵ４１の不揮発性メモリの記憶値が更新されるまでは、該不揮発性メモリに記憶されている前回値を用いるようにしたが、該不揮発性メモリの記憶値が更新されるまで、暫定的な目標カウント値（０又はＫｎｏｔｐ）に設定するようにしても良い。
【０２６２】
［リカバリ処理］
図５１に示すリカバリ処理ルーチンは、所定周期（例えば１ｍｓ周期）で起動され、Ｆ／Ｂ制御状態が異常になったときにリカバリ処理を次のようにして実行する。本ルーチンが起動されると、まずステップ８０１で、リカバリ処理実行フラグＸｒｃｖがＯＦＦであるか否かを判定し、Ｘｒｃｖ＝ＯＦＦ（リカバリ処理実行中でない）の場合は、ステップ８０２に進み、次の▲１▼〜▲４▼のリカバリ処理実行条件が成立しているか否かを判定する。
【０２６３】
▲１▼エンコーダ４６のＡ相信号、Ｂ相信号、出力軸センサ１４の出力信号が全て正常であること
▲２▼後述する図５６のシステム異常診断ルーチンでセットされる各異常検出フラグＸｆｎｓｗ、Ｘｆｃｎｔ、Ｘｆｒｃｖが全てＯＦＦ（異常なし）であること
▲３▼Ｆ／Ｂ許可フラグＸｆｂがＯＮ（Ｆ／Ｂ制御中）であること
▲４▼後述する図５３のＡＢ相信号異常検出ルーチンでセットされるＡ相信号、Ｂ相信号に関する３つの異常検出フラグＸｆａｂ、Ｘｆｔａ、ＸｆｔｂのいずれかがＯＮ（異常あり）であること、又は、後述する図５５の逆転判定ルーチンでセットされる逆転検出フラグＸｒがＯＮ（逆転あり）であること
【０２６４】
これら４つの条件▲１▼〜▲４▼のうち、１つでも満たさない条件があれば、リカバリ処理実行条件が不成立となり、以降の処理を行うことなく、本ルーチンを終了する。
【０２６５】
これに対し、上記▲１▼〜▲４▼の条件を全て満たせば、リカバリ処理実行条件が成立し、ステップ８０２からステップ８０３に進み、リカバリ処理実行フラグＸｒｃｖをＯＮにセットし、次のステップ８０４で、図５２に示す関係に基づいて、現在の出力軸センサ１４の出力信号Ｖｎｓｗを用いて現在の位置カウント値Ｎｃｎｔｏｐを次式により算出する。
2004048837.tif 000003
【０２６６】
ここで、ＩＮＴは［　］内の数値を整数化する関数であり、Ｖｐは出力軸センサ１４のＰレンジ出力学習値、Ｖｎｐは出力軸センサ１４のＮｏｔＰレンジ出力学習値、Ｋｏｐはディテントレバー１５の最大回転角、ＫｏｆｐはＰレンジ側のオフセット値である。上式は、位置カウント値Ｎｃｎｔｏｐを２の倍数とするように設定されている。
【０２６７】
ディテントレバー１５の最大回転角Ｋｏｐは、ディテントレバー１５のＰレンジ保持凹部２４の側壁からＮｏｔＰレンジ保持凹部２５の側壁までのディテントレバー１５の回転角であり、図３８に示す関係に基づいて、可動範囲の設計値ΔＮｄとＰレンジ側の遊び量ΔＧｐとを加算して求められる。本実施形態では、ΔＮｄ＝２０．５（ｄｅｇ）、ΔＧｐ＝３（ｄｅｇ）となっている。
2004048837.tif 000004
【０２６８】
上記位置カウント値Ｎｃｎｔｏｐの算出式において、Ｋｏｐ×６１／３．７５はディテントレバー１５の最大回転角Ｋｏｐをモータ駆動ステップ数（励磁回数）に換算した値である。「６１」は減速機構２６の減速比であり、「３．７５」は１ステップ（励磁１回当たり）のロータ３２の回転角である。この位置カウント値Ｎｃｎｔｏｐは、オープンループ制御開始時の位置カウント値Ｎｃｎｔｏｐの初期値として用いられる。
【０２６９】
位置カウント値Ｎｃｎｔｏｐの算出後、ステップ８０５に進み、リカバリ処理の実行回数をカウントするリカバリ処理実行回数カウンタＣｒｃｖをカウントアップし、次のステップ８０６で、オープンループ制御実行フラグＸｏｐｅｎをＯＮにセットして、後述する図６０のオープンループ制御ルーチンによりオープンループ制御を実行する。
【０２７０】
リカバリ処理（オープンループ制御）の実行中は、本ルーチンが起動される毎に、ステップ８０１で「Ｎｏ」と判定されて、ステップ８０７に進み、オープンループ制御完了フラグＸｏｐｃｍｐがオープンループ制御完了を意味するＯＮにセットされているか否かを判定し、Ｘｏｐｃｍｐ＝ＯＦＦであれば、そのまま本ルーチンを終了し、オープンループ制御を継続する。
【０２７１】
その後、オープンループ制御が完了した時点で、ステップ８０８に進み、初期駆動を再実行するために、初期駆動終了フラグＸｅｎｄ＝ＯＦＦ（初期駆動未終了）、レンジ切換操作フラグＸｃｈｇ＝ＯＦＦ（レンジ切換操作なし）、通電時間カウンタＣＴ＝０、励磁回数カウンタＣＡＳＥ＝０、エンコーダカウント値Ｎｃｎｔ＝０、初期位置ずれ学習値Ｇｃｎｔ＝０にセットする。更に、ステップ８０９で、突き当て制御を再実行するために、Ｐレンジ側突き当て完了フラグＸｐ＝ＯＦＦ（Ｐレンジ側突き当て制御未終了）、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＦＦ（ＮｏｔＰレンジ側突き当て制御未終了）にセットする。そして、次のステップ８１０で、制御モード判定値ｍｏｄｅ＝初期値「＄ＦＦ」にセットした後、ステップ８１１に進み、オープンループ制御実行フラグＸｏｐｅｎ＝ＯＦＦにセットしてオープンループ制御（リカバリ処理）を終了する。更に、次のステップ８１２で、リカバリ処理実行フラグＸｒｃｖ＝ＯＦＦ、Ａ相信号、Ｂ相信号の異常検出フラグＸｆａｂ＝ＯＦＦ、Ｘｆｔａ＝ＯＦＦ、Ｘｆｔｂ＝ＯＦＦ、後述する第３の異常検出フラグＸｆｒｃｖ＝ＯＦＦにセットする。
【０２７２】
［ＡＢ相信号異常検出］
図５３に示すＡＢ相信号異常検出ルーチンは、所定周期（例えば１ｍｓ周期）で起動され、エンコーダ４６のＡ相信号とＢ相信号の異常の有無を次のようにして判定する。本ルーチンが起動されると、まずステップ８２１で、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＮ、且つ、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦ、且つ、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦであるか否か、つまり、現在、Ｆ／Ｂ制御中で、且つ突き当て制御を実行していない状態であるか否かを判定する。このステップ８２１で「Ｎｏ」と判定された場合、つまり、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ、又は、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮ、又は、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮの場合は、ステップ８２２に進み、Ａ相信号カウンタＮａ＝０、Ｂ相信号カウンタＮｂ＝０、Ａ相信号エッジ間隔カウンタΔＴａ＝０、Ｂ相信号エッジ間隔カウンタΔＴｂ＝０にリセットして本ルーチンを終了する。
【０２７３】
これに対して、ステップ８２１で「Ｙｅｓ」と判定された場合は、ＡＢ相信号異常判定実行条件が成立して、ステップ８２３に進み、Ａ相信号カウント値ＮａとＢ相信号カウント値Ｎｂとの偏差ΔＮａｂを算出する。
ΔＮａｂ＝｜Ｎａ−Ｎｂ｜
ここで、Ａ相信号カウント値ＮａとＢ相信号カウント値Ｎｂは、Ａ相信号のエッジとＢ相信号のエッジを別々にカウントした値である。
【０２７４】
そして、次のステップ８２４で、ＡＢ相信号カウント値偏差ΔＮａｂを異常判定値Ｋａｂ（例えば３）と比較し、もし、ＡＢ相信号カウント値偏差ΔＮａｂが異常判定値Ｋａｂ以上であれば、Ａ相信号カウント値ＮａとＢ相信号カウント値Ｎｂのいずれかが異常であると判断して、ステップ８２５に進み、ＡＢ相信号異常検出フラグＸｆａｂをＯＮ（異常あり）にセットして、次のステップ８２６に進む。
【０２７５】
一方、ＡＢ相信号カウント値偏差ΔＮａｂが異常判定値Ｋａｂ未満の場合は、ＡＢ相信号異常検出フラグＸｆａｂをＯＦＦ（異常なし）に維持してステップ８２６に進む。
【０２７６】
Ｆ／Ｂ制御中にＡ相信号とＢ相信号が正常に出力されていれば、Ａ相信号カウント値ＮａとＢ相信号カウント値Ｎｂとの偏差ΔＮａｂが０又は１となるため、このＡＢ相信号カウント値偏差ΔＮａｂが２以上になれば、いずれか一方の信号の抜けやノイズパルスの混入が考えられる（図４８参照）。従って、ＡＢ相信号カウント値偏差ΔＮａｂが異常判定値Ｋａｂ以上であるか否かで、Ａ相信号とＢ相信号の異常の有無を判定することができる。本実施形態では、異常判定値Ｋａｂを余裕を見て３に設定したが、２又は４以上の値に設定しても良い。
【０２７７】
以上のようにして、ＡＢ相信号カウント値偏差ΔＮａｂによる異常判定処理を行った後、ステップ８２６に進み、Ａ相信号のエッジ間隔ΔＴａとＢ相信号のエッジ間隔ΔＴｂをカウントするカウンタをそれぞれカウントアップした後、ステップ８２７に進み、Ａ相信号エッジ間隔ΔＴａを異常判定値Ｋｔａ（例えばΔＴａの平均値の１０倍の値）と比較し、もし、Ａ相信号エッジ間隔ΔＴａが異常判定値Ｋｔａ以上であれば、Ａ相信号が異常であると判断して、ステップ８２８に進み、Ａ相信号異常検出フラグＸｆｔａをＯＮ（異常あり）にセットして、次のステップ８２９に進む。
【０２７８】
一方、Ａ相信号エッジ間隔ΔＴａが異常判定値Ｋｔａ未満の場合は、Ａ相信号異常検出フラグＸｆｔａをＯＦＦ（異常なし）に維持してステップ８２９に進む。そして、このステップ８２９で、Ｂ相信号エッジ間隔ΔＴｂを異常判定値Ｋｔｂ（例えばΔＴｂの平均値の１０倍の値）と比較し、もし、Ｂ相信号エッジ間隔ΔＴｂが異常判定値Ｋｔｂ以上であれば、Ｂ相信号が異常であると判断して、ステップ８３０に進み、Ｂ相信号異常検出フラグＸｆｔｂをＯＮ（異常あり）にセットして本ルーチンを終了する。
【０２７９】
一方、Ｂ相信号エッジ間隔ΔＴｂが異常判定値Ｋｔｂ未満の場合は、Ｂ相信号異常検出フラグＸｆｔｂをＯＦＦ（異常なし）に維持して、本ルーチンを終了する。
【０２８０】
各信号のエッジ間隔ΔＴａ，ΔＴｂは、ロータ回転速度に応じて変化するため、Ｆ／Ｂ制御中に、各信号のエッジ間隔ΔＴａ，ΔＴｂが長くなり過ぎる場合は、ロータ３２の異常停止、異常速度低下、パルス抜けが考えられるため（図４８参照）、各信号のエッジ間隔ΔＴａ，ΔＴｂが異常判定値Ｋｔａ，Ｋｔａ（例えばΔＴａ，ΔＴｂの平均値の１０倍）以上であるか否かで、Ａ相信号とＢ相信号の異常の有無を判定することができる。
【０２８１】
尚、各信号のエッジ間隔ΔＴａ，ΔＴｂが短くなり過ぎる場合は、ノイズパルスが正規のパルス信号と誤認されている可能性があるため、各信号のエッジ間隔ΔＴａ，ΔＴｂが所定の異常判定値以下であるか否かで、Ａ相信号とＢ相信号の異常の有無を判定するようにしても良い。
【０２８２】
また、ＡＢ相信号カウント値偏差ΔＮａｂによる異常判定処理（ステップ８２３〜８２５）と各信号のエッジ間隔ΔＴａ，ΔＴｂによる異常判定処理（ステップ８２６〜８３０）のいずれか一方の処理のみを行い、他方の処理を省略するようにしても良い。
以上説明したＡＢ相信号異常検出ルーチンは、特許請求の範囲でいう異常監視手段としての役割を果たす。
【０２８３】
［逆転カウンタ］
図５４に示す逆転カウンタルーチンは、ＡＢ相割り込み処理により実行され、ロータ３２の回転方向が回転方向指示に反して連続して逆転した回数を次のようにしてカウントする。本ルーチンが起動されると、まずステップ８３１で、回転方向指示値Ｄが１（Ｐレンジ→ＮｏｔＰレンジの回転方向）、０（停止）、−１（ＮｏｔＰレンジ→Ｐレンジの回転方向）のいずれに該当するかを判定し、回転方向指示値Ｄが０（停止）であれば、以降の処理を行うことなく、本ルーチンを終了する。
【０２８４】
一方、回転方向指示値Ｄが１（Ｐレンジ→ＮｏｔＰレンジの回転方向）であれば、ステップ８３２に進み、前回のエンコーダカウント値Ｎｃｎｔ（ｉ−１）　と今回のエンコーダカウント値Ｎｃｎｔ（ｉ）　との差が１以上であるか否かで、ロータ３２の回転方向が回転方向指示に反して逆転したか否か（エンコーダカウント値Ｎｃｎｔが減少したか否か）を判定し、逆転していれば、ステップ８３４に進み、逆転回数をカウントする逆転カウンタＣｒをカウントアップし、逆転していなければ、ステップ８３５に進み、逆転カウンタＣｒを０にリセットする。
【０２８５】
また、回転方向指示値Ｄが−１（ＮｏｔＰレンジ→Ｐレンジの回転方向）であれば、ステップ８３３に進み、前回のエンコーダカウント値Ｎｃｎｔ（ｉ−１）　と今回のエンコーダカウント値Ｎｃｎｔ（ｉ）　との差が−１以下であるか否かで、ロータ３２の回転方向が回転方向指示に反して逆転したか否か（エンコーダカウント値Ｎｃｎｔが増加したか否か）を判定し、逆転していれば、ステップ８３６に進み、逆転カウンタＣｒをカウントアップし、逆転していなければ、ステップ８３５に進み、逆転カウンタＣｒを０にリセットする。
【０２８６】
［逆転判定］
図５５に示す逆転判定ルーチンは、所定周期（例えば１ｍｓ周期）で起動され、図５４の逆転カウンタルーチンと共に特許請求の範囲でいう異常監視手段としての役割を果たす。
【０２８７】
本ルーチンが起動されると、まずステップ８４１で、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＮ、且つ、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦ、且つ、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦであるか否か、つまり、現在、Ｆ／Ｂ制御中で、且つ突き当て制御を実行していない状態であるか否かを判定する。このステップ８４１で「Ｎｏ」と判定された場合、つまり、Ｆ／Ｂ許可フラグＸｆｂ＝ＯＦＦ、又は、Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＮ、又は、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＮの場合は、ステップ８４４に進み、逆転検出フラグＸｒをＯＦＦにセットして、本ルーチンを終了する。
【０２８８】
これに対して、ステップ８４１で「Ｙｅｓ」と判定された場合は、逆転判定実行条件が成立して、ステップ８４２に進み、図５４の逆転カウンタルーチンで求めた逆転カウント値Ｃｒが異常判定値Ｋｒ（例えば４）以上であるか否かで、ロータ３２が回転方向指示に反して逆転し続けているか否かを判定し、逆転カウント値Ｃｒが異常判定値Ｋｒ以上であれば、ステップ８４３に進み、逆転検出フラグＸｒをＯＮにセットして逆転の判定を確定し、逆転カウント値Ｃｒが異常判定値Ｋｒ未満であれば、ステップ８４４に進み、逆転検出フラグＸｒをＯＦＦに維持する。
【０２８９】
［システム異常診断］
図５６に示すシステム異常診断ルーチンは、所定周期（例えば８ｍｓ周期）で起動され、次のようにしてシステム全体の異常診断を実行する。本ルーチンが起動されると、まずステップ８５１で、次の▲１▼〜▲３▼の異常診断実行条件が成立しているか否かを判定する。
【０２９０】
▲１▼イグニッションスイッチ（図示せず）の操作によりＥＣＵ４１に電源が投入された後、所定時間（例えば１ｓ）が経過していること
▲２▼突き当て制御中でないこと（Ｐレンジ側突き当て制御中フラグＸｅｘｐ＝ＯＦＦ、且つ、ＮｏｔＰレンジ側突き当て制御中フラグＸｅｘｎｐ＝ＯＦＦであること）
▲３▼リカバリ処理実行中でないこと（リカバリ処理実行フラグＸｒｃｖ＝ＯＦＦであること）
これら３つの条件▲１▼〜▲３▼のうち、１つでも満たさない条件があれば、異常診断実行条件が不成立となり、ステップ８５２に進み、後述する仮異常状態継続時間カウンタＣｆｎｓｗ、Ｃｆｃｎｔを０にリセットして、本ルーチンを終了する。
【０２９１】
これに対し、上記▲１▼〜▲３▼の条件を全て満たせば、異常診断実行条件が成立し、ステップ８５１からステップ８５３に進み、突き当て制御が完了しているか否か（Ｐレンジ側突き当て完了フラグＸｐ＝ＯＮ、且つ、ＮｏｔＰレンジ側突き当て完了フラグＸｎｐ＝ＯＮであるか否か）を判定する。その結果、突き当て制御が完了していると判定されれば、ステップ８５４に進み、出力軸センサ１４が正常で、且つ、指令シフトレンジと、出力軸センサ１４の出力信号Ｖｎｓｗから判定したレンジとが一致しているか否かを判定し、その判定結果が「Ｙｅｓ」であれば、ステップ８５６に進み、第１の仮異常状態継続時間カウンタＣｆｎｓｗを０にリセットする。
【０２９２】
これに対し、上記ステップ８５４の判定結果が「Ｎｏ」であれば、ステップ８５５に進み、第１の仮異常状態継続時間カウンタＣｆｎｓｗをカウントアップして、指令シフトレンジと出力軸センサ１４の出力信号Ｖｎｓｗとが一致していない状態の継続時間を計測し、次のステップ８５７で、第１の仮異常状態継続時間カウンタＣｆｎｓｗの値が異常判定値Ｋｆｎｓｗよりも大きいか否かを判定する。ここで、異常判定値Ｋｆｎｓｗは、正常なレンジ切換動作に要する最長時間よりも十分に長い時間（例えば１０ｓ）に設定されている。従って、第１の仮異常状態継続時間カウンタＣｆｎｓｗの値が異常判定値Ｋｆｎｓｗよりも大きければ、レンジ切換動作が正常に行われない状態になっているため、システムの異常ありと判断して、ステップ８５８に進み、第１の異常検出フラグＸｆｎｓｗをＯＮにセットする。上記ステップ８５７の判定結果が「Ｎｏ」であれば、第１の異常検出フラグＸｆｎｓｗをＯＦＦ（異常なし）に維持する。
【０２９３】
以上のようにして、出力軸センサ１４の出力信号Ｖｎｓｗを用いて１回目の異常診断を行った後、図５７のステップ８５９に進み、エンコーダカウント値Ｎｃｎｔと目標カウント値Ａｃｎｔとの偏差｜Ｎｃｎｔ−Ａｃｎｔ｜が所定値Ｋｃｎｔ（例えば５°相当値）よりも大きいか否かを判定し、このカウント値偏差｜Ｎｃｎｔ−Ａｃｎｔ｜が所定値Ｋｃｎｔ以下であれば、ステップ８６１に進み、第２の仮異常状態継続時間カウンタＣｆｃｎｔを０にリセットする。
【０２９４】
これに対し、上記ステップ８５９の判定結果が「Ｙｅｓ」であれば、ステップ８６０に進み、第２の仮異常状態継続時間カウンタＣｆｃｎｔをカウントアップして、カウント値偏差｜Ｎｃｎｔ−Ａｃｎｔ｜が所定値Ｋｃｎｔよりも大きい状態の継続時間を計測し、次のステップ８６２で、第２の仮異常状態継続時間カウンタＣｆｃｎｔの値が異常判定値Ｋｆｃｎｔよりも大きいか否かを判定する。ここで、異常判定値Ｋｆｃｎｔは、正常なレンジ切換動作に要する最長時間より十分に長い時間（例えば１０ｓ）に設定されている。従って、第２の仮異常状態継続時間カウンタＣｆｃｎｔの値が異常判定値Ｋｆｃｎｔよりも大きければ、レンジ切換動作が正常に行われない状態になっているため、システムの異常ありと判断して、ステップ８６３に進み、第２の異常検出フラグＸｆｃｎｔをＯＮにセットする。上記ステップ８６２の判定結果が「Ｎｏ」であれば、第２の異常検出フラグＸｆｃｎｔをＯＦＦ（異常なし）に維持する。
【０２９５】
以上のようにして、カウント値偏差｜Ｎｃｎｔ−Ａｃｎｔ｜を用いて２回目の異常診断を行った後、ステップ８６４に進み、図５１のリカバリ処理ルーチンのステップ８０５でカウントされるリカバリ処理実行回数Ｃｒｃｖが異常判定値Ｋｃｒｖ（例えば３回）以上であるか否かを判定し、リカバリ処理実行回数Ｃｒｃｖが異常判定値Ｋｃｒｖ以上であれば、ステップ８６５に進み、システムの異常ありと判断して、ステップ８６５に進み、第３の異常検出フラグＸｆｒｃｖをＯＮにセットして本ルーチンを終了する。つまり、リカバリ処理が連続して異常判定値Ｋｃｒｖ（例えば３回）以上も繰り返される場合は、Ｆ／Ｂ制御系が正常に機能しない状態になっているため、システムの異常ありと判断するものである。
【０２９６】
一方、リカバリ処理実行回数Ｃｒｃｖが異常判定値Ｋｃｒｖ未満であれば、第３の異常検出フラグＸｆｒｃｖをＯＦＦ（異常なし）に維持して本ルーチンを終了する。
【０２９７】
［フェールセーフ処理］
図５８に示すフェールセーフ処理ルーチンは、所定周期（例えば８ｍｓ周期）で起動され、次のようにしてフェールセーフ処理を実行する。本ルーチンが起動されると、まずステップ９０１で、次の▲１▼、▲２▼のフェールセーフ処理実行条件が成立しているか否かを判定する。
【０２９８】
▲１▼オープンループ制御によるレンジ切り換えが可能な状態であること（システム故障フラグＸｆａｉｌｏｆｆ＝ＯＦＦであること）
▲２▼図５６のシステム異常診断ルーチンでセットされる３つの異常検出フラグＸｆｎｓｗ、Ｘｆｃｎｔ、Ｘｆｒｃｖのうちの少なくとも１つがＯＮ（異常あり）であること
これら２つの条件▲１▼、▲２▼のうち、いずれか一方でも満たさない条件があれば、フェールセーフ処理実行条件が不成立となり、以降の処理を行うことなく、本ルーチンを終了する。
【０２９９】
これに対し、上記２つの条件▲１▼、▲２▼を両方とも満たせば、フェールセーフ処理実行条件が成立し、ステップ９０１からステップ９０２に進み、フェールセーフ処理実行フラグＸｆｓｏｐをＯＮにセットし、次のステップ９０３で、警告ランプを点灯したり、或は、メータパネルの情報表示部等に警告表示して、運転者に警告する。
【０３００】
この後、ステップ９０４に進み、前回のフェールセーフ処理終了後の経過時間を計測するフェールセーフ処理間隔カウンタＣｆｓｏｐの値が所定値Ｋｆｓｏｐ未満であるか否かを判定する。ここで、所定値Ｋｆｓｏｐは、前回のフェールセーフ処理終了後にディテントバネ２３の弾性力によってディテントバネ２３の係合部２３ａがディテントレバー１５の保持凹部２４，２５の傾斜側壁に沿ってその底部に滑り落ちるのに要する時間よりもある程度長い時間（例えば５００ｍｓ）に設定されている。
【０３０１】
フェールセーフ処理間隔カウンタＣｆｓｏｐの値（前回のフェールセーフ処理終了後の経過時間）が所定値Ｋｆｓｏｐ未満であれば、ステップ９０５に進み、フェールセーフ処理間隔カウンタＣｆｓｏｐをカウントアップして前回のフェールセーフ処理終了後の経過時間をカウントする。この後、ステップ９０６に進み、全相の通電をオフした状態を継続し、次のステップ９０７で、通電フラグＸｏｎを通電オフを意味するＯＦＦにセットして本ルーチンを終了する。これにより、前回のフェールセーフ処理終了後の経過時間が所定値Ｋｆｓｏｐを越えるまでは、全相の通電をオフした状態に維持される。
【０３０２】
その後、フェールセーフ処理間隔カウンタＣｆｓｏｐの値（前回のフェールセーフ処理終了後の経過時間）が所定値Ｋｆｓｏｐ以上になった時点で、ステップ９０４からステップ９０８に進み、オープンループ制御実行フラグＸｏｐｅｎがＯＦＦであるか否かを判定し、ＯＦＦであれば、ステップ９０９に進み、レンジ切換操作が行われたか否かを判定する。その結果、レンジ切換操作が行われていないと判定されれば、ステップ９１０に進み、全相の通電をオフした状態を継続する。
【０３０３】
これに対して、上記ステップ９０９で、レンジ切換操作が行われたと判定されれば、ステップ９１１に進み、前記図５１のリカバリ処理ルーチンのステップ８０４と同じ方法で、現在の出力軸センサ１４の出力信号Ｖｎｓｗを用いて現在の位置カウント値Ｎｃｎｔｏｐを算出する。この位置カウント値Ｎｃｎｔｏｐは、オープンループ制御開始時の位置カウント値Ｎｃｎｔｏｐの初期値として用いられる。
【０３０４】
この後、ステップ９１２に進み、オープンループ制御実行フラグＸｏｐｅｎをＯＮにセットして、後述する図６０のオープンループ制御ルーチンによりオープンループ制御を実行し、次のステップ９１３で、フェールセーフ処理の実行回数をカウントするフェールセーフ処理実行回数カウンタＣｆｓをカウントアップして、本ルーチンを終了する。
【０３０５】
また、前記ステップ９０８で、オープンループ制御実行フラグＸｏｐｅｎがＯＮであると判定されれば、図５９のステップ９１４に進み、オープンループ制御完了フラグＸｏｐｃｍｐがオープンループ制御完了を意味するＯＮにセットされているか否かを判定し、Ｘｏｐｃｍｐ＝ＯＦＦであれば、以降の処理を行うことなく、本ルーチンを終了する。
【０３０６】
これに対し、ステップ９１４で、オープンループ制御完了フラグＸｏｐｃｍｐがＯＮにセットされていると判定されれば、ステップ９１５に進み、指令シフトレンジと、出力軸センサ１４の出力信号Ｖｎｓｗから判定したレンジとが一致しているか否かを判定し、その判定結果が「Ｙｅｓ」であれば、ステップ９１６に進み、フェールセーフ処理実行回数カウンタＣｆｓを０にリセットする。そして、次のステップ９１８で、オープンループ制御完了フラグＸｏｐｃｍｐをＯＦＦにセットすると共に、次のステップ９１９で、オープンループ制御実行フラグＸｏｐｅｎをＯＦＦにセットして、本ルーチンを終了する。
【０３０７】
また、上記ステップ９１５で、指令シフトレンジと出力軸センサ１４の出力信号Ｖｎｓｗとが一致していないと判定された場合は、ステップ９１７に進み、フェールセーフ処理実行回数カウンタＣｆｓの値が故障判定値（例えば３回）以上であるか否かを判定し、フェールセーフ処理実行回数カウンタＣｆｓの値が故障判定値未満であれば、まだ故障とは判定せずに、オープンループ制御完了フラグＸｏｐｃｍｐ＝ＯＦＦ、オープンループ制御実行フラグＸｏｐｅｎ＝ＯＦＦにセットして（ステップ９１８、９１９）、本ルーチンを終了する。
【０３０８】
その後、フェールセーフ処理実行回数カウンタＣｆｓの値が故障判定値（例えば３回）以上になれば、その時点で、システムの故障（オープンループ制御でもレンジ切り換えが不可能な状態）と判断して、ステップ９１７からステップ９２０に進み、システム故障フラグＸｆａｉｌｏｆｆをＯＮにセットし、次のステップ９２１で、全相の通電をオフして、本ルーチンを終了する。
【０３０９】
［オープンループ制御］
図６０に示すオープンループ制御ルーチンは、所定周期（例えば１ｍｓ周期）で起動され、次のようにしてオープンループ制御を実行する。本ルーチンが起動されると、まずステップ９３１で、オープンループ制御実行フラグＸｏｐｅｎがＯＮにセットされているか否かを判定し、Ｘｏｐｅｎ＝ＯＦＦであれば、以降の処理を行うことなく、本ルーチンを終了する。
【０３１０】
これに対し、オープンループ制御実行フラグＸｏｐｅｎがＯＮにセットされていれば、ステップ９３１からステップ９３２に進み、時間を計測する時間カウンタＴｏｐをカウントアップし、次のステップ９３３で、時間カウンタＴｏｐの値が現在の通電相の励磁時間ｔｍ以上になったか否かを判定し、励磁時間ｔｍ未満であれば、以降の処理を行うことなく、本ルーチンを終了する。これにより、ステップ９３４以降の処理は、励磁時間ｔｍ毎に実行される。
【０３１１】
その後、時間カウンタＴｏｐの値が現在の通電相の励磁時間ｔｍ以上になった時点で、ステップ９３３からステップ９３４に進み、目標カウント値Ａｃｎｔと現在の位置カウント値Ｎｃｎｔｏｐとを比較して、ロータ３２の駆動方向を判定する。その結果、現在の位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔよりも小さい場合は、ロータ３２の駆動方向がＰレンジ側からＮｏｔＰレンジ側への回転方向（正回転方向）と判断して、ステップ９３５に進み、通電相判定値Ｍｐｔｎｏｐを１ずつカウントアップし、次のステップ９３６で、位置カウント値Ｎｃｎｔｏｐを２ずつカウントアップする。これは、１回の励磁でロータ３２が２カウント分（３．７５°）回転するためである。
【０３１２】
これに対し、現在の位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔよりも大きい場合は、ロータ３２の駆動方向がＮｏｔＰレンジ側からＰレンジ側への回転方向（逆回転方向）と判断して、ステップ９３７に進み、通電相判定値Ｍｐｔｎｏｐを１ずつカウントダウンし、次のステップ９３８で、位置カウント値Ｎｃｎｔｏｐを２ずつカウントダウンする。
【０３１３】
この後、ステップ９３９に進み、通電相判定値Ｍｐｔｎｏｐを“６”で割り算した時の余りＭｐｔｎｏｐ％６を算出する。ここで、“６”は、オープンループ制御で通電相を一巡させる間の通電相判定値Ｍｐｔｎｏｐの増減量に相当する。
【０３１４】
Ｍｐｔｎｏｐ％６の算出後、ステップ９４０に進み、図６３のテーブルによってＭｐｔｎｏｐ％６に応じて通電相を選択し、その通電相を励磁する。本実施形態では、オープンループ制御中は、１−２相励磁方式で駆動するように通電相を選択し、更に、オープンループ制御を開始するときの最初の励磁が２相通電（ＷＵ相通電又はＵＶ相通電又はＶＷ相通電）、つまりＭｐｔｎｏｐ％６＝１又は３又は５となるように通電相判定値Ｍｐｔｎｏｐの初期値が設定されている。
【０３１５】
この後、図６１のステップ９４１に進み、位置偏差ｄｅｖを次式により算出する。
ｄｅｖ＝｜Ａｃｎｔ−Ｎｃｎｔｏｐ｜／２
上式から明らかなように、位置偏差ｄｅｖは、目標カウント値Ａｃｎｔと現在の位置カウント値Ｎｃｎｔｏｐとの偏差（絶対値）の１／２である。
【０３１６】
そして、次のステップ９４２で、位置偏差ｄｅｖと回転速度パラメータｍｓｐｄとを比較する。この回転速度パラメータｍｓｐｄは、位置偏差ｄｅｖに応じて増減されるパラメータであり、この回転速度パラメータｍｓｐｄに応じて図６５のテーブルにより励磁時間ｔｍを設定することで、ロータ３２の回転速度、加速、減速を制御する。この場合、目標とする回転速度が高くなるほど、回転速度パラメータｍｓｐｄが大きくなり、励磁時間ｔｍが短い時間に設定されるようになっている。この回転速度パラメータｍｓｐｄの初期値は０である。
【０３１７】
上記ステップ９４２で、位置偏差ｄｅｖが回転速度パラメータｍｓｐｄより大きいと判定された場合は、ステップ９４３に進み、回転速度パラメータｍｓｐｄを１だけカウントアップし、次のステップ９４４で、最小回転速度パラメータｍｓｐｄｍｉｎを０にセットする。この最小回転速度パラメータｍｓｐｄｍｉｎは、回転速度パラメータｍｓｐｄの最小値を制限するパラメータ（下限ガード値）である。このように、位置偏差ｄｅｖが回転速度パラメータｍｓｐｄより大きいときに、最小回転速度パラメータｍｓｐｄｍｉｎを０にセットすることで、オープンループ制御開始からロータ３２が回転し始めるまでの期間に、励磁時間ｔｍを最長時間（５０ｍｓ）に設定できるようにしている。
【０３１８】
一方、上記ステップ９４２で、位置偏差ｄｅｖが回転速度パラメータｍｓｐｄより小さいと判定された場合は、ステップ９４５に進み、回転速度パラメータｍｓｐｄを１だけカウントダウンし、次のステップ９４６で、最小回転速度パラメータｍｓｐｄｍｉｎを４にセットする。これにより、ロータ３２の回転が立ち上がった後は、励磁時間ｔｍを例えば５ｍｓ以下に制限できるようにしている。
【０３１９】
また、上記ステップ９４２で、位置偏差ｄｅｖが回転速度パラメータｍｓｐｄと一致すると判定された場合は、回転速度パラメータｍｓｐｄを変化させずに、ステップ９４７に進み、最小回転速度パラメータｍｓｐｄｍｉｎを０にセットする。
【０３２０】
以上のようにして、回転速度パラメータｍｓｐｄと最小回転速度パラメータｍｓｐｄｍｉｎを設定した後、ステップ９４８に進み、図６４のテーブルを用いてバッテリ電圧（電源電圧）に応じて最大回転速度パラメータｍｓｐｄｍａｘを設定する。この最大回転速度パラメータｍｓｐｄｍａｘは、回転速度パラメータｍｓｐｄの最大値を制限するパラメータ（上限ガード値）であり、バッテリ電圧が高くなるほど、最大回転速度パラメータｍｓｐｄｍａｘを大きくして、ロータ３２の回転速度を速くできるようにしている。
【０３２１】
そして、次のステップ９４９で、回転速度パラメータｍｓｐｄを最小回転速度パラメータｍｓｐｄｍｉｎと最大回転速度パラメータｍｓｐｄｍａｘとの範囲内に収めるようにガード処理する。例えば、ステップ９４３又は９４５で更新した回転速度パラメータｍｓｐｄが最小回転速度パラメータｍｓｐｄｍｉｎよりも小さい場合は、ｍｓｐｄ＝ｍｓｐｄｍｉｎとし、また、回転速度パラメータｍｓｐｄが最大回転速度パラメータｍｓｐｄｍａｘよりも大きい場合は、ｍｓｐｄ＝ｍｓｐｄｍａｘとし、ｍｓｐｄｍｉｎ≦ｍｓｐｄ≦ｍｓｐｄｍａｘの場合は、その回転速度パラメータｍｓｐｄをそのまま用いる。
【０３２２】
この後、ステップ９５０に進み、図６５のテーブルを用いて、回転速度パラメータｍｓｐｄに応じて励磁時間ｔｍを設定する。図６５の例では、回転速度パラメータｍｓｐｄが０〜３までの範囲では、励磁時間ｔｍを最長時間（例えば５０ｍｓ）に設定し、起動時にロータ３２の回転位相と通電相との同期を確実にとることができるようにしている。そして、回転速度パラメータｍｓｐｄが４〜９までの範囲では、回転速度パラメータｍｓｐｄが大きくなるに従って、励磁時間ｔｍを例えば５ｍｓから３ｍｓまで３段階に小さくして、ロータ３２の回転速度を３段階に調整できるようになっている。尚、励磁時間ｔｍの切り換えは、２段階以下又は４段階以上であっても良いことは言うまでもない。
【０３２３】
励磁時間ｔｍの設定後、ステップ９５１に進み、通電フラグＸｏｎをＯＮにセットし、次のステップ９５２で、時間カウンタＴｏｐをクリアして本ルーチンを終了する。
【０３２４】
また、図６０のステップ９３４で、現在の位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔと一致すると判定された場合は、図６２のステップ９５５に進み、時間カウンタＴｏｐの計測時間が所定時間Ｋｈｌｄ（例えば５００ｍｓ）以上になったか否かを判定する。その結果、時間カウンタＴｏｐの計測時間が所定時間Ｋｈｌｄ未満と判定された場合は、ステップ９５６に進み、全相の通電をオフし、次のステップ９５７で、励磁時間ｔｍを所定時間Ｋｈｌｄ（例えば５００ｍｓ）にセットする。この後、図６１のステップ９５２に進み、時間カウンタＴｏｐをクリアして本ルーチンを終了する。このような処理により、オープンループ制御終了後、所定時間Ｋｈｌｄ（例えば５００ｍｓ）が経過するまで、前記図６０のステップ９３４以降の処理が行われないため、次のオープンループ制御が開始されない。これは、オープンループ制御終了後に、ディテントバネ２３の弾性力によりディテントバネ２３の係合部２３ａがディテントレバー１５の保持凹部２４，２５の傾斜側壁に沿ってその底部に滑り落ちるまで待つためである。
【０３２５】
また、図６２のステップ９５５で、時間カウンタＴｏｐの値が所定値Ｋｈｌｄ以上になったと判定されれば、ステップ９５８に進み、通電相判定値Ｍｐｔｎｏｐ＝０、回転速度パラメータｍｓｐｄ＝０にセットし、次のステップ９５９で、オープンループ制御完了フラグＸｏｐｃｍｐをＯＮにセットする。この後、ステップ９６０に進み、励磁時間Ｔｍを０にセットし、次のステップ９６１で、通電フラグＸｏｎをＯＦＦにセットした後、図６１のステップ９５２に進み、時間カウンタＴｏｐをクリアして本ルーチンを終了する。
【０３２６】
以上説明した本ルーチンでは、オープンループ制御中の励磁方式を１−２相励磁方式に設定し、図５０に示すように、オープンループ制御開始から例えば３ステップ分は、各通電相の励磁時間ｔｍを最長時間（例えば５０ｍｓ）に設定して、ロータ３２を確実に掴んでロータ３２の回転位相と通電相とを確実に同期させる。この後は、励磁時間ｔｍを大幅に短くするが、ロータ３２の回転速度の上昇に伴って励磁時間ｔｍを徐々に短くして、ロータ３２の回転速度を緩やかに上昇させる。
【０３２７】
オープンループ制御中は、通電相を切り換える毎に位置カウント値Ｎｃｎｔｏｐを２ずつカウントアップ（又はカウントダウン）して、該位置カウント値Ｎｃｎｔｏｐに基づいてロータ３２の回転位置を推定し、該位置カウント値Ｎｃｎｔｏｐと目標カウント値Ａｃｎｔとの偏差がある程度小さくなった段階で、減速領域に入ったと判断して、励磁時間ｔｍを徐々に長くして、ロータ３２の回転速度を緩やかに減速し、該位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔに到達した時点で、ロータ３２が目標位置に到達したと判断して、オープンループ制御を終了し、Ｆ／Ｂ制御に復帰する。
【０３２８】
［オープンループ制御時エンジントルク抑制］
図６６に示すオープンループ制御時エンジントルク抑制ルーチンは、所定周期（例えば１ｍｓ周期）で起動される。本ルーチンが起動されると、まずステップ９７１で、オープンループ制御実行フラグＸｏｐｅｎ＝ＯＮであるか否かを判定し、Ｘｏｐｅｎ＝ＯＮであれば、ステップ９７２に進み、エンジントルク抑制フラグＸｔｒｑをＯＮにセットし、Ｘｏｐｅｎ＝ＯＦＦであれば、ステップ９７３に進み、エンジントルク抑制フラグＸｔｒｑをＯＦＦにセットする。このエンジントルク抑制フラグＸｔｒｑの情報は、レンジ切換制御用のＥＣＵ４１からエンジン制御用のＥＣＵ（図示せず）に送信される。
【０３２９】
エンジン制御用のＥＣＵは、オープンループ制御実行フラグＸｏｐｅｎ＝ＯＮの情報を受信したときに、エンジントルクを抑制する方向にエンジン制御パラメータを制御して、エンジントルクを抑制した状態で、オープンループ制御によるレンジ切換動作を実行する。
【０３３０】
この際、エンジントルクを抑制する方向に制御するエンジン制御パラメータは、空気系、燃料系、点火系のうちの少なくとも１つの制御パラメータを用いれば良く、例えば、空気系の場合は、スロットルバルブの開駆動を禁止してスロットル開度を現状維持するようにしたり、或は、運転に支障を来さない範囲内でスロットル開度を閉じるようにしても良い。また、燃料系の場合は、運転に支障を来さない範囲内で燃料噴射量を制限するようにすれば良く、点火系の場合は、運転に支障を来さない範囲内で点火時期を遅角するようにすれば良い。
【０３３１】
次に、本実施形態のリカバリ処理の実行例を図４７のタイムチャートを用いて説明する。図４７は、シフトレンジをＰレンジからＮｏｔＰレンジに切り換える途中で、Ｆ／Ｂ制御状態が異常になって、ロータ３２の異常停止又はエンコーダカウント値Ｎｃｎｔのカウント動作の異常停止が発生したときの制御例を示している。
【０３３２】
シフトレンジをＰレンジからＮｏｔＰレンジに切り換えるＦ／Ｂ制御中に、Ｆ／Ｂ制御状態が正常か異常かを監視し、異常が検出された時点で、リカバリ処理実行フラグＸｒｃｖをＯＦＦからＯＮに切り換える。これにより、Ｆ／Ｂ制御からオープンループ制御に切り換えてリカバリ処理を開始する。
【０３３３】
オープンループ制御（リカバリ処理）の開始時に、出力軸センサ１４の出力信号Ｖｎｓｗを用いてオープンループ制御時の位置カウント値Ｎｃｎｔｏｐの初期値を算出する。そして、オープンループ制御（リカバリ処理）中は、エンコーダカウント値Ｎｃｎｔの情報をフィードバックせずに通電相を順次切り換えてロータ３２を回転駆動すると共に、当該オープンループ制御中に通電相を切り換える毎に位置カウント値Ｎｃｎｔｏｐを２ずつカウントアップ（又はカウントダウン）して、この位置カウント値Ｎｃｎｔｏｐが目標カウント値Ａｃｎｔに到達した時点で、ロータ３２が目標位置に到達したと判断して、リカバリ処理実行フラグＸｒｃｖをＯＮからＯＦＦに切り換える。これにより、オープンループ制御（リカバリ処理）を終了し、Ｆ／Ｂ制御に復帰する。
【０３３４】
以上説明した本実施形態では、Ｆ／Ｂ制御中に、エンコーダカウント値Ｎｃｎｔの異常や脱調等が発生してＦ／Ｂ制御状態（ロータ３２の回転状態）が一時的に異常になっても、Ｆ／Ｂ制御からオープンループ制御に切り換えてロータ３２を目標位置まで回転させることができ、モータ制御（レンジ切換制御）の信頼性を向上させることができる。
【０３３５】
ところで、オープンループ制御中は、エンコーダカウント値Ｎｃｎｔとは関係なく、通電相が選択されてロータ３２が駆動されるため、オープンループ制御中にエンコーダカウント値Ｎｃｎｔとロータ３２の回転位置（レンジ切換機構１１の操作量）との関係がずれる可能性がある。
【０３３６】
この対策として、本実施形態では、オープンループ制御からＦ／Ｂ制御に復帰させるときに、初期駆動と一方向・他方向突き当て制御を再実行するようにしたので、オープンループ制御中にエンコーダカウント値Ｎｃｎｔとロータ３２の回転位置（レンジ切換機構１１の操作量）との関係がずれても、そのずれを初期駆動と一方向・他方向突き当て制御によって精度良く補正することができる。
【０３３７】
尚、本発明に用いるエンコーダは、磁気式のエンコーダ４６に限定されず、例えば、光学式のエンコーダやブラシ式のエンコーダを用いても良い。
また、本発明に用いるモータは、ＳＲモータ１２に限定されず、エンコーダの出力信号のカウント値に基づいてロータの回転位置を検出してモータの通電相を順次切り換えるブラシレス型のモータであれば、ＳＲモータ以外のブラシレス型のモータを用いても良い。
【０３３８】
また、本実施形態のレンジ切換装置は、ＰレンジとＮｏｔＰレンジの２つのレンジを切り換える構成であるが、例えば、ディテントレバー１５の回動動作に連動して自動変速機のレンジ切換弁とマニュアルバルブを切り換えて、自動変速機のＰ、Ｒ、Ｎ、Ｄ、…の各レンジを切り換えるレンジ切換装置にも本発明を適用して実施できる。
【０３３９】
その他、本発明は、レンジ切換装置に限定されず、ＳＲモータ等のブラシレス型のモータを駆動源とする各種の装置に適用して実施できることは言うまでもない。
【図面の簡単な説明】
【図１】本発明の一実施形態を示すレンジ切換装置の斜視図
【図２】ＳＲモータの構成を説明する図
【図３】ＳＲモータを駆動する回路構成を示す回路図
【図４】レンジ切換装置の制御システム全体の構成を概略的に示す図
【図５】エンコーダのロータリマグネットの構成を説明する平面図
【図６】エンコーダの側面図
【図７】（ａ）はエンコーダの出力波形を示すタイムチャート、（ｂ）は通電相切り換えパターンを示すタイムチャート
【図８】初期駆動ルーチンの処理の流れを示すフローチャート（その１）
【図９】初期駆動ルーチンの処理の流れを示すフローチャート（その２）
【図１０】Ｐレンジ初期駆動ルーチンの処理の流れを示すフローチャート
【図１１】ＮｏｔＰレンジ初期駆動ルーチンの処理の流れを示すフローチャート
【図１２】Ｐレンジで初期駆動を行ったときの制御例を示すタイムチャート
【図１３】初期駆動中にレンジ切換操作されたときの制御例を示すタイムチャート
【図１４】初期駆動中にレンジ切換操作されたときの初期位置ずれ学習方法を説明するタイムチャート
【図１５】エンコーダカウンタルーチンの処理の流れを示すフローチャート
【図１６】カウントアップ値ΔＮ算出マップの一例を示す図
【図１７】指令レンジシフト、Ａ相信号、Ｂ相信号、エンコーダカウント値の関係を示すタイムチャート
【図１８】ＳＲモータの制御例を示すタイムチャート
【図１９】Ｆ／Ｂ制御から目標位置停止保持処理へ移行するタイミングを説明するタイムチャート
【図２０】制御モード設定ルーチンの処理の流れを示すフローチャート（その１）
【図２１】制御モード設定ルーチンの処理の流れを示すフローチャート（その２）
【図２２】制御モード設定ルーチンの処理の流れを示すフローチャート（その３）
【図２３】時間同期モータ制御ルーチンの処理の流れを示すフローチャート
【図２４】ｍｏｄｅ１ルーチンの処理の流れを示すフローチャート
【図２５】ｍｏｄｅ３ルーチンの処理の流れを示すフローチャート
【図２６】ｍｏｄｅ４ルーチンの処理の流れを示すフローチャート
【図２７】通電処理ルーチンの処理の流れを示すフローチャート
【図２８】１−２相励磁方式の場合のＭｐｔｎ％１２から通電相への変換テーブルの一例を示す図
【図２９】突き当て制御中にバッテリ電圧に応じて通電デューティ比を設定するテーブルの一例を示す図
【図３０】Ｆ／Ｂ制御ルーチンの処理の流れを示すフローチャート
【図３１】通電相設定ルーチンの処理の流れを示すフローチャート
【図３２】ＵＷ相から回転を開始する時の通電処理を説明するタイムチャート
【図３３】ロータ回転速度演算ルーチンの処理の流れを示すフローチャート
【図３４】速度位相進み補正量設定ルーチンの処理の流れを示すフローチャート
【図３５】ディテントバネの係合部とディテントレバーのＰレンジ保持凹部とＮｏｔＰレンジ保持凹部との関係を説明する図
【図３６】遊び量学習ルーチンの処理の流れを示すフローチャート
【図３７】バッテリ電圧に応じて乗り上げ補正量ΔＶｏｖｅｒを設定するテーブルの一例を示す図
【図３８】可動範囲の実測値ΔＮａｃｔと設計値ΔＮｄと遊び量ΔＧｐ，ΔＧｎｐとの関係を説明する図
【図３９】Ｐレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート（その１）
【図４０】Ｐレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート（その２）
【図４１】Ｐレンジ側突き当て制御の一例を説明するタイムチャート
【図４２】ＮｏｔＰレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート（その１）
【図４３】ＮｏｔＰレンジ側突き当て制御ルーチンの処理の流れを示すフローチャート（その２）
【図４４】Ｐレンジ側突き当て制御とＮｏｔＰレンジ側突き当て制御の実行タイミングの一例を説明するタイムチャート
【図４５】目標カウント値設定ルーチンの処理の流れを示すフローチャート（その１）
【図４６】目標カウント値設定ルーチンの処理の流れを示すフローチャート（その２）
【図４７】リカバリ処理の一例を説明するタイムチャート
【図４８】エンコーダのＡ相信号・Ｂ相信号の異常を検出する方法を説明する図
【図４９】Ｆ／Ｂ制御中のロータの逆転を検出する方法を説明する図
【図５０】オープンループ制御の一例を説明するタイムチャート
【図５１】リカバリ処理ルーチンの処理の流れを示すフローチャート
【図５２】オープンループ制御開始時の位置カウント値Ｎｃｎｔの初期値を算出する方法を説明する図
【図５３】ＡＢ相信号異常検出ルーチンの処理の流れを示すフローチャート
【図５４】逆転カウンタルーチンの処理の流れを示すフローチャート
【図５５】逆転判定ルーチンの処理の流れを示すフローチャート
【図５６】システム異常診断ルーチンの処理の流れを示すフローチャート（その１）
【図５７】システム異常診断ルーチンの処理の流れを示すフローチャート（その２）
【図５８】フェールセーフ処理ルーチンの処理の流れを示すフローチャート（その１）
【図５９】フェールセーフ処理ルーチンの処理の流れを示すフローチャート（その２）
【図６０】オープンループ制御ルーチンの処理の流れを示すフローチャート（その１）
【図６１】オープンループ制御ルーチンの処理の流れを示すフローチャート（その２）
【図６２】オープンループ制御ルーチンの処理の流れを示すフローチャート（その３）
【図６３】Ｍｐｔｎｏｐ％６から通電相への変換テーブルの一例を示す図
【図６４】バッテリ電圧から最大回転速度パラメータｍｓｐｄｍａｘを求めるテーブルの一例を示す図
【図６５】回転速度パラメータｍｓｐｄから励磁時間ｔｍを求めるテーブルの一例を示す図
【図６６】オープンループ制御時エンジントルク抑制ルーチンの処理の流れを示すフローチャート
【符号の説明】
１１…レンジ切換機構、１２…ＳＲモータ、１４…出力軸センサ、１５…ディテントレバー、１８…パーキングロッド、２０…パーキングギヤ、２１…ロックレバー、２３…ディテントバネ、２３ａ…係合部、２４…Ｐレンジ保持凹部、２５…ＮｏｔＰレンジ保持凹部、２６…減速機構、２７…自動変速機、３１…ステータ、３２…ロータ、３３，３４…巻線、３５，３６…モータ励磁部、３７，３８…モータドライバ、４１…ＥＣＵ（制御手段，異常監視手段）、４３…Ｐレンジスイッチ、４４…ＮｏｔＰレンジスイッチ、４６…エンコーダ、４７…ロータリマグネット、４８…Ａ相信号用の磁気検出素子、４９…Ｂ相信号用の磁気検出素子、５０…Ｚ相信号用の磁気検出素子。
【図１】
2004048837.tif 000005
【図２】
2004048837.tif 000006
【図３】
2004048837.tif 000007
【図４】
2004048837.tif 000008
【図５】
2004048837.tif 000009
【図６】
2004048837.tif 000010
【図７】
2004048837.tif 000011
【図８】
2004048837.tif 000012
【図９】
2004048837.tif 000013
【図１０】
2004048837.tif 000014
【図１１】
2004048837.tif 000015
【図１２】
2004048837.tif 000016
【図１３】
2004048837.tif 000017
【図１４】
2004048837.tif 000018
【図１５】
2004048837.tif 000019
【図１６】
2004048837.tif 000020
【図１７】
2004048837.tif 000021
【図１８】
2004048837.tif 000022
【図１９】
2004048837.tif 000023
【図２０】
2004048837.tif 000024
【図２１】
2004048837.tif 000025
【図２２】
2004048837.tif 000026
【図２３】
2004048837.tif 000027
【図２４】
2004048837.tif 000028
【図２５】
2004048837.tif 000029
【図２６】
2004048837.tif 000030
【図２７】
2004048837.tif 000031
【図２８】
2004048837.tif 000032
【図２９】
2004048837.tif 000033
【図３０】
2004048837.tif 000034
【図３１】
2004048837.tif 000035
【図３２】
2004048837.tif 000036
【図３３】
2004048837.tif 000037
【図３４】
2004048837.tif 000038
【図３５】
2004048837.tif 000039
【図３６】
2004048837.tif 000040
【図３７】
2004048837.tif 000041
【図３８】
2004048837.tif 000042
【図３９】
2004048837.tif 000043
【図４０】
2004048837.tif 000044
【図４１】
2004048837.tif 000045
【図４２】
2004048837.tif 000046
【図４３】
2004048837.tif 000047
【図４４】
2004048837.tif 000048
【図４５】
2004048837.tif 000049
【図４６】
2004048837.tif 000050
【図４７】
2004048837.tif 000051
【図４８】
2004048837.tif 000052
【図４９】
2004048837.tif 000053
【図５０】
2004048837.tif 000054
【図５１】
2004048837.tif 000055
【図５２】
2004048837.tif 000056
【図５３】
2004048837.tif 000057
【図５４】
2004048837.tif 000058
【図５５】
2004048837.tif 000059
【図５６】
2004048837.tif 000060
【図５７】
2004048837.tif 000061
【図５８】
2004048837.tif 000062
【図５９】
2004048837.tif 000063
【図６０】
2004048837.tif 000064
【図６１】
2004048837.tif 000065
【図６２】
2004048837.tif 000066
【図６３】
2004048837.tif 000067
【図６４】
2004048837.tif 000068
【図６５】
2004048837.tif 000069
【図６６】
2004048837.tif 000070