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
msp430学习笔记-DAC12的更多相关文章
- msp430学习笔记-msp430g2553
C语言例程:http://wenku.baidu.com/link?url=49JzNSvt3m0fRuf8SWTEM8yEw1yzqr4lBR-QbX8FddcmjTVYnDhuR97wB60HNf ...
- msp430学习笔记-实现开方log等计算及FFT算法(待续)
MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...
- msp430学习笔记-USART
本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013784.HTM MSP430F149有两个USART通讯端口,其性能完全一样,每个通讯口可通过RS232和R ...
- msp430学习笔记-ADC12
本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013748.HTM MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,它具有高速度,通用性等特 ...
- msp430学习笔记-时钟及延时函数
引用:http://blog.chinaunix.net/uid-24343357-id-3271380.html MCLK默认时钟源是DCOCLK,SMCLK默认时钟源也是DCOCLK,DCOCLK ...
- msp430学习笔记-IO及低功耗
引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013511.HTM MSP430F149有6个8位的IO口,其中P1,P2口占两个中断向量,共可以接16个中断源.还 ...
- MSP430学习笔记:UART
串通可以两种方法其现 一.USART硬件直接实现 二.通过定时器软件实现 该模块可现现: UART异步串行通讯 SPI同步串行通讯 I2C同步串行通讯 UxCTL控制寄存器 7:PENA 6:PEV ...
- msp430学习笔记-TA
定时器,CCR2,CCR1三者共用一个中断向量 定时器A是一个16位的定时/计数器.它有3个捕获/比较寄存器:能支持多个时序控制.多个捕获/比较功能和多个PWM输出:有广泛的中断功能,中断可由计数器溢 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
随机推荐
- OpenID
OpenId是一个以用户为中心的数字身份识别框架,它具有开放.分散.自由等特性.OpenId的创建是基于这样一个概念:我们可以通过URI(或者URL网址)来识别一个网站.同样,我们也可以通过这样的方式 ...
- scrapy框架简介和基础应用
scrapy框架介绍 环境安装 基础使用 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性 ...
- MongDB篇,第四章:数据库知识4
MongDB 数据库知识4 GridFS 大文件存储 文件的数据库存储 1,在数据库中以 字符串的方式 存储文件在本地的路径: 优点: 节省数据库空间 缺点: 当数据库或者文件位置发生变化时则无 ...
- 运放积分电路MULTISIM
有些需要反馈回路
- shell 脚本中将输出内容赋值给一个变量时的换行问题
for ((i=0; i<4; i++) do ....... done 如果使用 echo $a 输出变量,则变量中的 换行都会被忽略掉,所有内容输出到一行 而使用 echo "$a ...
- Readability Assessment for Text Simplification -paper
https://pdfs.semanticscholar.org/e43a/3c3c032cf3c70875c4193f8f8818531857b2.pdf 1.introduction在Brazil ...
- 向指定URL发送GET、POST方法的请求
/** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,请求参数应该是 name1=value1&name ...
- php 函数集锦
1.array_intersect_assoc()用于比较两个(或更多个)数组的键名和键值,并返回交集. <?php $a1=array("a"=>"red& ...
- C++学习(十六)(C语言部分)之 数组三
复习 以及 测试 /* 一维数组 数组是相同的数据的一个集合 <类型><数组名>[下标表达式]={数组元素 初始值}; 数组名和变量的命名规则是一样的 数组名是一个地址 数组下 ...
- python英文与中文的词频统计
1.统计英文单词, # 1.准备utf-8编码的文本文件file(已在文件夹中定义了 一个名叫“head.txt.rtf”文本文件,详情请见截图) def getTxt(): #3对文本预处理(包括) ...