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

/********************************************************
* 函数名称: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

时间: 2024-11-17 03:20:27

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

msp430学习笔记-msp430g2553

C语言例程:http://wenku.baidu.com/link?url=49JzNSvt3m0fRuf8SWTEM8yEw1yzqr4lBR-QbX8FddcmjTVYnDhuR97wB60HNf07lJmmXbYH6Z1TtleYAE7b1LH9gfvjEGjX01oXZM7CgRO 电设工作小结之——MSP430G2553学习笔记——1 http://blog.sina.com.cn/s/blog_6cd2030b01017x71.html 电设工作小结之——MSP430G2553学习笔

msp430学习笔记-IO及低功耗

引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013511.HTM MSP430F149有6个8位的IO口,其中P1,P2口占两个中断向量,共可以接16个中断源.还可以直接利用P口的输入输出寄存器,直接对外进行通信.因为所有的IO口都是和其他外设复用的,因此在用端口前都要用功能选择寄存器选定所用的功能是外设还是P口,还要在方向寄存器中确定是输入还是输出 MSP430F149的端口功能 端口 功能 P1,P2 I/O,中断功能,其他片内外设功能 P3,P4,P5

msp430学习笔记-USART

本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013784.HTM MSP430F149有两个USART通讯端口,其性能完全一样,每个通讯口可通过RS232和RS485等芯片转换,与之相应的串行接口电路通讯.MSP430F149支持串行异步和同步通讯,每种方式都具有独立的帧格式和独立的控制寄存器. USART异步通信 MSP430串行异步通信模式通过两个引脚:接收引脚URXD和发送引脚UTXD与外界相连.异步帧格式由一个起始位,7或8个数据位,校验位(奇/

msp430学习笔记-ADC12

本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013748.HTM MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,它具有高速度,通用性等特点.从以下ADC12结构框图中可以看出,ADC12模块是由以下部分组成:输入的16路模拟开关,ADC内部参考电压源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等. ADC12模块的所有寄存器 ADC12CTL0: SHT1x:采样保持时间.定义了寄

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

MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b01018fp8.html FFT算法的物理意义 http://blog.csdn.net/hzn407487204/article/details/6249945 FFT算法的完整DSP实现 http://blog.csdn.net/xiahouzuoxin/article/details/979045

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

引用:http://blog.chinaunix.net/uid-24343357-id-3271380.html MCLK默认时钟源是DCOCLK,SMCLK默认时钟源也是DCOCLK,DCOCLK默认约为1.1MHZ(1126.4KHz),ACLK默认为32768HZ 系统复位后MCLK和SMCLK的频率在0.8MHz~1.5MHz,即819.2KHz~1536KHz.系统启动后,可以调整RSELx(基本时钟系统控制寄存器1BCSCTL1前3位).DCOx(DCO控制器DCOCTL前5位).

MSP430学习笔记(4)ADC12

几个术语: a)        分辨率(LSB):表示输出数字量变化一个相邻数码所需要输入模拟电压的变化量,它定义为转换器的满刻度电压与2的n次幂,其中n为ADC的位数. b)        量化误差:由于有限数字对模拟值进行离散取值(量化)而引起的误差.因此,量化误差理论上为一个单位分辨率.即正负1\2LSB. c)        转换精度:反应实际的ADC模块在量化上与理想的ADC模块进行模数转换的差值. d)        转换时间:指ADC完成一次模/数转换所需要的时间. 2.     

msp430学习笔记-TA

定时器,CCR2,CCR1三者共用一个中断向量 定时器A是一个16位的定时/计数器.它有3个捕获/比较寄存器:能支持多个时序控制.多个捕获/比较功能和多个PWM输出:有广泛的中断功能,中断可由计数器溢出产生,也可以由捕获/比较寄存器产生. TimerA的4种工作模式 1.停止模式 停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用.当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方 向计数.例如,停止模式前,Timer_A工作于增/减计数模式并且处于

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main