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