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

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

如有不對之處望指出。一起學習共同進步

郵箱:[email protected]

——十五

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章