UP

DACを使う

簡単な任意波形発生器

任意波形発生器

TIM2で定期的に割り込みを発生し、その都度固定データ列を順にDACに 送りアナログ値として出力する。青ボタンが押されるとTIM2割り込みの 頻度が半分ずつに(周期が倍に)なる。

DACの初期設定

  CLK_PeripheralClockConfig(CLK_Peripheral_DAC, ENABLE);
  DAC_DeInit();
  DAC_Init(DAC_Channel_1, DAC_Trigger_None, DAC_OutputBuffer_Enable);
  DAC_Cmd(DAC_Channel_1, ENABLE);

TIM2の設定

今回は繰り返し設定に(最後の行)。
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
  TIM2_DeInit();
  TIM2_TimeBaseInit(TIM2_Prescaler_64,TIM2_CounterMode_Up,itmp-1);
  TIM2_UpdateRequestConfig(TIM2_UpdateSource_Global);
  TIM2_ITConfig(TIM2_IT_Update, ENABLE);
  TIM2_SelectOnePulseMode(TIM2_OPMode_Repetitive);

TIM2割り込み

DACに送るデータを配列dmap(8bit x 128)に用意しておき、 TIM2割り込みが発生するごとにDACに書き込んでいく(今回は8bitで):
INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19)
{
  static uint8_t daci=0;

  daci++; daci&=0x7f;
  DAC_SetChannel1Data(DAC_Align_8b_R,dmap[daci]);

  TIM2_ClearITPendingBit( TIM2_IT_Update );
}

動作周波数

TIM2割り込みの頻度が高すぎると出力が出ない。以下はプリスケーラと プリスケーラとカウンタの積の設定値と出力周波数(Hz)の計算値と実際の値の表:
                prescaler
積      計算値  128     64      32      16      8       4       2       1
16      7812.                                   1224
32      3906.                                   1170.6
64      1953.                   975.3           975.2
128     976.6           975.5   975.5           975.1
256     488.3   487.8   487.8   487.8           487.7
512     244.1   243.9   243.9                   243.9
1024    122.1   121.9   122.0
2048    61.04   60.94   60.96
4096    30.52   30.48   30.48
8192    15.26   15.24   15.24
16384   7.629   7.62    7.62
32768   3.814   3.81    3.81
65536   1.907   1.904   1.906
正常に動作するのは1kHz程度までのようだ(1データ点あたり10μsecくらい)。 ちなみにSTM8L DISCOVERYの サンプルプロジェクトにwavegeneratorがあり、これはDACの書き込みに DMAを使っていて20kHz(だったかな)まで動く。

動作波形

正弦波を出力した場合。

最速時:

最速時

高速動作時に波形が歪むのはDACの出力バッファをONにしているせいも あるかも(未確認)。

その4倍の周期:

少し遅く

遅い時:

低速時


プロジェクト一式(zipファイル)mdac.zip


2012.03
mm@ils.uec.ac.jp