11:36 2018/12/20
手册上是这么说的:
STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。
DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。
DAC工作在12位模式时,数据可以设置成左对齐或右对齐。
DAC模块有2个输出通道,每个通道都有单独的转换器。
在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。
DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
也就是说分辨率可以是:256 或者 4096输出
16位数据输入
12位可左右对齐
DAC_SetChannel1Data(DAC_Align_12b_L, 0x7fff);
这么设置则是左对齐,意思是低位舍弃,取出后面赋值的高12位,作为DAC转换的数值。
DAC_Align_12b_R, 则是高位舍弃,取出低12位,作为DAC转换的数值。
输出电压只有0~ Vref+
实际控制应用中常用此来输出相关量,再通过运放电路,可以很好的反应数据的变化情况。
实际应用中常用来反应数据的变化情况,有利于帮助我们分析问题。利用放大电路可以输出正负电压,更好的显示正负数变化情况。
具体例程;
//DAC通道1输出初始化
void Dac1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
//时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC时钟
//IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟功能
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
//DAC寄存器初始化
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1
DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
}
在需要输出的时候:
DAC_SetChannel1Data(DAC_Align_12b_R,0x7fff);//12位右对齐数据格式设置DAC值,也就是fff,输出Vref+的电压;
=================================================
DAC_InitType.DAC_Trigger=DAC_Trigger_None;
#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register
has been loaded, and not by external trigger */
#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel */
#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */
#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */
DAC_InitType.DAC_Trigger触发方式有好几种:
一般是这两种使用外部中断EXTI9, 另外一种方法就是使用软件触发。
DAC_Trigger_None, 不需要其他任何的触发源,直接使用DAC_SetChannelxData(),就可以设定输出电压的大小。
DAC_Trigger_Software,软件触发,那么每次在使用DAC_SetChannelxData()修改输出电压后,需要调用DAC_SoftwareTriggerCmd(),目的是使能软件触发。由于:软件触发是硬件在一个APB1时钟周期后自动关断的,于是每次修改输出电压的值后,都要调用DAC_SoftwareTriggerCmd()方法,才能生效。
例如:
DAC_SetChannel1Data(DAC_Align_12b_R, (u16)DataBuf);
DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
================================================================================
如有不对之处望指出。一起学习共同进步
——十五