打印
[LPC]

NXP LPC1768宝马开发板第11章DAC(直接输出和DMA方式传输)

[复制链接]
3091|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第十一章  宝马1768——DAC(直接输出和DMA方式传输)
开发环境:集成开发环境μVision4 IDE版本4.60.0.0
主机系统:Microsoft Windows XP
开发平台:旺宝NXP LPC1768开发板


11.1 DAC
11.2 程序说明
11.3 实验现象

1DAC
     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.26DAC输出
}
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.26DAC输出
        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 寄存器值可以改变输出频率。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:专业生产销售STM32开发板,仿真器,http://openmcu.taobao.com/

71

主题

283

帖子

11

粉丝