まず初期化。
/*
DACを使う場合、GPIOはAINで初期化すること
(RM0008日本語訳Rev11, 12.2(p251)による)
*/
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_1, ENABLE);
DAC_Cmd(DAC_Channel_2, ENABLE);
とりあえずDAC1, DAC2の両方を初期化してみる。
DACの出力ピンは固定で、リマップとかはできない。
値を出力するにはDAC_SetChannel1Data(DAC_Align_12b_R, val);のような関数を使う。この例では右詰めだが、左詰めにすると16bitの下位4bit切り捨てと同じような動作になるので、16bitのWAVEデータを出したりするには左詰めが便利。
DACのOutputBuffが有効なときは最小で5kΩ、無効なときは最大で15kΩになるらしい。有効な時の最大インピーダンスは書かれていない。バッファを有効にしてもせいぜい2倍とか3倍しか変わらないが、ないよりはマシかな。
次はを実装する。正弦波あたりがほしいので、TIMとDMAで流し込む感じになるのかな。
0 件のコメント:
コメントを投稿