AT32的DAC有两个独立通道,每个通道可以分别产生稳定电平,三角波,模拟噪声三种输出波形。这里以三角波举例:
1)使能DAC对应时钟,对应GPIO时钟:
RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_DAC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);
2)配置DAC对应GPIO口为模拟模式:
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_ANALOG;
GPIO_Init(GPIOA, &GPIO_InitStructure);
3)DAC输出配置:
DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; //触发源选择—软件触发
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle; //波形选择—三角波
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmp_2047; //三角波幅度/噪声发生器屏蔽位选择--2047
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; //输出缓存选择—使能输出缓存可以减少输出阻抗,无需外部运放即可直接驱动外部负载。
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
4)DAC精度、左/右对齐选择,基值设定:
DAC_SetChannel1Data(DAC_Align_12b_Left, 2047); //12bit精度,左对齐,基值这里设置2047(1/2Vref)
5)DAC通道使能
DAC_Ctrl(DAC_Channel_1, ENABLE);
6)触发转换:
DAC->SWTRG |= 0x1;//每触发一次,DAC输出+1。在这个例子里,第一次触发DAC输出电平Vref*(基值+0)/4095,第二次触发DAC输出电平Vref*(基值+1)/4095… 因此输出三角波斜率可以通过触发时间间隔调整。