第十一章 宝马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 寄存器值可以改变输出频率。
|