【バランスカーの製作】(2)モータードライブ(超詳細説明)

  みなさん、こんにちは。Xiaozhengです。この記事では、バランスカーのモーター制御について詳しく説明します。モーターを駆動する上で最も重要なことは、PWM信号を与えることです。PWMの概念、モーターの駆動方法、モーター速度の調整方法PWMデューティサイクルを変更することにより、この記事で詳細に説明します。各パートナーに、PWM(パルス幅変調)とモーター制御をより明確に理解させます。

1.ハードウェア設計

1. DC減速モーター
  DC減速モーター、つまりギア減速モーターは、通常のDCモーターとそれに対応するギア減速ボックスをベースにしています。ギア減速機の機能は、より低速でより大きなトルクを提供することです。
  簡単に言うと、STM32は2つのIOポートをDCギア付きモーターに割り当て、モーターを順方向または逆方向に回転させるための高レベルと低レベルを提供します。
  私が使用しているモーターはGM25-370DCギヤードモーター(ホールエンコーダー付き)、動作電圧:6-24VDC、定格電圧12V、定格電流0.65A、無負荷速度350RPM、定格電力5W、最大精度、1496CPR、装備CPRホールAB二相エンコーダ、減速後、単一の円で374個の直交パルスを出力します。
ここに画像の説明を挿入

図1GM25-370 DCギヤードモーター(ホールエンコーダー付き)

ここに画像の説明を挿入

図2ホールエンコーダインターフェースピン

2. TB6612FNGモータードライブチップは、車のステアリングと前後制御を実現する必要
  があり、STM32を使用して実現できますが、STM32のIOポートは負荷容量が弱く、DCモーターは大電流誘導負荷です。 、パワーアンプが必要です。ここでは、TB6612FNGモータードライバーチップを使用することにしました
  TB6612FNGは、東芝セミコンダクター製のDCモーター駆動装置で、大電流MOSFET-Hブリッジ構造、デュアルチャネル回路出力を備え、2つのモーターを同時に駆動できます。TB6612FNGは、L298Nの放熱・周辺ダイオードフリーホイーリング回路と比較して、外部ヒートシンクが不要で、周辺回路がシンプルです。モーターを直接駆動できるのは外部電源フィルタコンデンサのみで、システムサイズの縮小に役立ちます。 。PWM信号の入力周波数範囲は、10KHzの周波数を使用し、デューティサイクルを変更してモーターの速度を調整します。
特徴:

  • 各チャネルは最大1.2Aの連続駆動電流を出力し、開始ピーク電流は2A / 3.2A(連続パルス/単一パルス)に達します。
  • 4つのモーター制御モード:前進/後進/ブレーキ/停止;
  • PWMは最大100kHzの周波数をサポートします。
  • スタンバイモード;
  • オンチップ低電圧検出回路とサーマルシャットダウン保護回路。
  • 使用温度:-20〜85°C
  • パッケージ:SSOP24(PCBを描くときは注意してください!)

ピンの紹介:

  • VM1:電源入力(モーター入力電源)、ここでは12Vに設定します。
  • VCC:ドライブ電源入力(ドライブチップ)、ここでは5Vに設定します。
  • GND:チップ上のグランドは共通グランドです。
  • STNDBY:ENに相当する、高レベルでアクティブなトータルイネーブル端子。ここでは、VCCに直接接続されています。
  • PWMA、PWMB:MCUからの入力、PWM周波数を10Khzに設定
  • AIN1、AIN2:モーターステータス制御。
  • A0、A1、B0、B1:モーターへの出力。

バランスカーで使用されるピン:
  モーター1——PB12 / PB13
  モーター2——PB14 / PB15
  PWM1
  ——PA8 PWM2——PA11
ここに画像の説明を挿入

図3TB6612FNGモータードライブチップ

ここに画像の説明を挿入

図4AN1ピンとAN2ピンの高レベルと低レベルはモーターの状態に対応します

3. TB6612FNGは大電流MOSFET-Hブリッジ構造であるという上記のHブリッジ駆動回路
  なので、多くの友人が質問したいと思います。Hブリッジ構造とは何ですか。Hブリッジ回路の構造を簡単に理解できるように、次の2つの写真を例として取り上げます。
注:図中の回路Q1、Q2、Q3、Q4はトランジスタであり、TB6612には4つのMOSFETが組み込まれています。次の図を例として使用します。下の図をTB6612の内部回路と見なさないでください。 TB6612の内部回路は参考書でご覧いただけます。チップ
見つけるための推奨ウェブサイトは次のとおりです。http//www.semiee.com/(Peninsula Xiaoxin)①Q1
  、Q4がオンで、Q2、Q3がオフの場合、電流はQ1から流れます。モーターの正極からモータの負極へ、そしてQ4から流出してループを完成させ、モーターは前方に回転します。
ここに画像の説明を挿入

図5Hブリッジ回路:モーターが前方に回転します

  ①Q2、Q3がオン、Q1、Q4がオフになると、電流はQ3からモーターの負極からモータの正極を通って流れ、Q2から流出してループを完成させます。モーターが逆転します。
ここに画像の説明を挿入

図6Hブリッジ回路:モーターリバース

2、ソフトウェアプログラミング

1.モーター駆動機能-motor.c1
)モーターGPIO初期化関数
 入力パラメーター:なし

  • GPIO-PB12、PB13、PB14、PB15をプッシュプル出力として初期化します
void Motor_Init(void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 开启时钟
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 初始化GPIO--PB12、PB13、PB14、PB15为推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);	
}

2)制限機能
 入力パラメータ:モーターAのパルス数、モーターBのパルス数

  • モーターのパルス数を指定範囲内に制限すると、最大値、つまり自動リロード値があります(PWM_MAX = 7200、PWM_MIN = -7200に設定)
void Limit(int *motoA,int *motoB)
{
    
    
	if(*motoA>PWM_MAX)*motoA=PWM_MAX;
	if(*motoA<PWM_MIN)*motoA=PWM_MIN;
	
	if(*motoB>PWM_MAX)*motoB=PWM_MAX;
	if(*motoB<PWM_MIN)*motoB=PWM_MIN;
}

3)絶対値関数(非常に汎用的で、保存することをお勧めします!!)
 入力パラメーター:従来の変数

  • 0と比較すると、0より大きい場合は変更されていない値が返され、0より小さい場合は反対の値が返されます。
int GFP_abs(int p)
{
    
    
	int q;
	q=p>0?p:(-p);
	return q;
}

4)代入関数の
 入力パラメータ:モーターAのパルス数、モーターBのパルス数

  • 入力パラメータは、PID計算が完了した後の最終的なPWM値です(PIDアルゴリズムの実装については後で説明します)。
void Load(int moto1,int moto2)
{
    
    
	//1.研究正负号,对应正反转
	if(moto1>0)	
    	Ain1=1,Ain2=0;//正转
	else 				
    	Ain1=0,Ain2=1;//反转
	//2.研究PWM值
	TIM_SetCompare1(TIM1,GFP_abs(moto1));
	
  	//1.研究正负号,对应正反转
	if(moto2>0)
    	Bin1=1,Bin2=0;
	else 				
    	Bin1=0,Bin2=1;	
  	//2.研究PWM值
	TIM_SetCompare4(TIM1,GFP_abs(moto2));
}

2.モータードライバー関数ヘッダーファイル-motor.h

#ifndef  _MOTOR_H
#define  _MOTOR_H

#include "sys.h" 

#define Ain1  PBout(14)
#define Ain2  PBout(15)

#define Bin1  PBout(13)
#define Bin2  PBout(12)

void Motor_Init(void);
void Limit(int *motoA,int *motoB);
int GFP_abs(int p);
void Load(int moto1,int moto2);
#endif

3.PWM関数-pwm.c1 。タイマー初期化関数の  入力パラメーター:プリスケーラー値、自動リロード値

  • PA8、PA11多重化プッシュプル出力
  • タイマー1チャンネル1とチャンネル4に対応
  • MOEメイン出力イネーブルをオンにします(アドバンストタイマー専用!!!)
void PWM_Init_TIM1(u16 Psc,u16 Per)
{
    
    
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO,ENABLE);//开启时钟
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;        // 初始化GPIO--PA8、PA11为复用推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_11;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);  // 初始化定时器。
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=Per;
	TIM_TimeBaseInitStruct.TIM_Prescaler=Psc;
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);   // TIM1
	
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;      // 初始化输出比较
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=0;
	TIM_OC1Init(TIM1,&TIM_OCInitStruct);
	TIM_OC4Init(TIM1,&TIM_OCInitStruct);
	
	TIM_CtrlPWMOutputs(TIM1,ENABLE);// 高级定时器专属!!!--MOE主输出使能
	
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC1预装载寄存器使能
	TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC4预装载寄存器使能
	TIM_ARRPreloadConfig(TIM1,ENABLE);// TIM1在ARR上预装载寄存器使能
	
	TIM_Cmd(TIM1,ENABLE);           // 开定时器。
}

4.PWM関数ヘッダーファイル-pwm.h

#ifndef  _PWM_H
#define  _PWM_H

#include "sys.h" 

void PWM_Init_TIM1(u16 Psc,u16 Per);
#endif

  上記は、バランスカーシリーズの記事-モータードライブの2回目の講義で、ハードウェア構造の説明とSTM32ソフトウェアプログラミングの説明が含まれています。記事に誤りがあるか、上記の内容について友人から質問があります。コメントにメッセージを残してください。エリア、Xiaozhengは私ができるだけ早くあなたに返信するのを見ています!
【バランスカー製作】(3)エンコーダー解説(超詳細解説)
https://blog.csdn.net/weixin_44270218/article/details/113195466

おすすめ

転載: blog.csdn.net/weixin_44270218/article/details/113276624