前几天折腾的东西着实有点难,英文手册看得头昏脑涨。。。今天看一些简单的。
280049C有两路DAC,一般用来接示波器,将程序的内部变量输出出来观察,极大的方便了调试。
每个缓冲DAC具有以下功能:
DAC的框图如图所示:
DAC的参考电压源DACREF可在VDAC和VREFHI之间选择。只有当VREFHI设置为DACREF且使用内部参考模式时,x2增益模式才可用。另外,即使DAC选择x2增益模式,其最大输出电压也不会大于VDDA。下表列出了DAC支持的增益模式组合。在这个表中,x=A或B,X=Don’t Care,VDAC/VREFHI=2.5v,VDDA=3.3v,DACVAL=4095。
官方提供了2个例程,位置在C:\ti\c2000\C2000Ware_3_01_00_00\driverlib\f28004x\examples\dac
在例程中使用了外部参考,LaunchPad需要从3.3V外接一根线。感觉不太实用。
这里根据自己的习惯,使用内部电压参考,并将输出范围设置为码值0-4095对应0-3.3V。也就是按照上表的红色箭头配置。
#include "F28x_Project.h"
#include "device.h"
#include "math.h"
// DA输出值
int16_t dacVal = 2048;
void configureDAC(void);
void main(void)
{
// 初始化时钟和外设 Initialize device clock and peripherals
Device_init();
// InitSysCtrl(); //本工程不能使用寄存器的InitSysCtrl();函数初始化。
/*//库函数版配置 // 初始化GPIO并设置为推挽输出 Initialize GPIO and configure the GPIO pin as a push-pull output Device_initGPIO(); GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD); // Push-pull output or floating input GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT); */
InitGpio(); //寄存器指令配置
// GPIO_SetupPinMux(DEVICE_GPIO_PIN_LED1, GPIO_MUX_CPU1, 0);
// GPIO_SetupPinOptions(DEVICE_GPIO_PIN_LED1, GPIO_OUTPUT, GPIO_PUSHPULL);
// 初始化PIE并清空PIE寄存器,关闭CPU中断
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
Interrupt_initModule();
// 初始化PIE向量表
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
Interrupt_initVectorTable();
configureDAC();
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
EINT;
ERTM;
for(;;)
{
dacVal=dacVal<0?0:dacVal;
dacVal=dacVal>4095?4095:dacVal;
DAC_setShadowValue(DACA_BASE, dacVal);
DEVICE_DELAY_US(2);
}
}
//
// 配置DACA,使用内部1.65V基准,设置输出范围为0-3.3V
//
void configureDAC(void)
{
// 选择内部1.65V参考
EALLOW;
AnalogSubsysRegs.ANAREFCTL.bit.ANAREFA2P5SEL = 0;
// 使能内部参考
AnalogSubsysRegs.ANAREFCTL.bit.ANAREFASEL = 0;
EDIS;
DAC_setReferenceVoltage(DACA_BASE, DAC_REF_ADC_VREFHI);
// DAC输出增益2倍
DAC_setGainMode(DACA_BASE, DAC_GAIN_TWO);
// 使能DAC输出
DAC_enableOutput(DACA_BASE);
// 设置DAC影子寄存器输出0
DAC_setShadowValue(DACA_BASE, 0);
// 延迟,等待DAC上电启动
DEVICE_DELAY_US(10);
}