本帖最后由 旺宝电子 于 2015-1-30 10:17 编辑
第十一章 宝马1768——DAC(直接输出和DMA方式传输)
开发环境:集成开发环境μVision4 IDE版本4.60.0.0
主机系统:Microsoft Windows XP
开发平台:旺宝NXP LPC1768开发板
11.1 DAC
11.2 程序说明
11.3 实验现象
1、DAC: LPC1768内部集成了一个10位的DAC(P0.26输出),采用的是电阻串联式结构,并且带有缓冲输出,最大输出频率为1MHz,支持DMA控制输出,其结构如下:
相关寄存器:
DACR数据寄存器:包含输出值和输出能力。
根据计算可以得出输出电压为Vo=Vref*(Value/1024)。因此将数据传入到DACR寄存器时需要左移6位。
DACCTRL控制寄存器:使能DMA操作并控制DMA定时器
DACCNTVAL重装计数值寄存器,当使能DAC DMA转换和计数操作后,计数器开始递减,递减到0后重新装入DACCNTVAL计数器值,并且执行DMA一次转换,因此当使用DMA输出时,改变DACCNTVAL值可以改变输出频率大小。
2、程序说明: 本次程序将分两种方式介绍,直接输出和DMA方式输出。
① DAC直接输出
本例程只使用DAC的普通输出,并未用到DMA,因此只需将P0.26配置成为DAC输出模式,将要输出的值写入到DACR寄存器即可,其代码如下:
void DACInit( void )
{
LPC_PINCON->PINSEL1 = 0x00200000; //设置P0.26为DAC输出
}
int main(void)
{
uint8_t i;
SystemInit(); //初始化目标板
DACInit(); //初始化DAC引脚
#if USE_LCD //如果使用LCD显示
LCD_Init(); //LCD初始化
LCD_Clear(Black); //清屏
LCD_SetTextColor(Red); //设置字体颜色
LCD_SetBackColor(Black); //设置背景颜色
LCD_DisplayString(50, 50, "*** DAC Test ***");
#endif
while (1)
{
for (i = 0; i < 45; i++)
{
LPC_DAC->DACR = (GusSinTable << 6); //更新输出
}
}
}
② DAC DMA输出
int main(void)
{
int i;
SystemInit(); //初始化目标板
for(i=0; i < WAVE_SAMPLE_NUM; i++) //转换成正弦表
sinusoide = 512*sin(2*PI*i/WAVE_SAMPLE_NUM);
for(i=0; i < WAVE_SAMPLE_NUM; i++)
sinusoide = ((sinusoide + 512) << 6) | 1 << 16;
//偏移量512 左移16位 最大输出电流350uA 最大时间2.5us
LLI0.source = (uint32_t) &sinusoide[0];
LLI0.destination = (uint32_t) &(LPC_DAC->DACR);
LLI0.next = (uint32_t) &LLI0;
LLI0.control = 1<<26 | 2<<21 | 2<<18 | WAVE_SAMPLE_NUM;
DACInit(); //初始化DAC
DMA_Init(); //初始化DMA
#if USE_LCD
LCD_Init(); //LCD初始化
LCD_Clear(Black); //清屏
LCD_SetTextColor(Red); //设置字体颜色
LCD_SetBackColor(Black); //设置背景色
LCD_DisplayString(50, 50, "*** DAC Test ***");
#endif
while (1)
{
}
}
void DACInit( void )
{
LPC_PINCON->PINSEL1 = 0x00200000; //设置P0.26为DAC输出
LPC_DAC->DACCTRL=1<<3 | 1<<2 | 1<<1; //使能双缓冲 超时计数器DMA
LPC_DAC->DACCNTVAL = 250; //定时时间,可改变输出频率
}
void DMA_Init (void)
{
LPC_SC->PCONP |= (1 << 29); //使能DMA时钟
LPC_GPDMA->DMACConfig = 1; //使能DMA控制器
LPC_GPDMACH0->DMACCSrcAddr= (uint32_t) &sinusoide[0];//设置源地址
LPC_GPDMACH0->DMACCDestAddr = (uint32_t) &(LPC_DAC->DACR); //设置目标地址
LPC_GPDMACH0->DMACCLLI=(uint32_t)&LLI0; //下一个链表项
LPC_GPDMACH0->DMACCControl = WAVE_SAMPLE_NUM
| (2 << 18) //源地址数据宽度32位
| (2 << 21) //目标地址数据宽度32位
| (1 << 26) ; //源地址自动增加
LPC_GPDMACH0->DMACCConfig= 1 //使能通道0
| (0 << 1) //源存储器
| (7 << 6) //目标地址为外设DAC -7
| (1 << 11); //存储器到外设
}
3、实验现象:将示波器探头连接到P0.26引脚,测试输出波形,可以观察到正弦波输出,改变正弦表的值可以修改输出波形,在for循环中添加延时函数可以改变输出波形的频率。也可在DAC DMA输出例程中修改DACCNTVAL 寄存器值可以改变输出频率。