最初に
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
を入力
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ライセンス継承はお願いします。商用利用・改変・再配布は問題なし)です。