MSP430程序库<八>DAC12的使用

2019-10-10来源: eefocus关键字:MSP430  程序库  DAC12

MSP430 带有的DAC12 模块,可以将运算处理的结果转换为模拟量,以便操作被控制对象的工作过程。DA是在控制操作过程中常用的器件之一;MSP430有些系列中含有DAC12模块,给需要使用DA的方案提供了许多方便。这里实现较为简单的DAC的驱动,方便以后使用。


硬件介绍:

MSP430x14x系列不含DAC12模块,所以本文的实现只能用于16系列等含有DAC12模块的单片机中。


MSP430F169 单片机的DAC12 模块有2 个DAC 通道,这两个通道在操作上是完全平等的。并且可以用DAC12GRP控制位将多个DAC12通道组合起来,实现同步更新,硬件还能确保同步更新独立于任何中断或者NMI事件。


这个DAC12模块有以下特点:8位或12位分辨率可调、可编程时间对能量的损耗、可选内部或外部参考源、支持二进制原码和补码输入、具有自校验功能、可以多路DAC同步更新、还可以用DMA等。


这里实现的是较为简化的版本,需要可以自己添加或改写功能,如:初始化函数内部调用自校验的函数,可以在每一次初始化时候均自校验。


DAC12每个模块只有两个寄存器:控制寄存和数据寄存器,控制寄存器用来初始化和设置模块的使用,数据寄存器用来存放要输出的电压数字量。169的DAC的寄存器如下: 

DAC12_0控制寄存器    DAC12_0CTL 

DAC12_0数据寄存器    DAC12_0DAT 

DAC12_1控制寄存器    DAC12_1CTL 

DAC12_1数据寄存器    DAC12_1DAT


控制寄存器每一位的功能如下:


DAC12REFx:选择DAC12的参考源 

0,1 Vref+ 

2,3 Veref+ 

DAC12RES:选择DAC12分辨率 

0 12位分辨率 

1 8分辨率 

DAC12LSELx:锁存器触发源选择 

当 DAC12锁存器得到触发之后,能够将锁存器中的数据传送到DAC12的内核。 

当 DAC12LSELx=0的时候,DAC数据更新不受DAC12ENC 的影响。 

0 DAC12_XDAT执行写操作将触发(不考虑DAC12ENC 的状态) 

1 DAC12_XDAT执行写操作将触发(考虑DAC12ENC 的状态) 

2 Timer_A3.OUT1的上升沿 

3 Timer_B7.OUT2的上升沿 

DAC12CALON:DAC12校验操作控制 

置位后启动校验操作,校验完成后自动被复位。校验操作可以校正偏移误差。 

0 没有启动校验操作 

1 启动校验操作 

DAC12IR:DAC12输入范围 

设定输入参考电压和输出的关系 

0 DAC12的满量程为参考电压的3倍(不操作AVcc) 

1 DAC12的满量程为参考电压 

DAC12AMPx:DAC12运算放大器设置 

0 输入缓冲器关闭,输出缓冲器关闭,高阻 

1 输入缓冲器关闭,输出缓冲器关闭,0V 

2 输入缓冲器低速低电流,输出缓冲器低速低电流 

3 输入缓冲器低速低电流,输出缓冲器中速中电流 

4 输入缓冲器低速低电流,输出缓冲器高速高电流 

5 输入缓冲器中速中电流,输出缓冲器中速中电流 

6 输入缓冲器中速中电流,输出缓冲器高速高电流 

7 输入缓冲器高速高电流,输出缓冲器高速高电流 

DAC12DF:DAC12的数据格式 

0 二进制 

1 二进制补码 

DAC12IE:DAC12的中断允许 

0 禁止中断 

1 允许中断 

DAC12IFG:DAC12的中断标志位 

0 没有中断请求 

1 有中断请求 

DAC12ENC:DAC12转换控制位 

DAC12LSEL>0的时候,DAC12ENC 才有效。 

0 DAC12停止 

1 DAC12转换 

DAC12GRP:DAC12组合控制位 

0 没有组合 

1 组合


详细的有关DAC12的资料可以参考TI提供的用户指南。


程序实现:

DAC12模块的程序比较简单,因为每组只有一个寄存器用来控制;本程序实现的功能如下:DAC模块初始化,完成两个DAC模块的初始化,可以根据参数判断要是、初始化的是哪个模块或两个都初始化,或是两个一组同时更新;用参数传递DAC12AMPx的值,方便设置,程序中注释很详细,如果不理解,可以直接设AMPx为5或0x05;校准函数,完成DAC12模块的自校准,也是通过参数传递要校准的模块;电压输出函数,同样这个也是用参数传递要输出的模块。


初始化:


/********************************************************

* 函数名称:DAC12Init

* 功    能:DAC12用到的相关资源初始化

* 参    数:

*           module模块  0:使用模块DAC12_0

*                       1:使用模块DAC12_1

*                       2:使用模块DAC12_0/1

*                       3:使用模块DAC12_0/1 共同更新

*           DAC12AMPx:DAC运算放大器设置:

*               0 输入缓冲器关闭,输出缓冲器关闭,高阻

*               1 输入缓冲器关闭,输出缓冲器关闭,0V

*               2 输入缓冲器低速/电流,输出缓冲器低速/电流

*               3 输入缓冲器低速/电流,输出缓冲器中速/电流

*               4 输入缓冲器低速/电流,输出缓冲器高速/电流

*               5 输入缓冲器中速/电流,输出缓冲器中速/电流

*               6 输入缓冲器中速/电流,输出缓冲器高速/电流

*               7 输入缓冲器高速/电流,输出缓冲器高速/电流

* 返 回 值:char,设置成功返回1,参数错误返回0

* 说    明:其他默认为:12位方案、写入即更新输出,module模

*           块为3时,两个都写入更新;DAC12的满量程为参考电

*           压;内部2.5v参考电压:需要AD设置参考源打开2.5.

*********************************************************/

char DAC12Init(char module,char DAC12AMPx)

{

    if(DAC12AMPx>7)

    {

        return(0);

    }

    //---------------------------设置模块-------------------------------  

    switch(module)

    {

        case 0:case'0': DAC12_0Init(DAC12AMPx); break;  //模块0

        case 1:case'1': DAC12_1Init(DAC12AMPx); break;  //模块1

        case 2:case'2': 

            DAC12_0Init(DAC12AMPx);

            DAC12_1Init(DAC12AMPx);

            break;                                      //模块0、1  

        case 3:case'3':

            DAC12_0Init(DAC12AMPx);

            DAC12_1Init(DAC12AMPx);

            DAC12_0CTL |= DAC12GRP;

            break;  //无校验

        default :         return(0);                            //参数错误

    }

    return (1);

}

这里参数无效返回0,设置完成返回1,不过要注意的是在使用DAC之前,必须开启内部参考源(在ADC模块里面,具体可以参考使用示例)。


DAC12_0Init和DAC12_1Init函数内容一样,只不过控制寄存器分别是DAC12_0CTL和DAC12_0CTL,这里只给出DAC12_0Init的函数,另一个参考源程序:


void DAC12_0Init(char DAC12AMPx)

{

    // Internal ref gain 1

    DAC12_0CTL = DAC12SREF_0 + DAC12IR;

    DAC12_0CTL |= DAC12LSEL_1 + (DAC12AMPx << 5);

    DAC12_0CTL |= DAC12ENC;

}

这个函数仅仅完成控制寄存器的设置。选内部参考源,输出满量程是参考电压的1倍,更新方式:写入即更新,如果group设置,则两个都写入才更新。


校准函数:完成DAC12模块自校准,


void DAC12Cal(char module)

{

    switch(module)

    {

        case 0:case'0': 

            DAC12_0CTL |= DAC12CALON;               // 启动效验DAC

            while((DAC12_0CTL & DAC12CALON) != 0);  // 等待效验完成

            break;                                  //模块0

        case 1:case'1': 

            DAC12_1CTL |= DAC12CALON;               // 启动效验DAC

            while((DAC12_1CTL & DAC12CALON) != 0);  // 等待效验完成

            break;                                  //模块1

        case 2:case'2':

        case 3:case'3': 

            DAC12_0CTL |= DAC12CALON;               // 启动效验DAC

            while((DAC12_0CTL & DAC12CALON) != 0);  // 等待效验完成

DAC12_1CTL |=

[1] [2]
关键字:MSP430  程序库  DAC12 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476684.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430程序库<九>数码管显示
下一篇:MSP430程序库<七>按键

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430程序库<十一>定时器TA的PWM输出
;          //TA PWM输出程序库头文件void main(){    // Stop watchdog timer to prevent time out reset    WDTCTL = WDTPW + WDTHOLD;    ClkInit();        TAPwmInit('A',1,'P','P');   //将定时器TA初始化成为PWM发生器   
发表于 2019-10-09
MSP430程序库<十一>定时器TA的PWM输出
MSP430程序库<十二>SVS(电源电压监控器)模块
电源电压监控对于单片机来说,也是经常要用的模块。当需要稳定的工业级产品时,经常要对电源电压监控,以保证单片机系统工作于正常环境或范围中。MSP430F16x提供了一个现成的电源电压监控器模块SVS,方便检测电源电压或者是外部电压,可以设置为电压过低时复位 或置标志位。本程序即完成SVS的设置使用的程序库(msp430f14x没有此模块)。硬件介绍:MSP430单片机含有的SVS模块可以很方便的监控电源电压或外部电压。电源电压监控器(SVS)是用于监控AVCC电源电压或外部电压。 SVS的可配置当电源电压或外部电压下降到低于用户选择的电压级别时设置一个标志,或产生POR复位。SVS模块有以下特点:可以监控AVCC电压;可选择产生
发表于 2019-10-09
MSP430程序库<十二>SVS(电源电压监控器)模块
MSP430程序库<十三>硬件乘法器使用
;/***************************************************************************** 名    称:main主程序* 功    能:硬件乘法器程序库使用演示* 入口参数:无* 出口参数:无****************************************************************************/void main( void ){    // Stop watchdog timer to prevent time out reset    WDTCTL = WDTPW + WDTHOLD; 
发表于 2019-10-09
MSP430程序库<十三>硬件乘法器使用
MSP430程序库<十四>DMA程序库
;     case 2: DMA2CTL |= DMAREQ;  break;      //2通道    }}这个和上个函数类似:仅仅设置一个控制位,函数很简单,不再解释啦。程序实现就这么多了,有关详细内容可以下载附件里的程序库,程序的注释很详细。使用示例:使用这个程序时,步骤和原来的相同:工程中加入DMA.c文件,然后源文件中包含DMA.h头文件即可。示例程序主要如下:#include <msp430x16x.h>#include "DMA.h"unsigned int
发表于 2019-10-09
MSP430程序库<十四>DMA程序库
MSP430程序库<十五>Flash控制器
一般,在单片机中的Flash存储器用于存放程序代码,属于只读型存储器。而在MSP430些列的单片机中,都可以通过内置的Flash控制器擦除或改写任何一段的内容。另外,msp430的单片机内部还专门留有一段Flash区域(information memory),用于存放掉电后需要永久保存的数据。利用430内部的Flash控制器,可以完成较大容量的数据记录、用户设置参数在掉电后的保存等功能。硬件介绍:要对Flash读写,首先要了解MSP430的存储器组织。430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间中,没有代码空间和数据空间之分。一般430的单片机都统一编址在0-64k地址范围中,只有少数高端
发表于 2019-10-09
MSP430程序库<十五>Flash控制器
MSP430程序库<十>ADC12模块
;   ADC12CTL0 &=~ ENC;                      //停止转换        i=0;    }}该程序实现的是多次A0-A2 32次转换,把结果存入results数组。单次时,仅仅采样一次(A0-A2)可用自己更改处理函数。程序部分就完成了,调用时注意要自己实现处理逻辑或存储逻辑。使用示例: 本程序使用方式还是加入C文件,包含H文件;不过和之前的程序不同的是要自己实现中断处理逻辑。使用示例参见程序库中
发表于 2019-10-09
MSP430程序库<十>ADC12模块
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved