第36章 ルネサスMCU Zero Basic入門チュートリアルシリーズ ステッピングモータ制御実験

このチュートリアルは、Wei Dongshan Baiwen.com によって作成されたDShanMCU-RA6M5 開発ボードに基づいて書かれています。必要な学生はここから入手できます: https://item.taabao.com/item.htm?id=728461040949

サポート情報の入手: https://renesas-docs.100ask.net

ルネサス MCU ゼロベース エントリ シリーズ チュートリアルの概要: https://blog.csdn.net/qq_35181236/article/details/132779862


第36章 ステッピングモーター制御実験

36.1 24BYJ-48 ステッピングモーターの動作原理

本書で使用しているステッピングモータの型式は28BYJ-48という一般的なステッピングモータで、外径28mmの4相8ビート永久磁石減速機ステッピングモータという意味です。モデルの意味は次のとおりです。

  • 28:ステッピングモーターの有効最大外径は28mmです
  • B:ステッピングモーターを示します
  • Y:永久磁石の種類を示します
  • J:減速タイプを表します(減速比1:64)
  • 48:4つのフェーズと8つのビートを意味します

まず「4相永久磁石式」のコンセプトについてですが、28BYJ-48の内部構造図は以下の通りです。

まず内輪に注目すると、0から7までの8枚の歯があり、これをローターといい、その名の通り回転するものです。ローターの歯の一つ一つが永久磁性を持っており、永久磁石となっているのが「永久磁石」という概念です。

外輪を見ると、これは固定子であり、実際には、モーターのケーシングに固定されています。ステータには 4 つのグループ ABCD があり、合計 32 個の歯があり、各歯にはコイル巻線が巻かれています。グループ A には 8 つのコイル巻線が直列に接続されており、これら 8 つのコイル巻線が同時にオンまたはオフになります。グループB、C、Dも同様で、図中のABCDで示す4つのフェーズが形成され、これが「4フェーズ」の概念です。隣接するステータ間の角度は 360/32=11.25 度です。

ステッピングモーターからのワイヤーは合計5本あり、赤いのは5V電源に接続されているコモン端子で、他の4本のワイヤーはそれぞれ4つの巻線A、B、C、Dの他端に対応します。 。モーターを回転させるにはどうすればよいでしょうか?

初期状態でAがオンになっているとすると、上図に示すように、グループAの8個のコイル巻線はすべて磁力を持っており、8個のローターを吸引し、8個のローターはグループAの8個のステーターと整列します。

次に、A が切断され、B が導通すると、グループ B の 8 個のコイル巻線が、それに最も近い 8 個のローターを引き付け、グループ B のローターとステーターが一直線になるようにします。ロータNo.0を例にすると、Aステータに対向する位置からBステータに対向する位置まで時計回りに11.25度回転します。

その直後にBを外してCを導通させると、Cグループの8個のコイル巻線が最も近い8個のローターを引き寄せ、Cグループのローターとステーターが一直線になるようにします。ロータNo.0を例にとると、Bステータに対向する位置からCステータに対向する位置まで時計回りに回転し、再び時計回りに11.25度回転します。ABCDを個別に順番にONにするとモーターが時計回りに回転します。

ABCD の特定のコイル巻線を単独でオンすると、ローターは 11.25 度回転します。この値をステップ角と呼びます。

上記の動作モードは、ステッピング モーターの単一 4 ビート モードです。同様に、ローターを反時計回りに回転させたい場合は、DCBA を順番に個別にオンにします。

よりパフォーマンスの良い動作モードを導入してみましょう。これは、単一の 4 ビートの 2 ビートごとに二重巻線伝導による中間ビートを挿入して 8 ビート モードを形成するものです。

例えば、右回転の過程で、A相導通からB相導通までの途中で、A相とB相が同時に導通するうなりが加わります。 2 つの巻線 A と B がそれらに影響を与え、近くのローター歯が同時に同じ吸引力を生成し、2 つのステーター A と B の間に No. 0 ローターが配置されます。上記の単一 4 ビート モードのステップ角度の半分、つまり 5.625 度回転します。これにより回転精度は2倍となり、ローターが1回転するのに8*8=64拍かかります。さらに、新しく追加されたミドルビートは、元の単一の 4 ビートビートの 2 つの重力の間に重力も追加し、モーターの全体的なトルク出力を大幅に増加させ、モーターをより「強力」かつ強力にすることができます。 . 滑らか。

次の表は、8 ビート モードでのモーター巻線の励磁タイミングを示しています (モーターのリード線の色はメーカーによって異なる場合があります)。

この記事では、8 ビート モードでプログラミングのデモを開始します。下表の値に従ってモーターを継続的に刺激すると、モーターは反時計回りに回転します。

28BYJ-48は減速モータであり、モータの出力速度とローターの速度は等しくありません。下の写真はこの28BYJ-48ステッピングモーターの分解図です、写真からもわかるように、中央の白いピニオンがステッピングモーターのローター出力です、64拍でこのピニオンは1回転するだけです。次に、大きな水色のギアを駆動します。これが減速の最初のレベルです。

右上の白い歯車の構造です。モーターローターと最終出力軸を除く3つの変速機歯車はこの構造になっており、多歯の層と少数の歯の層で構成されており、それぞれの歯車に使用されています。次のギアの多歯層を駆動するため、2 つのギアごとに 1 レベルの減速が構成され、合計 4 レベルの減速になります。

36.2 モータードライブボードの動作原理

28BYJ-48 モーターの原理によれば、開発ボードの 4 つのピン (通常は GPIO) をそれぞれモーターに接続し、モーターの駆動ロジックに従って特定の励起信号を与えるだけです。ただし、開発ボードの GPIO 駆動能力には制限があり、開発ボードとモーターの間に駆動回路を追加する必要があります。このチュートリアルでは、デュアル ブラシ付き DC モーター ドライバー チップ MX1508 を選択しました。駆動回路の回路図を以下に示します。

開発ボードの GPIO0 ~ GPIO3 ピンは、MX1508 の INA1、INB1、INA2、および INB2 に直接接続されています。MX1508の出力端子OUTA1、OUTB1、OUTA2、OUTB2は、ステッピングモーター28BYJ-48の4つのコイルA、B、C、Dにそれぞれ接続されています。したがって、モーターの ABCD は、開発ボードの 4 つの GPIO ピンを通じて間接的に制御できます。単純にABCDを制御するために4つのGPIOを使っているだけではなく、1対1対応ではありません。

まず、MX1508 チップの内部回路と基本的な動作モードを理解する必要があります。

  1. スタンバイモード

スタンバイモードでは、INAx=INBx=L となります。駆動電源管を含むすべての内部回路がオフになります。この回路の消費電流は非常に低いです。このとき、モータ出力端子OUTAx、OUTBxはともにハイインピーダンス状態(Z印)となる。

  1. 正転モード

フォワードモードの定義は INAx=H、INBx=L このとき、モータ駆動端子 OUTAx が High レベルを出力し、モータ駆動端子 OUTBx が Low レベルを出力すると、OUTAx からモータにモータ駆動電流が流れ、このときのモータの回転を正転モードとします。

  1. リバースモード

反転モードの定義は INAx=L、INBx=H このとき、モータ駆動端子 OUTBx が High レベルを出力し、モータ駆動端子 OUTAx が Low レベルを出力すると、OUTBx からモータにモータ駆動電流が流れ、 OUTAx からアースへ出力され、この時のモータの回転を逆転モードと定義します。

  1. ブレーキモード

制動モードは INAx=H、INBx=H と定義されます。このとき、モータ駆動端子 OUTAx、OUTBx はともに Low レベルを出力します。モータに蓄えられたエネルギーは、OUTAx 端子または OUTAx 端子の NMOS チューブを介して急速に放出されます。 OUTBx端子のNMOSがオンになり、短時間でモーターが動作し、回転が停止します。ブレーキモードでは回路が静的電力を消費することに注意してください。

  1. PWMモードA

入力信号 INAx が PWM 信号、INBx=0 または INAx=0、INBx が PWM 信号の場合、モータの回転速度は PWM 信号のデューティ比によって制御されます。このモードでは、モーター駆動回路が導通モードとスタンバイモードを切り替えます。スタンバイモードでは、すべてのパワー管がオフ状態になり、モーター内部に蓄えられたエネルギーはパワーMOSFETのボディダイオードを通してゆっくりとのみ放出されます。

入力信号 INAx が PWM 信号、INBx=1 または INAx=1、INBx が PWM 信号の場合、モータの回転速度は PWM 信号のデューティ比によって制御されます。このモードでは、モーター駆動回路の出力は導通モードと制動モードの間にあり、制動モードでは、モーターに蓄えられたエネルギーがローサイド NMOS 管を通じて急速に放出されます。

要約すると、MX1508 の真理値表は次のとおりです。

上記の真の表において、OUTAx/OUTBx 出力が Z(ハイインピーダンス)または H(ハイレベル)の場合、接続されているモーターコイル巻線は導通せず、効果は同じです。

ABCD に 8 ビートを出力させるには、以下に示すように GPIO0 ~ GPIO3 を制御できます。

1拍目を例にとると、Dは0を出力、ABCはハイレベルまたはハイインピーダンス状態を出力したい場合はどうすればよいでしょうか?つまり、OUTB2=L、OUTA2、OUTA1、OUTB1をHまたはZにしたい場合はどうすればよいでしょうか?

真理値表によれば、INA2=H および INB2=L に設定すると、OUTA2=H および OUTB2=L になります。

真理値表に従って INA1=L および INB1=L を設定し続けると、OUTA1=Z および OUTB1=Z になります。

したがって、D出力を0、ABC出力をハイレベルまたはハイインピーダンス状態にするには、INA1=L、INB1=L、INA2=H、INB2=Lとする必要があります。つまり、GPIO0=0、GPIO1=0、GPIO2=1、GPIO3=0、バイナリで表すと 0b0100、つまり 0x04 になります。

8 ビートに対応する GPIO 値を配列に保存します。

S_CW[8]= {0x04,0x0c,0x08,0x09,0x01,0x03,0x02,0x06};

4 つの GPIO を出力として構成した後、配列値を GPIO 出力レジスタに周期的に書き込み、モーターを回転させます。GPIO 出力レジスタに逆の順序で周期的に書き込むことにより、モーターを逆転させることができます。2 つのビート間の期間を調整すると、モーターの速度を変更できます。

モーターのパラメータ: 無負荷プルイン周波数 ≥ 600Hz によれば、2 つのビート間の時間間隔は 1.6ms 未満であってはなりません。

36.3 モジュール構成

この実験では、実際には GPIO という 1 つのペリフェラルのみを駆動します。しかし、モーターをより適切に駆動するために、この実験では UART も使用しました。ユーザーが角度と速度を入力できるようにし、タイマーを使用して正確な遅延を実現しました。

この実験で使用するステッピング モーター モジュールは、拡張ボードの GPIO グループに接続されます。4 つの GPIO は、モーター ドライバー ボードの INA/B/C/D に接続するために使用されます。拡張ボード GPIO の回路図グループを以下に示します。


この実験では GPIO0 ~ 3 を使用するため、これら 4 つの IO に対応するピンを RASC で汎用出力モードとして設定する必要があります。これらの 4 つのピンを設定するには、本書の前半の GPIO 設定を参照してください。

36.4 周辺機器ドライバー

今回の実験で使用したIOデバイス、シリアルポートデバイス、タイマーデバイスは「30.3 デバイスオブジェクトのカプセル化」で使用した結果と方法を基本的に踏襲しています。デバイスオブジェクトのカプセル化の概念と方法については前回の記事を参照してください。この本をダウンロードする この本のサポート資料は、ソース コードから読んで学習できます。

36.5 モータードライバー

36.5.1 モーター機器オブジェクト

モーターの場合、ユーザーが必要とする操作は、起動、停止、回転角度(角度、速度)の設定です。これらの要件に基づいて、モーター構造体 (dev_motor.h) がカプセル化されます。

typedef struct StepMotor{
    
    
    char *name;
    MotorStatus status;
    int (*Init)(struct StepMotor *ptdev);
    int (*Start)(struct StepMotor *ptdev);
    int (*Stop)(struct StepMotor *ptdev);
    int (*SetAngle)(struct StepMotor *ptdev, int speed, int value);
}StepMotorDevice;

次に、dev_motor.c で StepMotor 構造体を構築し、この構造体を取得する関数を上位レベルのコードに追加します。コードは次のとおりです。

static struct StepMotor gMotor = {
    
    
    .name   = "Step Motor",
    .status = 0,
    .Init   = StepMotorDevInit,
    .Start  = StepMotorDevStart,
    .Stop   = StepMotorDevStop,
    .SetAngle = StepMotorDevSetAngle
};

struct StepMotor *MotorGetDevice(void)
{
    
    
    return &gMotor;
}

36.5.2 初期化関数

初期化関数で実装する必要があるのは、4 つの IO デバイス オブジェクトを取得することです。コードは次のとおりです。

static int StepMotorDevInit (struct StepMotor *ptdev)
{
    
    
    if(NULL == ptdev)   return -EINVAL;

    gINAIO = IODeviceFind("Step Motor INA");
    if(NULL == gINAIO)  return -ENODEV;
    gINBIO = IODeviceFind("Step Motor INB");
    if(NULL == gINBIO)  return -ENODEV;
    gINCIO = IODeviceFind("Step Motor INC");
    if(NULL == gINCIO)  return -ENODEV;
    gINDIO = IODeviceFind("Step Motor IND");
    if(NULL == gINDIO)  return -ENODEV;

    return ESUCCESS;
}

36.5.3 回転をオンにする

この本では、Start 関数でステッピング モーターを回転させません。モーターがオンであることを示すようにステータスを変更するだけです。コードは次のとおりです。

static int StepMotorDevStart(struct StepMotor *ptdev)
{
    
    
    if(NULL == ptdev)   return -EINVAL;
    if(ptdev->status == isStop)
    {
    
    
        ptdev->status = isRunning;
        return ESUCCESS;
    }
    return -EIO;
}

36.5.4 回転の停止

モーターステータスフラグを 0 に割り当て、ステッピングモーターの 4 つの IO がすべて Low レベルを出力するようにします。コードは以下のように表示されます。

static int StepMotorDevStop (struct StepMotor *ptdev)
{
    
    
    if(NULL == ptdev)   return -EINVAL;
    if(ptdev->status == isRunning)
    {
    
    
        ptdev->status = isStop;
        
        gINAIO->Write(gINAIO, 0);
        gINBIO->Write(gINBIO, 0);
        gINCIO->Write(gINCIO, 0);
        gINDIO->Write(gINDIO, 0);
        return ESUCCESS;
    }
    return -EIO;
}

36.5.5 速度と回転角度の設定

先ほどの説明から、24BYJ-48ステッピングモーターは内部で64拍を受けると1回転し、ローターは減速機を介して出力軸を1/64回転駆動します。したがって、出力シャフトを 1 回転させたい場合は、ステッピング モーターに 4096 ビート (64*64=4096) を与える必要があります。指定した角度を回転させたい場合、ビート数を計算するための対応する式は次のとおりです。

ステップ=角度*4096/360

さらに、S_CW[8] 配列の値を順番および逆の順序で使用してモーターを駆動し、逆転および正転を実現できます。モーターの速度は各ビートの間隔に反映され、間隔が長くなるほど速度は遅くなります。

これらの原則に基づいて、ステッピング モーターの角度と速度を設定する関数を関数にカプセル化できます。

static const uint8_t EightBeat[8] = {
    
    0x04,0x0c,0x08,0x09,0x01,0x03,0x02,0x06};
static int StepMotorDevSetAngle(struct StepMotor *ptdev, int speed, int value)
{
    
    
    if(NULL == ptdev)   return -EINVAL;
    if(1 > speed)       return -EINVAL;
    
    int nAbsValue = (value>=0)?value:-value;
    unsigned int step = (unsigned int)(nAbsValue*4096/360);
    unsigned int phase = 0;

    if(isStop == ptdev->status)
        ptdev->Start(ptdev);
    for(unsigned int i=0; i<step; i++)
    {
    
    
        if(value>0)
            phase = (i&0x07);
        else
            phase = (7-(i&0x07));
        
        gINAIO->Write(gINAIO, ((EightBeat[phase]&0x08)==0)?0:1);
        gINBIO->Write(gINBIO, ((EightBeat[phase]&0x04)==0)?0:1);
        gINCIO->Write(gINCIO, ((EightBeat[phase]&0x02)==0)?0:1);
        gINDIO->Write(gINDIO, ((EightBeat[phase]&0x01)==0)?0:1);
        mdelay(speed);
    }
    ptdev->Stop(ptdev);

    return ESUCCESS;
}

36.6 テスト手順

この実験の方法は、ユーザーがシリアル ポートを介して角度と速度を入力し、ステッピング モーターの回転を制御するというものです。コードは以下のように表示されます。

void DeviceTest(void)
{
    
    
    UartDevicesRegister();
    TimerDevicesRegister();
    IODevicesRegister();

    StepMotorDevice *pMotor = MotorGetDevice();
    if(NULL == pMotor)
    {
    
    
        xprintf("Failed to Find Motor Device!\r\n");
        return;
    }
    pMotor->Init(pMotor);
    pMotor->Start(pMotor);

    while(1)
    {
    
    
        xprintf("Enter value(+- 0~360 degree) and speed(Greater than 1ms) parameters you want: \r\n\t");
        int value = 0, speed = 0;
        scanf("%d%d", &value, &speed);
        xprintf("\tValue:%d\tSpeed:%d\r\n", value, speed);
        pMotor->SetAngle(pMotor, speed, value);
    }
}

36.7 テスト結果

プログラムを開発ボードに書き込んで実行し、シリアル ポート アシスタントを開き、ステッピング モーターを接続し、シリアル ポート アシスタントを通じて回転角度と速度を入力します。

ステッピング モーターは、指定された角度だけ反時計回りまたは時計回りに回転します。


この章の終わり

おすすめ

転載: blog.csdn.net/qq_35181236/article/details/132891909