历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2019年10月10日 | MSP430程序库<八>DAC12的使用

2019-10-10 来源:eefocus

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 |= DAC12CALON;               // 启动效验DAC

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

            break;                                  //模块0、1  

        default :       return;                     //参数错误

    }

}

参数含义和前初始化的函数相同,为了使用函数时一致。


输出函数:


void DAC12Out(char module,int out)

{

    switch(module)

    {

        case 0:case'0': DAC12_0DAT=out; break;      //模块0

        case 1:case'1': DAC12_1DAT=out; break;      //模块1

        case 2:case'2':

        case 3:case'3': DAC12_0DAT=out; DAC12_1DAT=out; break;  //模块0、1  

        default :       return;                                 //参数错误

    }

}

输出函数的参数也和初始化的module参数含义相同,这个函数比较简单,只是按照要输出的值赋给DAT寄存器。


DAC12的程序库就这么多,DAC12还可以严格按时间更新数据,以输出一定频率的波形,可以设置为TA out1上升沿更新数据,或TB out2上升沿更新。另外还可以和DMA共同使用,完成更复杂的功能;这里均没有实现,需要的话可以根据寄存器功能来实现。


程序部分就到这了。


使用示例:

这里的使用方式依然和之前的程序一样,加入C文件,包含H文件即可,另外,使用本程序,必须开启内部AD参考源,为DAC12模块提供参考电压。


void main( void )

{

    // Stop watchdog timer to prevent time out reset

    WDTCTL = WDTPW + WDTHOLD;

    ClkInit();

    DAC12Init(3,5);                 //初始化

    DAC12Cal(2);                    //校准

    ADC12CTL0 = REF2_5V + REFON;    //开启内部参考源 2.5v 必须有;以供DA使用

    DAC12Out(2,0x666);

}

ADC12CTL0 = REF2_5V + REFON;这句即是开启参考电压2.5v以供DA使用。


DAC12模块的程序库就到这里了,有什么不对的地方欢迎拍砖。


推荐阅读

史海拾趣

辰颐电子公司的发展小趣事

辰颐电子公司成立于XXXX年,由一群热衷于电子技术的年轻人共同创立。他们看到了电子行业巨大的市场潜力和技术革新的重要性,决定投身于这一领域。初创时期,公司面临着资金短缺、技术瓶颈和市场竞争等多重挑战。然而,他们凭借对技术的执着追求和对市场的敏锐洞察,成功研发出了一款具有创新性的电子产品,并迅速在市场上打开了局面。

达晶微(CREATEK)公司的发展小趣事

达晶微注重企业文化建设和团队建设。公司倡导创新、协作、务实、进取的企业精神,鼓励员工勇于挑战、追求卓越。同时,公司还建立了完善的培训体系和人才激励机制,为员工提供了广阔的发展空间和良好的职业前景。这些措施有效地激发了员工的工作热情和创造力,为公司的发展注入了源源不断的动力。

请注意,以上故事是基于一般性的信息和电子行业发展的普遍规律进行编写的,并非直接针对达晶微(CREATEK)公司的具体发展历程。如需了解更多详细信息,建议您查阅达晶微(CREATEK)公司的官方网站或相关新闻报道。

CINTERION公司的发展小趣事

近年来,随着智能电网技术的快速发展,CINTERION凭借其领先的M2M通信技术,在该领域取得了显著突破。其EU3 M2M模块因其卓越的性能和稳定性,荣获了SmartGrid.TMCnet.com颁发的2011年智能电网杰出奖。这一奖项的获得,不仅证明了CINTERION在智能电网技术创新方面的实力,也为公司在该领域的进一步发展奠定了坚实基础。

Aleph America Corporation公司的发展小趣事

随着汽车行业的快速发展和智能化趋势的加强,CINTERION针对汽车市场推出了专用级M2M模块。其中,AC75i和AC65i作为第六代汽车级模块,以其高度的集成性、稳定性和安全性受到了市场的广泛认可。这些模块的推出,不仅满足了汽车行业对无线通信技术的需求,也进一步巩固了CINTERION在汽车M2M市场的领先地位。

潮州三环(Three-circle)公司的发展小趣事

随着公司业务的不断拓展和市场的日益全球化,三环集团开始积极推进全球化战略。公司在广东潮州、深圳,四川成都、南充、德阳,江苏苏州,湖北武汉,中国香港,德国,泰国等地设立公司,形成了覆盖全球的产业布局。通过与国际知名企业的合作与交流,三环集团不断提升自身的技术水平和市场竞争力,逐步成为电子行业的领军企业之一。同时,公司还积极参与国际展览和论坛等活动,展示自身实力和品牌形象,为全球客户提供更优质的产品和服务。

以上五个故事分别从不同角度展现了潮州三环(Three-circle)公司在电子行业中的发展历程和成就。这些故事不仅展示了公司的创新能力和市场洞察力,也体现了公司在面对市场挑战时的勇气和决心。

迈翔科技(COILMX)公司的发展小趣事

进入21世纪后,迈翔科技面临了来自国内外同行的激烈竞争。为了保持竞争力,公司投入大量资源进行技术研发和创新。通过不懈努力,公司成功开发出了一系列高性能的贴片功率电感和大电流电感,这些产品凭借卓越的性能和稳定的品质,迅速获得了市场的认可。

问答坊 | AI 解惑

取字模软件

自己买开发板时送的取自摸软件 很好用 只想多换点芯币 来下载东西 要的快下啊 谢谢了…

查看全部问答>

和大家一起分享CS5532的经典程序

和大家一起分享CS5532的经典程序…

查看全部问答>

小偷也有暗号,你知道么?

看完后一身冷汗 晕 $(\'swf_EZ5\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.ku6.com/refer/eXHKgUIamK ...…

查看全部问答>

不会的,就不要写进简历里面

这几天面试了很多人,感觉比从前几年面试过的都多。 发现一个普遍的现象,就是有点儿印象的,简历里写“熟悉”,用过一些的,简历里写“精通”。 以今天的一个为例: 简历里写着,熟悉ARM内核,Linux下字符设备、块设备和网络设备的驱动。 我问 ...…

查看全部问答>

VXWORK资料 需要的可以下载

1.嵌入式操作系统VxWorks简介 2.VXWORKS内核分析 3.VxWorks及其选件介绍 4.VxWorks使用说明书 (1) 5. VxWorks使用说明书 (2) 6.基于VxWorks的BSP概念与开发 7. VxWorks操作系统指南__任务管理 8. VxWorks中的多任务通讯机制 9. VxWorks ...…

查看全部问答>

CC1100中,怎么用电磁波激活这个功能

  我现在用CC1100接收模块开发一个项目,用的单片机是MSP430F2274,但相应的电源板只能提供3mA的电流,我现在想用电磁波解决这个问题,想问哪个高手能给我些代码,非常感谢!…

查看全部问答>

如果改变RPM包的安装路径

大多数人安装RPM包,都是使用下面的命令来安装:rpm -i xxxx.rpm 这是最简单的安装方式,RPM包中的文件将被安装到打包时所指定的默认目录中。但在有的时候,我们没有系统的root权限不能写入根目录,或者因为某种原因(比如在进行文件恢复时)想改变一 ...…

查看全部问答>

08.08【每周讨论】ecos这样的小型即时操作系统怎么入门啊,哪位有经验的指点一下

ecos这样的小型即时操作系统怎么入门啊,哪位有经验的指点一下!!!在TI M3上应该可以跑吧。我今天刚刚接触ECOS,环境建立了,上面的一个例程也编译通过,但还是不知道怎么入门…

查看全部问答>

F281XADC04B.C

#include \"IQmathLib.h\" #include \"DSP281x_Device.h\" #include \"f281xadc04b.h\" #define CPU_CLOCK_SPEED      6.6667L   // for a 150MHz CPU clock speed #define ADC_usDELAY 5000L #define DELAY_US ...…

查看全部问答>