前回、DACから正弦波を出せるようになったので、それを利用してPGA(Programmable Gain Amplifier)の動作を確認します。
前回、DACは12bitでオフセット2048、振幅±1024、という設定でした。今回はアンプで増幅するので、振幅は±256、オフセットも256、という設定にします。これにより、0Vから0.41Vの正弦波を出力できます。ただし、DACのバッファを有効にしているとレールツーレールでスイングしてくれないので、DAC_OUTPUTBUFFER_DISABLEでバッファを無効にしています。
STM32F3のオペアンプはレジスタ1本で、最低限使うならそのうちの半分ほどを設定すれば十分なのですが、これが意外と曲者なので、おとなしくHALを使うことにします。とはいえ、HALも曲者なので、構造体の宣言ではクリアとInstanceの設定だけして、必要なところだけ設定します。
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_SYSCFG_CLK_ENABLE();
GPIO_InitTypeDef gpio_port_A{.Pin = GPIO_PIN_4, .Mode = GPIO_MODE_ANALOG};
GPIO_InitTypeDef gpio_port_B{.Pin = GPIO_PIN_12, .Mode = GPIO_MODE_ANALOG};
HAL_GPIO_Init(GPIOB, &gpio_port_A);
HAL_GPIO_Init(GPIOB, &gpio_port_B);
OPAMP_HandleTypeDef hopamp = {.Instance = OPAMP4};
hopamp.Init.Mode = OPAMP_PGA_MODE;
hopamp.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO2; // PA4 (DAC1 ch1)
hopamp.Init.PgaGain = OPAMP_PGA_GAIN_2;
HAL_OPAMP_Init(&hopamp);
HAL_OPAMP_Start(&hopamp);
PA4は前回DACの出力ポートとして初期化済みですが、コピペしたときに忘れると困るので、ここでも初期化しています。
とりあえずPGAモード、入力にPA4、ゲインは2、という設定でInitとStartを行います。
上からゲイン2、4、8、16、のときの、DAC出力(黄)とPGA出力(紫)です。
DACの振幅は0.46V程度で、ゲイン2では0.8V、4では1.6V、8では3.2V、と、設定どおりに増幅されています。ゲイン16は飽和してしまうため、上が切れた波形として出ています。
STM32F3のPGAは、ローサイドのシャントを受けることを想定しているのか、0Vを中心に増幅します。小型マイクのような物を使いたい場合は、結構面倒になりそうです。おとなしく固定ゲインの反転増幅回路とか組んだほうが楽だと思います。
PGAはもうちょっと多機能で、いろいろな使い方ができますが、面倒なので今回は扱いません。