0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

P-NUCLEO-IHM001 マイコンでブラシレスモータを回す

Posted at

最初に

P-NUCLEO-IHM001 マイコンとは

スペック表
項目 内容 備考
プロセッサ STM32F302R8 Cortex-M4 32ビット CPU
MODEL STM32F302R8 64-Kbyte Flash memory and 16-Kbyte SRAM
メーカー ST
ADC 2 12bit
DAC 1 12bit
I2C 1
SPI 1
PWM - ソフトウェアPWM
Arduiono 互換 追加のボードマネージャーURL [STM32F302]
https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

使うまで

下準備
1.Arudion IDE準備[追加のボードマネージャー]
ファイル→基本設定→追加のボードのマネージャーURLに入力
https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
を入力
3.Arudion IDE準備[ボード]
ツール→ボード→ボードマネージャー
ツール→ボード→[STM32 MCU based board]→メニューから[Nucleo-64]
4.Arudion IDE準備[ポード]
ツール→ポード→USB COMポートを選択

Arudiono IDEで使う

モーターを回転させる
スケッチ
////////////////////////////////
//  PWMサイクル定義
////////////////////////////////
#define CYCLE_TERM        1200    //  1サイクル(2×3相)あたりのミリ秒
#define CYCLE_TIMES       6       //  1サイクル(2×3相)あたりのOn/Off数(エンコーダがあるので1相×2)

////////////////////////////////
//  PWMピン定義(回転数に影響)
////////////////////////////////
#define MOTOR_IN1_PWMv_PIN  7     //  IN1  - ARDUINO PIN7 = Nuclero C10_23
#define MOTOR_IN2_PWMu_PIN  8     //  IN2  - ARDUINO PIN8 = Nuclero C10_21
#define MOTOR_IN3_PWMw_PIN  2     //  IN3  - ARDUINO PIN2 = Nuclero C10_33

////////////////////////////////
//  ENxピン定義(回転方向に影響)
////////////////////////////////
#define MOTOR_EN1_OUT_PIN   PC10  //  EN1  - ARDUINO PC10 = Nuclero C7_1
#define MOTOR_EN2_OUT_PIN   PC11  //  EN2  - ARDUINO PC11 = Nuclero C7_2 
#define MOTOR_EN3_OUT_PIN   PC12  //  EN3  - ARDUINO PC12 = Nuclero C7_3

////////////////////////////////
//  v/u/wパターン定義
//    channelOn()関数用
////////////////////////////////
#define MOTOR_PWMv_CHANNEL 1  //  PWMv
#define MOTOR_PWMu_CHANNEL 2  //  PWMu
#define MOTOR_PWMw_CHANNEL 3  //  PWMw

////////////////////////////////
//  PWM値
//    0-256が出力範囲
////////////////////////////////
#define PWM_ON_VALUE      256 //  0-256
#define PWM_OFF_VALUE     0   //  0-256

////////////////////////////////
//  初期設定
////////////////////////////////
void setup()
{
  Serial.begin(9600);

  //  モーターPWM出力設定
  pinMode(MOTOR_IN1_PWMv_PIN, OUTPUT);
  pinMode(MOTOR_IN2_PWMu_PIN, OUTPUT);
  pinMode(MOTOR_IN3_PWMw_PIN, OUTPUT);

  //  モーターEN出力設定
  pinMode(MOTOR_EN1_OUT_PIN, OUTPUT);
  pinMode(MOTOR_EN2_OUT_PIN, OUTPUT);
  pinMode(MOTOR_EN3_OUT_PIN, OUTPUT);
}

////////////////////////////////
//  メインループ
////////////////////////////////
void loop()
{
  //  v-u-wの順で出力
  channelOn(MOTOR_PWMv_CHANNEL);
  channelOn(MOTOR_PWMu_CHANNEL);
  channelOn(MOTOR_PWMw_CHANNEL);
}

////////////////////////////////
//  channelOn
//  チャネルーOn処理
//  引数1:chNo(MOTOR_PWMv_CHANNEL, MOTOR_PWMu_CHANNEL,MOTOR_PWMw_CHANNEL指定のこと)
////////////////////////////////
void channelOn(int chNo)
{
  int valuePWNv;
  int valuePWNu;
  int valuePWNw;

  int valueEN1_1;
  int valueEN2_1;
  int valueEN3_1;

  int valueEN1_2;
  int valueEN2_2;
  int valueEN3_2;

  valuePWNv = PWM_OFF_VALUE;
  valuePWNu = PWM_OFF_VALUE;
  valuePWNw = PWM_OFF_VALUE;

  switch (chNo) {
    case  MOTOR_PWMv_CHANNEL: //  PWMv On
      //  PWM出力にするチャネル
      valuePWNv = PWM_ON_VALUE;
      //  EN出力パターン(前と後ろ)
      valueEN1_1 = LOW;       
      valueEN2_1 = HIGH;
      valueEN3_1 = HIGH;
      valueEN1_2 = HIGH;
      valueEN2_2 = HIGH;
      valueEN3_2 = LOW;
      break;
    case  MOTOR_PWMu_CHANNEL: //  PWMu On
      //  PWM出力にするチャネル
      valuePWNu = PWM_ON_VALUE;
      //  EN出力パターン(前と後ろ)
      valueEN1_1 = HIGH;
      valueEN2_1 = HIGH;
      valueEN3_1 = LOW;
      valueEN1_2 = HIGH;
      valueEN2_2 = LOW;
      valueEN3_2 = HIGH;
      break;
    case  MOTOR_PWMw_CHANNEL: //  PWMw On
      //  PWM出力にするチャネル
      valuePWNw = PWM_ON_VALUE;
      //  EN出力パターン(前と後ろ)
      valueEN1_1 = HIGH;
      valueEN2_1 = LOW;
      valueEN3_1 = HIGH;
      valueEN1_2 = LOW;
      valueEN2_2 = HIGH;
      valueEN3_2 = HIGH;
      break;
  }

  /////
  //  最初の半分(エンコーダパターン設定のため、前と後ろで出力を分ける)
  /////
  analogWrite(MOTOR_IN1_PWMv_PIN,  valuePWNv);
  analogWrite(MOTOR_IN2_PWMu_PIN,  valuePWNu);
  analogWrite(MOTOR_IN3_PWMw_PIN,  valuePWNw);
  digitalWrite(MOTOR_EN1_OUT_PIN,  valueEN1_1);
  digitalWrite(MOTOR_EN2_OUT_PIN,  valueEN2_1);
  digitalWrite(MOTOR_EN3_OUT_PIN,  valueEN3_1);
  delay(CYCLE_TERM / CYCLE_TIMES);

  /////
  //  後ろの半分(エンコーダパターン設定のため、前と後ろで出力を分ける)
  /////
  analogWrite(MOTOR_IN1_PWMv_PIN,  valuePWNv);
  analogWrite(MOTOR_IN2_PWMu_PIN,  valuePWNu);
  analogWrite(MOTOR_IN3_PWMw_PIN,  valuePWNw);
  digitalWrite(MOTOR_EN1_OUT_PIN,  valueEN1_2);
  digitalWrite(MOTOR_EN2_OUT_PIN,  valueEN2_2);
  digitalWrite(MOTOR_EN3_OUT_PIN,  valueEN3_2);
  delay(CYCLE_TERM / CYCLE_TIMES);
}

最後に

スケッチコードはCC BY-SA 4.0(著作者の情報とCCライセンス継承はお願いします。商用利用・改変・再配布は問題なし)です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?