TA的每日心情 | 奋斗 2020-5-27 15:41 |
---|
签到天数: 868 天 连续签到: 1 天 [LV.10]以坛为家III
|
ADu360集成了一个12位DAC。包括一个16位的控制寄存器DACCON 和一个32位的数据寄存器DACDAT。
值得注意的是,手册中上图的数据寄存器是只读的,但在例程中或在学习其它芯片是能够写数据的。在给出的DAC库里
int DacWr(int iChan, int iData){pADI_DAC->DACDAT = iData;return pADI_DAC->DACDAT;}DacWr里面的两条语句,第一句是给pADI_DAC指向的结构体ADI_DAC_TypeDef的成员DACDAT赋值,第二句是作为函数值返回。
typedef struct { /*!< pADI_DAC Structure */ __IO uint16_t DACCON; /*!< Control Register */ __I uint16_t RESERVED0; __IO uint32_t DACDAT; /*!< Data Register */} ADI_DAC_TypeDef;<br>可见这个函数就是改变DACDAT值得的,由此可知数据手册上R是错误的。 在KEIL的调试界面里,也看到DACDAT是RW的。
DAC有2个可选的参考电压 1:0 V to VREF (internal band gap 1.2 V reference)
2:0 V to AVDD_REG (1.8 V)
输出的电压可以用公式Vout=( Vref/4095)*DACDAT计算。
DAC有一个端到端的电压输出缓冲器,能驱动5 kΩ||100 pF的负载。
可配置成3种模式 1:正常模式 分辨率是12位,DACDAT[27:16]。缓冲器默认为使能,也可失能,但驱动能力下降为10pf。
2:插值模式 分辨率是16位,14位有效值。DACDAT[27:12]。
3:NPN-晶体管驱动模式 。在这个模式下,使用较少的外部元件能配置成控制 2线 4--20MA环路接口。
对第2种和第3种模式不太熟悉,只能先学习下简单的了。不得不承认,外文能力不足影响理解,详细内容可参考手册。
DAC输出电压程序如下:
#include <stdio.h>#include <string.h>#include <ADuCM360.h>#include <..\common\DacLib.h>#include <..\common\UrtLib.h>#include <..\common\ClkLib.h>#include <..\common\WdtLib.h>#include <..\common\DioLib.h>void DACINIT(void);int main (void){ WdtCfg(T3CON_PRE_DIV1,T3CON_IRQ_EN,T3CON_PD_DIS); // Disable Watchdog timer resets //Disable clock to unused peripherals ClkDis(CLKDIS_DISSPI0CLK|CLKDIS_DISSPI1CLK|CLKDIS_DISI2CCLK|CLKDIS_DISPWMCLK|CLKDIS_DIST0CLK|CLKDIS_DIST1CLK|CLKDIS_DISDMACLK); // Only enable clock to used blocks ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG); // Select CD0 for CPU clock while (1) { DACINIT(); }}void DACINIT(void){ // Configure DAC output for 0-1.2V output range, Normal 12-bit mode and immediate update. DacCfg(DACCON_CLR_Off,DACCON_RNG_IntVref,DACCON_CLK_HCLK,DACCON_MDE_12bit); DacWr(0,0xD540000); // Output value of1000mV 当然,你也可在while循环里+代码,把电压值输出到串口显示。也可设置变量来改变输出可变的电压。改变DACDAT的值,使用万用表可以测试DAC端的输出电压值。 |
|