2016年7月8日金曜日

STM32F1のDAC

ADCを試したいが、適当なアナログソースが無いので、内蔵しているDACから波形を出力することにした。

まず初期化。

/*
    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 件のコメント:

コメントを投稿