みなさん、こんにちは。Xiaozhengです。この記事では、PWM制御モーターとエンコーダーがモーター速度を読み取るためのSTM32CubeMX構成プロセスについて詳しく説明し、HALライブラリーを学習しようとしている友人がSTM32CubeMXの構成方法をよりよく理解できるようにします。
モータードライブとエンコーダーを理解していない小さなパートナーがいる場合は、以下を参照してください。
モータードライブの説明:[バランスカーの生産](2)モータードライブ(超詳細な説明)
エンコーダーの説明:[バランスカーの生産](3)エンコーダー説明(超詳細)
次の記事では、モーター速度のPIDアルゴリズム閉ループ制御(HALライブラリ)の使用について紹介します。
言うまでもありませんが、今日から学び始めましょう!
1.ハードウェアの準備
(1)必要なハードウェア
- チップ:STM32F103RCT6
- ドライブ:モータードライブボードまたはTB6612(モータードライブチップ)
- バッテリー:12Vリボバッテリー
- モーター:エンコーダー付きモーター
- ホイール:メカナムホイールを使用しています
(2)ハードウェア接続:
- PA8-モータードライブボードPWM1
- GND-モータードライブボードPWM2
(ここでは、反転する場合はPWM1が接地され、PWM2はPA8に接続されます。両方を車のPWMピンに接続する必要がある場合は、正回転:PWM1は特定のデューティサイクル、PWM2デューティサイクルは0) - PA9(USART1_RX)-シリアルポートTXに接続します
- PA10(USART1_TX)-シリアルポートRXに接続します
- PB6-エンコーダA
- PB7-エンコーダB
2. STM32CubeMX構成:
1.1使用したツール:
- チップ:STM32F103RCT6
- IDE:MDK-Keilソフトウェア
- STM32F1xxHALライブラリ
1.2知識の要約:
- STM32CubeMXはTIMx、USARTルーチンを作成します
- Keilソフトウェアプログラミング
1.3プロジェクトの作成
1.チップセレクト
チップ:STM32F103RCT6(独自のボードに応じて選択)
2. RCCを
設定し、高速外部クロックHSEを設定し、外部クロックソースを選択します
3. LED1の構成
使用しているボードのLED1ピンはPD2で、初期レベルはハイです。目的は、ライトのオンとオフを観察して、タイマー割り込みに入ったかどうかを判断することです。
4. USART1は
非同期の送受信を構成し、デフォルトのボーレートは115200ビット/秒です。
5. PWM構成で
は、タイマー1のチャネル1とチャネル4(TIM1_CH1とTIM1_CH4)、周波数10KHzを使用します。
6.タイマー割り込み設定
はタイマー2(TIM2)を使用し、周期は10msに設定されます。つまり、タイマー割り込みは10msに1回入力されます。
更新タイマー割り込みをオンにする
7.エンコーダ構成
STM32にはエンコーダ構成が付属しており、タイマー4(TIM4_CH1およびTIM4_CH2)を使用して、更新タイマー割り込みを開きます。
8.割り込み優先度の設定
エンコーダ割り込みはタイミング10msの割り込み内に発生するため、エンコーダ割り込みのプリエンプション優先度はタイミング10msより大きくする必要があります。
9.構成クロック
F1シリーズチップシステムクロックは72MHzです
10.プロジェクト作成の最終ステップ
- プロジェクト名を設定する
- IDEを選択してください
11.出力ファイル
- ②場所:使用したファイルの.cと.hをコピーします
- ③Office:各関数は独立した.cファイルと.hファイルを生成します
12.プロジェクトファイルを作成し、
[コードの生成]をクリックしてプロジェクトを作成します
13.ダウンロードツールを構成します。
ここでは、ダウンロードを確認して直接実行してから、コンパイルを実行する必要があります。
3. STM32ソースコード:
(1)halライブラリを使用したことがある方は、以下のコードがわかりやすいはずです。Xiaozhengはあまり説明しません。理解できない場合は、コメント欄に質問してください。main.cに追加:
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "math.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
unsigned int MotorSpeed; // 电机当前速度数值,从编码器中获取
int MotorOutput; // 电机输出
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *p)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = ch;
return ch;
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // TIM1_CH1(pwm)
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_1); // 开启编码器A
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_2); // 开启编码器B
HAL_TIM_Base_Start_IT(&htim2); // 使能定时器2中断
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char i = 0;
if (htim == (&htim2))
{
//1.获取电机速度
MotorSpeed = (short)(__HAL_TIM_GET_COUNTER(&htim4)/18);
// TIM4计数器获得电机脉冲,该电机在10ms采样的脉冲/18则为实际转速的rpm
__HAL_TIM_SET_COUNTER(&htim4,0); // 计数器清零
//2.将占空比导入至电机控制函数
MotorOutput=3600; // 3600即为50%的占空比
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, MotorOutput);
MotorOutput=MotorOutput*100/7200;
// 占空比(按最高100%计算,串口打印)
i++;
if(i>100)
{
// 通过观察小灯亮灭来判断是否正确进入定时器中断
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);
// 打印定时器4的计数值,short(-32768——32767)
printf("Encoder = %d moto = %d \r\n",MotorSpeed,MotorOutput);
i=0;
}
}
}
/* USER CODE END 4 */
(2)STM32、シリアルポートディスプレイに書き込みます。
(3)物理的な表示:
4.ダウンロード
(1)プログラムのダウンロードアドレス:https
://pan.baidu.com/s/1mXYS8lQKaMX6XNA961UuJw抽出コード:z3ax
(2)シリアルポートアシスタントのダウンロードアドレス:https
://pan.baidu.com/s/11xBkoLBMVcIv7QNALpOeeg抽出コード:yzx3
5.まとめ
上記は、モーター速度のPWM制御とモーター速度を読み取るエンコーダーのHALライブラリ構成とキールプログラミングです。モーター速度のPIDアルゴリズム閉ループ制御(HALライブラリ)の使用については、後で紹介します。記事に誤りがある場合、または小さなパートナーが上記の内容について質問がある場合は、コメント領域にメッセージを残してください。Xiaozhengはそれを見た後できるだけ早く返信します!またね!