STMicroelectronics社純正開発環境Cube IDEを使用し、STM32のHAL(hardware abstraction layer)を思いつくまま試用中。今回はアナログ出力を行ってみたいと思います。DAコンバータね。まずはソフトウエアループで出力タイミングを制御してゆっくりした三角波を出力してみます。
※Windows 11 PC上にインストールしたSTM32CubeIDE Version: 1.13.2上で動作を確認しています。今回のターゲットボードは Nucleo-F072RBです。
STM32F072RBのDAC
STM32F072RBは、STM32の中では「お求めやすい」価格帯の機種だと思うのですが、ゴージャスなことに12ビットのDACを1ユニット搭載しています。チャネル的には2チャンネル持っているので、2つのアナログ出力を制御可能。ただし今回ターゲットにしているNucleo-F072RBでは、アナログ出力にアサインされている端子のうち1本が、ユーザLED(LD2)に接続されてしまってます。そのためアナログ出力として使えるのはチャネル1だけです。チップの出力的にはPA4端子です。この端子はNucleo-F072RBのもつArduino互換ピンソケットのA2端子に接続されてます。
ある「サンプリング周波数」で正確にDAC出力を行いたいという要求は当然ある筈。そのためSTM32では出力タイミングの制御のためにタイマをトリガに使ったり、出力値をDMAでメモリからとってきたりする機構が存在します。ただし、今回はソフトウエアループの中でソフトで出力値をセットしていく「一番原始的な」方法で実験です。
また、DA出力には内蔵の出力バッファを付加することが可能になっており、ある程度のドライブ能力を持たせることが可能になっています。今回は駆動用の外付けのボルテージ・フォロワなどは使用せず、この内蔵バッファにより出力した電圧をそのまま外部で観察したいと思います。
CubeIDEでのDACのセッティング
セッティング画面が以下に。OUT2 Configurationのところが赤に反転していますが、これはターゲットボードをNucleo-F072RBと指定してあるので、IDE側で自動的にここは使えんと判断してくれているみたいです。
上記のようにDAC Out1のOutput BufferはEnable、トリガはNode(ソフトでタイミングをとるもんね)という設定です。右側のピンで赤丸しましたが、OUT1にチェック入れるだけでPA4がアナログ出力端子に設定されてます。ここに見えている通りで初期化コードを生成してくれるのでとっても便利。
実験に使用したソース
今回はSTM32mcu/wiki内の以下を参照(そのままじゃないケド)させていただいております。
https://wiki.st.com/stm32mcu/wiki/Getting_started_with_DAC
上記の設定でGenerateしたソースコードのmain.c内の /* USER … */印のところに書き加えたのは以下です。まずは大域変数2つ。
/* USER CODE BEGIN PV */ uint16_t dac_value=0; int updown = 0; /* USER CODE END PV */
続いてDACのスタート指令。初期化は全て自動生成コードで行ってくれるので、スタート(あるいはストップ)するところだけがUSER任せです。
/* USER CODE BEGIN 2 */ HAL_DAC_Start(&hdac, DAC_CHANNEL_1); /* USER CODE END 2 */
最後にmain()関数内の無限ループ部分。Getting startedではノコギリ波であったので、こちらは3角波でどうよ、と。また、オシロで測定しやすいようにちょっと周波数を早く(レゾリューションは粗く)してます。
/* USER CODE BEGIN 3 */ HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_value<<4); if (updown == 0) { dac_value++; if (dac_value > 254) updown = 1; } else { dac_value--; if (dac_value < 1) updown = 0; } HAL_Delay(1); } /* USER CODE END 3 */
実機上での実行
PA4端子(ArduinoピンソケットのA2端子)で観測できた波形が以下に。
まあ、想定通りの波形でないかい。