この記事で駆動するステッピングモーターは、基本的な28BYJ-48ステッピングモーターで、エントリーレベルに属し、比較的運転しやすく、価格も比較的安いので、最初にステッピングモータードライバーについて説明します。 !!
1.ステッピングモーターの駆動原理
以前、インターネットでステッピングモーターの駆動過程を詳しく説明したダイナミックな写真を見ましたが、専門知識がない方でも読めるので、比較的わかりやすいです!
この記事で使用したステッピングモーターに戻りましょう。一般的なモーターとドライバーを以下に示します。もちろん、ULN2003ドライバーモジュールもSMDタイプですが、類似しており、大きな違いはなく、自分で選択できます。 !!
ステッピングモーターの駆動方法は次のように説明できます。
- 1.ステッピングモーターは、電気パルスを角変位に変換するアクチュエーターです。
- 2.ステッピングドライバーはパルス信号を受信すると、ステッピングモーターを駆動して一定角度(およびステップ角)を設定方向に回転させます。
- 3.正確な位置決めの目的を達成するために、パルス数を制御することによって角変位を制御します。
- 4.同時に、パルス周波数を制御することにより、モーター回転の速度と加速度を制御することができ、速度調整の目的を達成します。
この記事で言及されているモーターに固有の、28BYJ48ステッピングモーター:
- 1.駆動電圧はDC5V〜DC12Vです。
- 2.各パルス信号は、ステッピングモーターの特定の相または二相巻線の電源オン状態を1回変更します。これは、ローターが特定の角度(ステップ角度)を回転することに対応します。
- 3.電源投入状態の変更がサイクルを完了すると、ローターは1ピッチ回転します。
- 4. 4相ステッピングモーターは、さまざまなパワーオンモードで動作できます。一般的なパワーオンモードは、シングル(単相巻線パワーオン)4ビート(ABCDA)ダブル(2相巻線パワーオン)です。 4ビート(AB-BC-CD-DA)-AB)、8ビート(A-AB-B-BC-C-CD-D-DA-A)。
2.ステッピングモータードライブの設計
上記の拍数に対応する関係図は次のとおりです。
ここで私は彼を表にリストします:
4つのアイテム8ビート
巻き取り | 一 | 2 | 三 | 四 | ファイブ | 六 | セブン | 8 |
---|---|---|---|---|---|---|---|---|
A | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
B | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
C | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
D | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
対応する概略図
フォーシングルフォーショット
巻き取り | 一 | 2 | 三 | 四 |
---|---|---|---|---|
A | 0 | 1 | 1 | 1 |
B | 1 | 0 | 1 | 1 |
C | 1 | 1 | 0 | 1 |
D | 1 | 1 | 1 | 0 |
対応する概略図
4つのアイテムが4つのビートを2倍にする
巻き取り | 一 | 2 | 三 | 四 |
---|---|---|---|---|
A | 0 | 0 | 1 | 1 |
B | 1 | 0 | 0 | 0 |
C | 1 | 1 | 1 | 0 |
D | 0 | 1 | 1 | 0 |
回転角の計算:
28BYJ-48ステッピングモーターのステップ角は5.625度です。つまり、各パルスは5.625度回転し、360 / 5.625 = 64であるため、64パルスが1回転しますが、これはモーターのローターとローターを指します。出力軸へギア減速機が接続されており、減速比は64で、ローターは64回転し、出力軸は1回転します。したがって、64 * 64=4096パルスで出力軸を1回転させることができます。
4ビートと8ビートに対応する計算の観点から:
8ビートの計算式=64角度/360/8、4ビートの計算式=64角度/360/4。
3.ステッピングモータードライバーの作成
まず、cubemxで対応するピンを初期化します:上記のタイミングに従って
シングル4ビート
に対応する4つのプログラムを書き込みます。上記のタイミングに従ってダブル4ビートに対応する4つのプログラムを書き込み
ます。8ビートの対応するプログラム
上記の4拍と8拍の4つの項目の違いは精度です。他に違いはありません。もちろん、8拍の精度は4拍の精度よりも高くなります。
もちろん、もっと上手くやりたい場合は、下方向のベロシティ関数を用意することもできます。方向を変えるのは、実際には上記の4拍と8拍のシーケンスを逆にすることで、とても便利です!
ここでは、前述の角度計算方法でも説明されている角度関数も追加しました。
main関数の呼び出し状況は次のとおりです。ここでは、前方に180度、後方に180度回転させます。
4.ソースコード
uln2003.c
/*
* uln2003.c
*
* Created on: Feb 17, 2022
* Author: LX
*/
#include "uln2003.h"
void motor_stop()
{
MA_LOW;MB_LOW;MC_LOW;MD_LOW;
}
void motor_start_sig4(uint8_t motor,uint8_t speed) //四项单四拍
{
switch(motor)
{
// 0111 1011 1101 1110,这个过程逆向为反向
case 0:
MA_LOW;MB_HIGH;MC_HIGH;MD_HIGH;
break;
case 1:
MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 2:
MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
break;
case 3:
MA_HIGH;MB_HIGH;MC_HIGH;MD_LOW;
break;
}
HAL_Delay(speed);
motor_stop();
}
void motor_start_dou4(uint8_t motor,uint8_t speed) //四项双四拍
{
switch(motor)
{
// 0110 0011 1011 1100,这个过程逆向为反向
case 0:
MA_LOW;MB_HIGH;MC_HIGH;MD_LOW;
break;
case 1:
MA_LOW;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 2:
MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 3:
MA_HIGH;MB_HIGH;MC_LOW;MD_LOW;
break;
}
HAL_Delay(speed);
motor_stop();
}
void motor_start_eig(uint8_t motor,uint8_t speed) //四项八拍
{
switch(motor)
{
// 0111 0011 1011 1001 1101 1100 1110 0110,这个过程逆向为反向
case 0:
MA_LOW;MB_HIGH;MC_HIGH;MD_HIGH;
break;
case 1:
MA_LOW;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 2:
MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 3:
MA_HIGH;MB_LOW;MC_HIGH;MD_LOW;
break;
case 4:
MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
break;
case 5:
MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
break;
case 6:
MA_HIGH;MB_HIGH;MC_HIGH;MD_LOW;
break;
case 7:
MA_LOW;MB_HIGH;MC_HIGH;MD_LOW;
break;
}
HAL_Delay(speed);
motor_stop();
}
uint8_t motor;
void motor_uln2003(uint8_t dir,uint8_t speed)
{
for(uint8_t i = 0;i<8;i++)
{
if(dir == 1)
{
motor++;
if(motor > 7)motor = 0;
}
else
{
if(motor == 0)motor = 8;
motor--;
}
motor_start_eig(motor,speed);
}
}
void motor_angle(uint8_t dir,uint16_t angle,uint8_t speed)
{
static uint8_t flag = 1;
if(flag == 1)
{
for(uint16_t num;num<64*angle/45;num++)
{
motor_uln2003(dir,speed);
flag = 0;
}
flag = 1;
}
}
uln2003.h
#ifndef ULN2003_H_
#define ULN2003_H_
#include "main.h"
#define MA_HIGH HAL_GPIO_WritePin(INTC_GPIO_Port, INTC_Pin, GPIO_PIN_SET)
#define MA_LOW HAL_GPIO_WritePin(INTC_GPIO_Port, INTC_Pin, GPIO_PIN_RESET)
#define MB_HIGH HAL_GPIO_WritePin(INTD_GPIO_Port, INTD_Pin, GPIO_PIN_SET)
#define MB_LOW HAL_GPIO_WritePin(INTD_GPIO_Port, INTD_Pin, GPIO_PIN_RESET)
#define MC_HIGH HAL_GPIO_WritePin(INTB_GPIO_Port, INTB_Pin, GPIO_PIN_SET)
#define MC_LOW HAL_GPIO_WritePin(INTB_GPIO_Port, INTB_Pin, GPIO_PIN_RESET)
#define MD_HIGH HAL_GPIO_WritePin(INTA_GPIO_Port, INTA_Pin, GPIO_PIN_SET)
#define MD_LOW HAL_GPIO_WritePin(INTA_GPIO_Port, INTA_Pin, GPIO_PIN_RESET)
void motor_stop();
void motor_start_sig4(uint8_t motor,uint8_t speed);
void motor_start_dou4(uint8_t motor,uint8_t speed);
void motor_start_eig(uint8_t motor,uint8_t speed);
void motor_uln2003(uint8_t dir,uint8_t speed);
void motor_angle(uint8_t dir,uint16_t angle,uint8_t speed);
#endif /* ULN2003_H_ */