STM32之DAC

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);

================================================================================

如有不对之处望指出。一起学习共同进步

邮箱:fifteenpeng@163.com

——十五

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值