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模块的自校准,也是通过参数传递要校准的模块;电压输出函数

/********************************************************
* 函数名称: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共同使用,完成更复杂的功能;这里均没有实现,需要的话可以根据寄存器功能来实现。

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使用。

引用:http://www.cnblogs.com/Engin/archive/2011/08/22/2149448.html

msp430学习笔记-DAC12的更多相关文章

  1. msp430学习笔记-msp430g2553

    C语言例程:http://wenku.baidu.com/link?url=49JzNSvt3m0fRuf8SWTEM8yEw1yzqr4lBR-QbX8FddcmjTVYnDhuR97wB60HNf ...

  2. msp430学习笔记-实现开方log等计算及FFT算法(待续)

    MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...

  3. msp430学习笔记-USART

    本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013784.HTM MSP430F149有两个USART通讯端口,其性能完全一样,每个通讯口可通过RS232和R ...

  4. msp430学习笔记-ADC12

    本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013748.HTM MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,它具有高速度,通用性等特 ...

  5. msp430学习笔记-时钟及延时函数

    引用:http://blog.chinaunix.net/uid-24343357-id-3271380.html MCLK默认时钟源是DCOCLK,SMCLK默认时钟源也是DCOCLK,DCOCLK ...

  6. msp430学习笔记-IO及低功耗

    引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013511.HTM MSP430F149有6个8位的IO口,其中P1,P2口占两个中断向量,共可以接16个中断源.还 ...

  7. MSP430学习笔记:UART

    串通可以两种方法其现 一.USART硬件直接实现 二.通过定时器软件实现 该模块可现现: UART异步串行通讯 SPI同步串行通讯 I2C同步串行通讯 UxCTL控制寄存器 7:PENA 6:PEV ...

  8. msp430学习笔记-TA

    定时器,CCR2,CCR1三者共用一个中断向量 定时器A是一个16位的定时/计数器.它有3个捕获/比较寄存器:能支持多个时序控制.多个捕获/比较功能和多个PWM输出:有广泛的中断功能,中断可由计数器溢 ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

随机推荐

  1. HDU 6047 17多校 Maximum Sequence(优先队列)

    Problem Description Steph is extremely obsessed with “sequence problems” that are usually seen on ma ...

  2. 适配手机端之 rem

    (function() { var psdWidth = 1080, maxRem = 100, ch = document.documentElement.clientHeight || docum ...

  3. ecmall 如何新增挂件

    不知到该怎么开始介绍,就直接说了,比如要在商城首页上添加一个自己开发测试用的挂件 1.找到模版文件夹的index.html,路径:themes/mall/default/index.html 自己选一 ...

  4. Power BI十大视觉效果,知多少?

    Power BI十大视觉效果: 图表滑块 响应式布局 一键更改方差计算 一键排序 我们的最爱:小倍数! 瀑布图中的轴断裂 层次表(完全响应) HICHERT博士的IBCS®原生支持 分段图表 - 可视 ...

  5. ORA-03001,GATHER_TABLE_STATS数据库自动收集统计信息报错

    1.根据Alert报错信息,查询Trace日志 /oracle/app/oracle/admin/fgsquery/bdump/fgsquery_j001_11111.trc Oracle Datab ...

  6. Buildroot lmbench使用方法

    /********************************************************************** * Buildroot lmbench使用方法 * 说明 ...

  7. Cocos闪屏视频VideoPlayer踩坑记录

    游戏闪屏动画(Logo&健康游戏公告)使用了 experimental::ui::VideoPlayer 来播放视频 3.7版本开发到目前为止发现2个坑 1.设置大小 _videoPlayer ...

  8. MySQL安装配置错误\日常使用错误

    1.出现报错---应用程序无法正常启动0xc000007b 安装direct 9.0 安装vc++ 2005 安装vc++ 2008 安装vc++ 2012(x64和x86都要装) 安装 .NET4. ...

  9. 安装,配置,启动FTP,SSH,NFS服务

    1.安装,配置,启动FTP服务 sudo apt-get install vsftpd 修改vsftpd的配置文件/etx/vsftpd/.config,将下面几行前面的“#”去掉 #local_en ...

  10. vip视频解析接口

    浏览器的地址栏输入http://www.meilii.cn/index.php?url=(然后找到一个属于vip的视频你就复制网站粘贴进来就可以了!)速度还挺快的!