恩智浦LPC1549@eeworld ( 七 ) DAC
一、LPC15xx DAC特点:
12-bit 数模转换
支持DMA
内部定时器 或 扩展管脚
触发
二、DAC时钟
从system clock中获取DAC工作时钟,不用可以禁用。
三、硬件要求
DAC模拟电源VDDA(
PIN_20),VSSA。
DAC基准电压:VREFP_DAC_VDDCMP(PIN_18),VREFN
注意:ADC和DAC的VREFN是一起的!
而DAC的基准电压输入,和ADC的基准电压输入是不同的哦!
四、DAC工作
DAC使能里时钟,管脚输出分配后,只要设置好触发源,和输出VALUE就可以了!
不过这里输出还要看是否开启双缓冲的功能,如果没有开启双缓冲功能的话,就可以直接输出了!
五、例程代码
//初始化DAC需要的管脚P0_12
static void Init_DAC_PinMux(void)
{
#if defined(BOARD_NXP_LPCXPRESSO_1549)
/* Disables pullups/pulldowns and disable digital mode */
//设置I/O控制引脚复用
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 12, (IOCON_MODE_INACT | IOCON_ADMODE_EN));//不添加引脚功能,启用模拟输入功能(仅模拟引脚)
/* Assign DAC_OUT to P0.12 via SWM (fixed pin) */
//使能在开关矩阵固定功能引脚
Chip_SWM_EnableFixedPin(SWM_FIXED_DAC_OUT);
#else
/* Configure your own ACMP pin muxing here if needed */
#warning "No DAC Out pin muxing defined"
#endif
}
//初始化配置DAC
void Init_DAC(void)
{
/* 初始化DAC */
Chip_DAC_Init(LPC_DAC);
/* 设置板子特定 DAC 管脚复用 */
Init_DAC_PinMux();
/* Initialize DAC input to 0 */
dac_input = 0;
/* Set up DAC internal timer to trigger interrupts every 0.5ms/2KHz */
Chip_DAC_SetReqInterval(LPC_DAC, 2000); //设置中断/DMA定时器触发周期中断重载值
Chip_DAC_EnableIntTimer(LPC_DAC); //启动内部定时器,CNTVAL应在使能定时器之前被加载
/* 使能DAC双缓冲 */
Chip_DAC_EnableDoubleBuffer(LPC_DAC);
/* 设置触发源为内部定时器 */
Chip_DAC_SetTrgSrcInternal(LPC_DAC);
/* DAC 输出0电压 */
Chip_DAC_UpdateValue(LPC_DAC, dac_input);
/* 使能 DAC 中断 */
NVIC_EnableIRQ(DAC_IRQ);
}
//中断函数更新输出值
void DAC_IRQHandler(void)
{
//获取中断/DMA超时状态
if (Chip_DAC_GetIntStatus(LPC_DAC))
{
/* 更新输入 DAC 值*/
dac_input += DAC_IN_UPDATE;
/* 最大输入 DAC 界限检查*/
if (dac_input > 4095) {
/* 循环DAC值 */
dac_input = 0;
}
/* 更新 DAC 值寄存器将清除中断 */
Chip_DAC_UpdateValue(LPC_DAC, dac_input);
}
}