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