Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_14(AD変換とPWM出力)

 

STM32:AD変換とPWM出力

1.本日の内容

(1) STM32マイコン(nucleo f401RE)を使用して、PWM出力をする。

 (2) AD変換で電圧を取得し、その値によって

  ・PWM出力を変更

  ・Teratermで値を出力

  ・LEDの光度変更をする。

 (3) PWMの出力をオシロスコープで確認する。

  オシロスコープは簡易キットを使用

 

・目次

 

2.内容

​​(1) やる内容の詳細​

  ・STM32マイコン(nucleo f401RE)を使用して、PWM出力する。

    ・AD変換で電圧を読み込み、可変抵抗を変えることに

  ・PWMの出力を簡易オシロスコープで確認し、動きを理解する。

(2) 使用部品​
個数 部品名 型番
1 USBケーブル ​​USBミニBタイプ
1 mbed(マイコンボード) ​​nucleo f401RE
1 ブレッドボード・ジャンパーワイヤ(オス-オス) BBJ-65
1

小型ボリューム

JH16K4B103L20KC-A

オシロスコープは下記オシロスコープキットを使用している。

オシロスコープ

※可変抵抗は、ここではジャンパワイヤを直接はんだ付けしている。

はんだ付けなどができない場合は、小型クリックなどを使うと良い。

小型クリップ付コード 5色 45cm 10本入: パーツ一般 秋月電子通商-電子部品・ネット通販

 

(3) STM32CubeMXの設定、プログラムを出力

  (a)使用ピンを設定
   ・PA1:TIM5_CH2 :オシロスコープ確認用

   ・PA5:TIM2_CH1 :LED確認用

   ・PA0:ADC1_IN0 :可変抵抗の入力用

   ・PA2:USART2_TX:Teraterm

   ・PA3:USART2_RX:Teraterm

   

CubeMXの設定については下記記事参照。

 ・STM32マイコン_12(printfの導入)

 ・STM32マイコン_13(PWM出力)

 

(4) AtricTrueStdioでプログラム作成
  (a) AtricTrueStdioから開く場合(上記(e)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーに作成したプロジェクトの名前が表示
    ・チェックされているのを確認して、終了をクリック 

 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
   ・下記プログラムを記載する。
/* USER CODE BEGIN Includes */
//printf用ヘッダインクルード
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
//ADCの値格納用変数定義
__IO uint16_t analogValue;
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
int __io_putchar(int c) {
  if( c == '\n' ) {
    int b = '\r';
    HAL_UART_Transmit(&huart2,(uint8_t*)&b, 1, 1);
  }
  HAL_UART_Transmit(&huart2,(uint8_t*)&c, 1, 1);
  return 0;
}
/* USER CODE END 0 */
  /* USER CODE BEGIN 2 */
  	//TIMの開始
  	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);	//TIM2のchannel1開始
  	HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);	//TIM5のchannel2開始
  /* USER CODE END 2 */
 while (1)
  {
    /* USER CODE BEGIN 3 */
  //AD値をとりこみ、それにより、PWM変更
	  //ADCスタート
	  HAL_ADC_Start(&hadc1);
	  //AD変換が正しく処理終わり、1000ms以内に値が入るか
	  if(HAL_ADC_PollForConversion(&hadc1,1000)==HAL_OK){
		  //AD変換の値をanalogValueに格納
		  analogValue = HAL_ADC_GetValue(&hadc1);
	  }

	  //ADC終了
	  HAL_ADC_Stop(&hadc1);

	  //analogValueをMAX1000に設定
	  analogValue = analogValue*1000/4095;
	  //注:analogValue = analogValue/4095*1000だと0になる。
	  //teraterm表示
	  printf("analog=%d",analogValue);

	  //TIM5のchannnel2の出力をanalogValueに設定
	  __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, analogValue);
	  //TIM2のchannel1の出力をanalogValueに設定 (LED光度変更)
	  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, analogValue);
  }
  /* USER CODE END 3 */
プログラムの内容についても、下記記事を参照。

 ・STM32マイコン_12(printfの導入)

 ・STM32マイコン_13(PWM出力)

 

3.関連記事

組み込みC言語