电设工作小结之MSP430G2553学习笔记2.docx
- 文档编号:30600288
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:20
- 大小:24.17KB
电设工作小结之MSP430G2553学习笔记2.docx
《电设工作小结之MSP430G2553学习笔记2.docx》由会员分享,可在线阅读,更多相关《电设工作小结之MSP430G2553学习笔记2.docx(20页珍藏版)》请在冰豆网上搜索。
电设工作小结之MSP430G2553学习笔记2
电设工作小结之——MSP430G2553学习笔记——2
接上一篇:
(四),ADC10
1,ADC10是十位的AD,在g2553上有A0~A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的VCC或GND上。
因为是10为的AD所以计算公式如下:
2,ADC参考电压的选择:
ADC的参考电压可以为:
由ADC控制寄存器0ADC10CTL0控制。
但是要提高ADC的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。
例如我在使用时遇到的情况如下:
Vref设为2.5V 但实际的值大概为2.475V,选择VCC VSS作为参考,用电压表测得大概为3.58V 还是不小的偏差的。
另外,在有可能的情况下,尽量采用较大的VR+和VR-,以减小纹波对采样结果的影响。
3,ADC10的采样方式有:
单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。
4,DTC:
因为ADC10只有一个采样结果存储寄存器ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用DCT,否则转换结果会不停地被新的结果给覆盖。
DTC是转换结果传送控制,也就是转换结果可以不用CPU的干预,就可以自动地存储在指定的存储空间内。
使用这种方式转换速度快,访问方便,适用于高速采样模式中。
DTC的使用可以从下面的例子中很容易看明白:
#include
#include"ser_12864.h"
uchars1[]={"DTC:
"};
uchars2[]={"2_cha_2_time_DTC"};
voidADC_init()
{
ADC10CTL1=CONSEQ_3+INCH_1; //2通道多次转换,最大转换通道为A1
ADC10CTL0=ADC10SHT_2+MSC+ADC10ON+ADC10IE;//ADC10ON,interruptenabl 参考电压选默认值VCC和VSS
//采样保持时间为16xADC10CLKs,ADC内核开,中断使能 MSC多次转换选择开
//如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行 中断使能
//使用DTC时,当一个块传送结束,产生中断
//数据传送控制寄存器0ADC10DTC0设置为默认模式:
单传送块模式,单块传送完停止
ADC10DTC1=0x04;//数据传送控制寄存器14conversions 定义在每块的传送数目 一共采样4次所以单块传送4次
//以后就停止了传送因为是两通道的,所以是每个通道采样数据传送2次
ADC10AE0|=BIT0+BIT1; //P1.0P1.1ADCoptionselect使能模拟输入脚A0A1
//不知道为什么,当P10P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,
//采样是相同的
}
voidmain(void)
{
uintadc_sample[8]={0}; //存储ADC序列采样结果
WDTCTL=WDTPW+WDTHOLD;
BCSCTL1=CALBC1_12MHZ; //设定cpu时钟DCO频率为12MHz
DCOCTL=CALDCO_12MHZ;
P2DIR|=BIT3+BIT4; //液晶的两条线
init_lcd();
ADC_init();
wr_string(0,0,s1);
wr_string(0,3,s2);
for(;;)
{
ADC10CTL0&=~ENC; //ADC不使能 其实这句话可以放在紧接着CPU唤醒之后的,因为CPU唤醒了,说明我们想要的
//转换数据传送完成了,如果ADC继续转换,那么转换结果也不再传输,是无用的。
所以紧接着放在CPU唤醒之后
//计时关闭ADC,有利于降低功耗
while(ADC10CTL1&BUSY); //WaitifADC10coreisactive 等待忙
ADC10SA=(unsignedint)adc_sample; //数据传送开始地址寄存器 设置DTC的开始地址 Databufferstart
//设置数据开始传送的地址为数组adc_sample[]的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把
//地址强制转换为16位的int或unsignedint
//应该也可以用指针直接访问DTC的存储区,还没试过
//例如:
前面定义了单块传送4次数据,所以每次传送完成了一个块,也就是4次,就会把中断标志位置位,产生中断
//因为上面设置的地址为数组adc_sample[]的首地址,所以每次转换的结果就会传送到该数组的前4位上,所以如果
//一切正常的话,数组里应该是前4位为转换的结果,后4位为初始值0 通过下面的显示,验证转换是正确的
//一次触发首先对A1、A0采样,放入a[0]和a[1]中,再对A1、A0采样,放入a[2]和a[3]中。
如此循环下去。
//验证得知,当多通道采样时,先采高的通道,再采低的通道。
如上面每次采样时,先采A1再A0
//因为一共采样传送4次,所以数组的后4位为初始值0
ADC10CTL0|=ENC+ADC10SC;//Samplingandconversionstart ADC使能,开始转换ADC10SC为采样触发源
//不需要cpu的干预,DTC就可以把采样结果存储到指定的存储区中
__bis_SR_register(CPUOFF+GIE); //LPM0,ADC10_ISRwillforceexit 如果转换结果传送完成,
//就会进入中断,CPU唤醒继续往下运行
wr_int(2,0,adc_sample[0]); //显示转换结果 A1
wr_int(6,0,adc_sample[1]); //A0
wr_int(0,1,adc_sample[2]); //A1
wr_int(3,1,adc_sample[3]); //A0
wr_int(6,1,adc_sample[4]);
wr_int(0,2,adc_sample[5]);
wr_int(3,2,adc_sample[6]);
wr_int(6,2,adc_sample[7]);
}
}
//ADC10interruptserviceroutine
#pragmavector=ADC10_VECTOR
__interruptvoidADC10_ISR(void) //中断响应以后,中断标志位自动清零
{
__bic_SR_register_on_exit(CPUOFF); //ClearCPUOFFbitfrom0(SR)
}
上面的例子是把存储结果存储在了uint型的数组中。
也可以用指针直接指定要存放的地址,然后再用指针进行访问(理论上可以,但还没有试过)。
也可以把存储结果直接存放在一个16位的寄存器中,如:
ADC10SA=(unsignedint)&TACCR1; //Datatransferlocation 把转换结果存储在TACCR1所在的
//位置处,就相当于存储在TACCR1中因为ADC转换结果和寄存器TACCR1都是16位的,所以要把地址强制转换为16位的
//int或unsignedint型
5,ADC采样注意事项:
用片上的ADC10进行采样,如果外部分压电路的电阻过大(比如几K以上),AD引脚会把电压拉高,使采样结果发生很大的偏差。
应换成小电阻(几十~几百欧),如果要求更精确的话,要加运放进行电压跟随。
6,AD采样交流信号:
一般是50Hz,100Hz,1000Hz。
方法是在交流信号的一个周期内采样多次(如40次,30次等),然后利用公式可以求出交流信号的有效值,平均值等。
7,片上温度传感器
ADC的A10通道接片上的温度传感器,MSP430内嵌的温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管。
当使用片上温度传感器时,采样周期必须大于30us 片上温度传感器的偏移很大,所以精确测量需要
进行校准。
选择片上温度传感器INCH_10,ADC其他的设置都和外部通道的设置相同,包括参考电压源的选择和转换存储的选择
选择了片上温度传感器,会自动地打开片上参考电压源发生器作为温度传感器的电压源,但是这并不会时能VREF+输出,也不会
影响AD转换参考源的选择,转换参考源的选择和其他通道的选择相同
公式为:
VTEMP=0.00355(TEMPC)+0.986
片上温度传感器的校准,可以参见我的温度传感器校准程序,也可以参考其他的论文。
下面只给出程序的一部分:
voidADC_init()
{
ADC10CTL0=ADC10SHT_2+ADC10ON+ADC10IE;//ADC10ON,interruptenabled参考电压选默认值VCC和VSS
//采样保持时间为16xADC10CLKs,ADC开,中断使能
ADC10CTL1=INCH_10; //ADC输入通道选择A10,为内部的温度传感器
//其他是默认,采样触发输入源选择为ADC10SC,采样输入信号不翻转,转换时钟选择内部时钟源:
ADC10OSC,3.7~6.3MHz
//不分频,单通道单次转换
//ADC10AE0|=0x02; //PA.1ADCoptionselect使能模拟输入脚A1
//P1DIR|=0x01; //SetP1.0tooutputdirection
//所以是P11为ADC输入脚,P10控制led
}
(五),通用串行通信接口(USCI)
1,USCI_A:
支持UART, IrDA, SPI
USCI_B:
支持I2C,SPI
2,UART 这个模块没什么好说的,和其他的一写处理器如S12,ARM等差不多。
只要设置好几个控制寄存器,波特率,写几个收发函数就可以了。
下面就给出msp430g2553于PC用UART通信的基本程序:
#include "msp430g2553.h"
unsignedcharrev;
char*string1="Helloworld!
";
charstring2[]="Getit!
\n"; //\n是换行符
voidputchar(unsignedcharc) //发送字符函数
{
while(!
(IFG2&UCA0TXIFG)); //USCI_A0TXbufferready?
等待TXbuffer为空
UCA0TXBUF=c; //TX->RXedcharacter 发送字符c
}
voidputstr(char*s) //发送字符串函数
{
IE2&=~UCA0RXIE; //发送时先关闭接收中断,不接收
while((*s)!
='\0') //如果没有发完,就继续循环发送
{
putchar(*s);
//putchar('\n'); //发送换行符
s++;
}
IE2|=UCA0RXIE; //发送完了打开接收中断
}
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD; //StopWDT
P1DIR=BIT0;
BCSCTL1=CALBC1_1MHZ; //SetDCO为1MHz
DCOCTL=CALDCO_1MHZ;
P1SEL=BIT1+BIT2; //P1.1=RXD,P1.2=TXD
P1SEL2=BIT1+BIT2; //第二外围模式选择
// UCA0CTL1|=UCSSEL_2; //SMCLK其他默认:
软件复位使能USCI逻辑保持在复位状态,用于设置串口
//UCA0CTL0全部为默认状态:
无奇偶校验,LSBfirst,8bit_data,一位停止位,UART模式,异步模式
// UCA0BR0=8; //SMCLK1MHz115200 8
// UCA0BR1=0; //1MHz115200
// UCA0MCTL=UCBRS2+UCBRS0; //ModulationUCBRSx=5
//下面是选择ACLK,波特率设置为固定的
UCA0CTL1|=UCSSEL_1; //ACLK
UCA0BR0=3; //ACLK32768Hz9600 32768Hz/9600=3.41
UCA0BR1=0; //32768Hz9600
UCA0MCTL=UCBRS1+UCBRS0; //ModulationUCBRSx=3
UCA0CTL1&=~UCSWRST; //**InitializeUSCIstatemachine** 初始化释放,可以操作
IE2|=UCA0RXIE; //EnableUSCI_A0RXinterrupt 接收中断使能
__bis_SR_register(LPM0_bits+GIE); //EnterLPM0,interruptsenabled
}
//EchobackRXedcharacter,confirmTXbufferisreadyfirst
#pragmavector=USCIAB0RX_VECTOR
__interruptvoidUSCI0RX_ISR(void)
{
while(!
(IFG2&UCA0TXIFG)); //USCI_A0TXbufferready?
等待TXbuffer为空
UCA0TXBUF=UCA0RXBUF; //TX->RXedcharacter 发送接收到是数据
rev=UCA0RXBUF;
if(rev&0x01)
{
P1OUT|=BIT0;
putstr(string1);
putstr(string2);
}
else
P1OUT&=~BIT0;
}
注意:
关于波特率的设置这一块还没有看懂,但上面的例子总的设置是对的
值得说明的是:
可以用定时器来实现串口通信功能,例子还没有看。
3,对于SPI和I2C,有时有可能会用于g2553和其他的一些芯片、设备的通信用,还没没仔细看。
(六),比较器A Comparator_A+
1,是一个模拟电压比较器,主要功能是指出两个输入电压CA0和CA1的大小关系,然后由输出信号CAOUT输出。
2,输出:
如果正端输入电压大于负端输入电压,输入为1。
如果负端输入电压大于正端输入电压,输出为0;
3,最终输出信号的上升沿或下降沿可以设置为具有中断能力,中断响应后,硬件会自动清除中断标志位CAIFG,也可以被软件清除。
4,Comparator_A+支持精密的斜坡AD转换,供电电压检测和监视外部模拟信号。
5,比较器的其中一路可以接参考电压,有0.25VCC,0.5VCC,三极管的阀值电压0.55V
也可以两路信号都接外部的模拟信号。
6,更详细的内容,参见用户只能,下面的例子是简单的用比较器A比较两个输入模拟电压的高低,有CAOUT输出:
//主要功能是比较两个输入信号的大小关系
#include
voiddelay(void); //Softwaredelay
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD; //StopWDT
CACTL2=P2CA4; //CA1/P1.1=+comp正输入端信号选择CA1,负输入端信号不连接外部输入信号
//其他位的设置为默认:
比较器输出不滤波,CAOUT为比较器的输出结果
CCTL0=CCIE; //CCR0interruptenabled
TACTL=TASSEL_2+ID_3+MC_2; //SMCLK/8,cont-mode
_EINT(); //enableinterrupts
while
(1) //Loop
{
//比较器A控制寄存器1CACTL1采用的是默认设置:
参考电压源VCAREF加到比较器的正输入端,内部参考源关,比较器关,
//中断不使能
CACTL1=0x00; //Noreferencevoltage
_BIS_SR(LPM0_bits); //EnterLPM0
CACTL1=CAREF0+CAON; //参考源为0.25*Vcc,Comp.on
_BIS_SR(LPM0_bits); //EnterLPM0
CACTL1=CAREF1+CAON; //参考源为0.5*Vcc,Comp.on
_BIS_SR(LPM0_bits); //EnterLPM0
CACTL1=CAREF1+CAREF0+CAON; //参考源为三极管的阀值电压0.55V,Comp.on
_BIS_SR(LPM0_bits); //EnterLPM0
}
}
//TimerA0interruptserviceroutine
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidTimer_A(void)
{
_BIC_SR_IRQ(LPM0_bits); //ClearLPM0bitsfrom0(SR)
}
7,也可以用比较器A监视供电电压,用0.25VCC和三极管的阀值电压0.55V进行比较,从而监视供电电压的高低,如果电压低于某个值时,可以做某种动作比如报警电池电量过低等。
(七),低功耗模式
1,TImsp430单片机是一个特别强调超低功耗的单片机系列。
对于低功耗的实现,丰富的中断和合理的时钟系统是必须的,另外相对独立的外设,可以不在CPU的干预下独立地工作,这样减小了CPU的工作时间,也大幅降低了系统功耗。
2,msp430能够用中断迅速把CPU从低功耗模式中唤醒,唤醒时间小于1us。
这就保证了系统的低功耗。
让CPU工作在脉冲状态,最大限度地让CPU处于休眠状态,只有在一些需要CPU干预的操作或计算时,才把CPU唤醒。
另外,把一些无关的外围模块也都关闭,使一些需要的模块尽量单独工作,从而可以把CPU休眠。
合理地利用中断,在需要的时间唤醒cpu。
3,msp430应用系统价格和电流消耗等因素会影响CPU与外围模块对时钟的需求,所以系统使用不同的时钟信号:
ACLK,MCLK,SMCLK。
用户通过程序可以选择低频或高频,这样可以根据实际需要来选择合适的系统时钟频率,这3种不同的频率的时钟输出给出不同的模块,从而更合理地利用系统的电源,实现整个系统的超低功耗。
4,单片机的工作模式有:
活动模式是(AM),低功耗模式0(LPM0)~低功耗模式4(LPM4)。
不同的低功耗模式禁止不同的模块,适应不同的需求。
5,各种低功耗模式的配置有控制位:
SCG1,SCG2,OscOff,CPUOff由软件来配置。
而各种低功耗模式又可通过中断的方式会到活动模式。
在CCS的编译系统中,已经做好了各种低功耗模式的宏定义,在软件中直接调用就可以了,宏定义如下:
#ifdef__ASM_HEADER__
#defineLPM0 (CPUOFF)
#defineLPM1 (SCG0+CPUOFF)
#defineLPM2 (SCG1+CPUOFF)
#defineLPM3 (SCG1+SCG0+CPUOFF)
#defineLPM4 (SCG1+SCG0+OSCOFF+CPUOFF)
#else
#defineLPM0_bits
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工作 小结 MSP430G2553 学习 笔记