春雨日記 about me tags

前回の投稿では単相PWMを扱いましたが,今度は3相で出力してみます.

注意:解説できるほど理解出来てないところがあるのでこうやったら出来たよ形式にします.

タイマを設定

同様にCubeIDEでプロジェクトを作り,タイマを設定します.

3相モータ制御ということで,こちらではCH1 CH1N形式で設定しています. それ以外は特に面白い所ないです.

パラメータは基本適当で大丈夫ですが(後で周波数設定するため)auto-reloadは有効にしておきます.

また,お好みでdead timeを設定します.

次,sin関数で使用する時間計測用のタイマを追加します.

基本的にsin関数は重いので使用するべきでは無いですが,今回は動作の確認ということで.

出力が不要なのでTIM11を使用しました.

1秒でカウンタがいっぱいになるように設定しています.溢れたら自動的にリセットされる上に,CPU負荷に依存しない(はず)なので便利.

コーディング

今回のコードは https://git.haru3.me/haru/f401tpwm/src/branch/master/Core/Src/main.c にアップしてありますので適宜参照してください.

メイン周り

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 /* USER CODE BEGIN WHILE */
  HAL_TIM_Base_Start_IT(&htim11);
  setPSC(84e6, 10e3, &htim1); //fc = 10kHz
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);

  double x1, x2, x3;
  double omega = 2*M_PI*100; //100Hz
  double time = 0;
  while (1)
  {
	  time = htim11.Instance->CNT / 65522.0;
	  x1 = sin(omega*time);
	  x2 = sin(omega*time + (2.0/3)*M_PI);
	  x3 = sin(omega*time + (4.0/3)*M_PI);
	  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,((x1+1)/2) * cmax);
	  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,((x2+1)/2) * cmax);
	  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,((x3+1)/2) * cmax);
    /* USER CODE END WHILE */

普通に時間計測用タイマを開始しつつPWMの出力も開始して,周波数を設定して….

といった感じです.

3相交流の各相は120°ずれるのでそれぞれsin関数の引数を変えています.実環境ではsinでやらない方が良いと思います.

得られる出力

こんな感じです.

オシロが2CHしかないのでいまいちわかりにくいですが,動画だとわかりやすいかも.

終わりに

3相モータの制御はまだやってないので未確認ですが,波形は良い感じなので大丈夫かな…