ステッピングモーター駆動制御の概要(1)

この記事で駆動するステッピングモーターは、基本的な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_ */

おすすめ

転載: blog.csdn.net/m0_51220742/article/details/123658350