向STM8L的向DHR寄存器寫入數據,此數據被送入到DOR寄存器,最終被送到DA轉換器,DAC會輸出對應的電壓.我們使用用萬用表測量此電壓,與理論計算值對比,來學習STM8L的DAC.
下圖為STM8L152C6的DAC內部結構圖.

本例程使用的芯片型號為STM8L152C6,是中等容量,48腳的MCU,它只有一個輸出通道,輸出通道是PF0.如下圖數據手冊中的介紹

STM8L的DAC為12位DAC,寫入DHR寄存器中的數據最大為2^12=4096.下圖是數據手冊中給出的DAC輸出電壓計算公式:DACout=Vref*(DAC_DOR/4096)
①DACout是DAC輸出的電壓
②Vref是參考電壓,由于參考電壓引腳和MCU供電引腳連接在一起,所以Vref的電壓和單片機系統的供電電壓相等.實測為2.98V,這個值以實測為準.
根據這個公式,如果向DAC_DHR寫入數據為2048,那么DAC輸出電壓應該為2048/4096*2.98=1.490V

DAC連續輸出不同的電壓,可以達到輸出正弦波,三角波等各種波形,由于沒有示波器,沒法看到輸出波形,所以本例程,只是簡單的使用DAC最基本的輸出電壓的功能,使用萬用表測量輸出的電壓與計算值對比.

- /*硬件連接*/
- // PF0---->
- /****************************************************************************************
- *開發環境:IAR for stm8 v6.5.3
- *硬件平臺:STM8L-DISCOVERY
- *功能說明:向DHR寄存器寫入數據,DAC會輸出對應的電壓,用萬用表測量此電壓,與理論計算值
- * 對比.
- *作 者:茗風
- ****************************************************************************************/
- #include"iostm8l152c6.h"
- #include"stdint.h"
- #define WRITE_TO_DHR(a) DAC_RDHRH=(a&0x0F00)>>8;DAC_RDHRL=(0x00FF&a)
- //帶參數宏,實現向DHR寄存器,寫入一個12位的數據
- /******************************************************************************************************
- * 名 稱:void delay_10ms(uint8_t x_ms)
- * 功 能:延時10ms
- * 入口參數:無
- * 出口參數:無
- * 說 明:
- * 范 例:無
- ******************************************************************************************************/
- void delay_130ms(uint8_t x)
- {
- uint8_t i,j;
- for(;x>0;x--)
- {
- for(i=0;i<255;i++)//2*255個指令周期
- for(j=0;j<255;j++);//2*255個指令周期
- // 共 x_ms*2*255+2*x_ms個指令周期
- // 即 255*2*255+2*255=130610us=130ms
- // 綜上 i,j雙層for循環,延時時間為130ms
- }
- // 16M/8/2=1M 一個指令周期為1us
- }
- /******************************************************************************************************
- * 名 稱:void DAC12_Config(void)
- * 功 能:配置DAC,禁用DMA,不使用TIM4觸發,也不用軟件觸發,寫入DHR的數據被立即送入DOR寄存器,
- * 立即輸出對應電壓
- * 入口參數:無
- * 出口參數:無
- * 說 明:STM8L152C6屬于中等容量MCU,只有一路DAC輸出,輸出引腳為PF0
- * 范 例:無
- ******************************************************************************************************/
- void DAC12_Config(void)
- {
- //------配置DAC輸出引腳PF0------
- PF_CR1_C10 =0;//浮空輸入
- PF_CR2_C20 =0;//無中斷功能
- PF_DDR_DDR0 =0;//PF0輸入
-
- //------打開DAC時鐘------
- CLK_PCKENR1_PCKEN17=1;//打開DAC時鐘
-
- //------選擇DAC觸發方式------
- DAC_CR1_TSEL=0x0;//選擇TIM4觸發,由于TEN=0,所以此位設置無效
- /* These bits are only used if TEN=1.
- 000: TIM4_TRGO (Timer 0 counter channel output) selected
- 111: SWTRIG (Software trigger) selected*/
- //------不使用DAC的BUFFER------
- DAC_CR1_BOFF=1;//DAC Channel output buffer disabled
-
- //------配置寫入DHR寄存器中的數據是否需要觸發才能送到DOR中------
- DAC_CR1_TEN=0;//此位為零時,寫入DHR寄存器中的數據被立即送到DOR中,輸出對應電壓,無需觸發
-
- DAC_CR2_DMAEN=0;//關閉DMA功能
- DAC_CR2_DMAUDRIE=0;//關閉DMA中斷功能
-
- //DACout=Vref*(DAC_DORH/L/4096)
- DAC_CR1_EN=1;//使能DAC
- }
- void main( void )
- {
- DAC12_Config();
- while(1)
- {
- //-------------------實測值--------------理論值----------
- WRITE_TO_DHR(4095);//2.98V 4095/4096*2.98=2.979V
- delay_130ms(15);//由于使用萬用表側臉電壓,所以這里延時一段時間
- WRITE_TO_DHR(3072);//2.23V 3072/4096*2.98=2.235V
- delay_130ms(15);
- WRITE_TO_DHR(2048);//1.49V 2048/4096*2.98=1.490V
- delay_130ms(15);
- WRITE_TO_DHR(1024);//0.74V 1024/4096*2.98=0.745V
- delay_130ms(15);
- WRITE_TO_DHR(512); //0.37V 512/4096*2.98=0.372V
- delay_130ms(15);
- WRITE_TO_DHR(256); //0.19V 256/4096*2.98=0.186V
- delay_130ms(15);
- }
- }
復制代碼
|