Msp430f5529开发板测周期和AD.docx
《Msp430f5529开发板测周期和AD.docx》由会员分享,可在线阅读,更多相关《Msp430f5529开发板测周期和AD.docx(10页珍藏版)》请在冰豆网上搜索。
Msp430f5529开发板测周期和AD
Msp430f5529开发板测频率和ADC采样电压
必备资料:
f5529的中文指导和数据手册(遗憾是汇编语言不是C)
中文指导:
网上有大侠把英文版的用户指导翻译成中文了
数据手册:
还没有出现中文版这种神器,不过多看几遍就OK
一.定时器A一些基本资料
至于寄存器里面含义自己应该可以看懂!
这句话我认为有一个极容易产生一个误区,就是TA有7个比较捕获寄存器,
当你查看msp430f5529.h的时候,我就发现只有
TAxCCTL0,TAxCCR0
TAxCCTL1,TAxCCR1
TAxCCTL2,TAxCCR2
它们都是共用一个TACTL。
压根就是没有3~6例如没有TAxCCTL3,TAxCCR3,我认为单片机上肯定是有7个比较捕获寄存器,就是msp430f5529没有对剩余的四个进行宏定义。
个人想法。
TAxCCTL0,TAxCCR0
这个最高级,好像大部分的430单片机写的程序都是优先写它。
特点:
增计数模式
连续计数模式
增减计数模式
!
!
!
!
!
!
!
这几种模式都能用
例如增计数模式:
TA0CCTL0=CCIE;//CCR0interruptenabled
TA0CCR0=50000;
TA0CTL=TASSEL_2+MC_1+TACLR;//SMCLK,upmode,clearTAR
__bis_SR_register(GIE);//EnterLPM0,enableinterrupts
就凭它的权力最多,就应该单独想用一个中断函数与CCTL1,CCTL2区分开来!
//Timer0A0interruptserviceroutine
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidTIMER0_A0_ISR(void)
{
}
其中的R0代表你用的TA定时器的第几个
TA0-----R0
TA1-----R1
TA2-----R2
CCTL0---A0一个中断对应一个中断源
例如我写的是TA2CCTL0和TA2CCR0,则对应的中断就是
#pragmavector=TIMER2_A0_VECTOR
应该明白了吧!
TAxCCTL1,TAxCCR1
TAxCCTL2,TAxCCR2
特点:
连续计数模式
经我调试
TA0CCTL1=CCIE;//CCR0interruptenabled
TA0CCR1=50000;
TA0CTL=TASSEL_2+MC_1+TACLR;//SMCLK,upmode,clearTAR
是进不了中断的,这是血的教训,(如果你采用的是比较模式,千万别想着,TMD理论上就是这样,为什么进不了中断)
应该把MC_1改为MC_2就OK了.
官方这样说
这样可以从侧面提问,上文中为什么不是TAxCCRx,而只是TAxCCR0!
应该明白了,
这里有一点千万要区分开来,这是晕死的教训!
TA0R,与TA0CCR1的区别,我也不知道是看了那本破书,或者就是那些5系列一下的430单片机程序可以,我只能感叹F5529真是神器!
在中断函数里把cap=TA0CCR1,或者是TA1CCR1,还说TA0R,TA0CCRx其实是一样的,就是计数的储存。
可能在一些5系列一下的430单片机是可以,但是在f5529严格区分开来,养成好习惯,TA0R不等于TA0CCRx
TA0CCR0是定数的,是不变的
TA0R是用来计数的。
是变化的
比较模式就是那TA0R去不断比较TA0CCR0,以万变应不变,超过就产生中断!
所以你在中断读取你计数的值
这样写是菜鸟
cap=TA0CCR1是XXXXXXX
应该写成
cap=TA0R,必须养成这个好习惯!
!
!
!
!
!
!
!
!
它们的中断函数是多源中断,说白了就是三个有用的
case2:
CCTL1
case4:
CCTL2
case14:
连续计数溢出中断
可以对比一下下面这个图:
中断函数
#pragmavector=TIMER1_A1_VECTOR
__interruptvoidTIMER1_A1_ISR(void)
这里就是TA1CCLxx是取值为1,2的
例子:
//Timer1_A3InterruptVector(TAIV)handler
#pragmavector=TIMER1_A1_VECTOR
__interruptvoidTIMER1_A1_ISR(void)
{
switch(__even_in_range(TA1IV,14))
{
case0:
break;//Nointerrupt
case2:
break;//CCR1
case4:
break;//CCR2
case6:
break;//reserved
case10:
break;//reserved
case12:
break;//reserved
case14:
break;//overflow
default:
break;
}
}
这里对应的寄存器应该是TA1CCL1或者是TA1CCL2!
!
!
!
!
!
!
!
!
!
!
!
!
2.ADC12(12为模数转换器)
ADC内核将一个模拟输入信号转换为12位的数字信号,并将其结果存储在转换存储器中。
该内核采用两个可编程/选择的电压(VR+和VR-)作为转换的上限和下限。
当输入信号大于或等于VR+时,数字输出(NADC)为最大值(0FFFh),而当输入信号小于者等于VR-时,输出为0。
在转换控制存储器中定义输入通
道和参考电压(VR+和VR-)。
ADC转换结果Nadc的计算公式为:
Nadc=4095×(Vin-VR-)⁄(VR+-VR-)
ADC12_A内核可通过两个寄存器ADC12CTL0和ADC12CTL1来进行配置,通过ADC12ON位使能内核。
在
理解一句话:
ADC12硬件会把转换的结果自动存放到ADC12MEM存储器中,每个ADC12MEMx都有自己对应的ADC12MCTLx.
voidadc1()
{
P6SEL|=BIT6;
ADC12CTL0=ADC12ON+ADC12SHT0_8+ADC12MSC;
ADC12CTL1=ADC12SHP+ADC12CONSEQ_2;
ADC12MCTL0=ADC12SREF_0+ADC12INCH_6;
ADC12CTL0|=ADC12ENC;
}
中断函数里
#pragmavector=ADC12_VECTOR
__interruptvoidADC12ISR(void)
{
转换的数据在ADC12MEM0;//这点要想通
}
ADC12中断
ADC12有18个中断源:
ADC12IFG0-ADC12IFG15
ADC12OV,ADC12MEMx溢出
ADC12TOV,ADC12_A转换时间溢出
当ADC12MEMx存储寄存器载入转换结果的时候,相应的ADC12IFGx位置位。
如果相应的ADC12IEx位和GIE位置位,将产生中断请求。
温馨提示:
如果你是在msp430f5529现有的工程修改你想要的程序,那你要注意了,系统工程本身就用了AD采样了,齿轮采样已经用了AD的中断,有两种方法你可以选择,在它的Wheel.c里修改,或者你自己新建个工程,不用齿轮!
在看程序之前,请注意:
1.我们要把一个信号,脉冲信号引用单片机,肯定要选用一个端口,网上的程序程序的端口F5529是不能用的,因开发板上的没有排针引出,为此我痛苦了好久,不过没事,用现有排针的端口P2.1,P2.0.
翻看数据手册:
找到
寄存器怎么对应呢!
TA1CCTL1-------------TA1.1
TA1CCTL2-------------TA1.2
例如
TA0CCTL2-------------TA0.2,
知道了吧,接下来就是设置这个端口为第二功能,外围模块!
!
!
!
!
编好程序怎么知道你程序能不能采到数据,小技巧就是你在P2.0引出一根杜邦线,在VCC和GND之间切换,有数据就OK,接下来就调试数据!
2.采样的端口你也要根据你排针上你有什么来选择
这里我选择的是P6.6的第二功能
!
!
!
!
编好程序怎么知道你程序能不能采到数据,小技巧就是你在P6.6引出一根杜邦线,接VCC或者GND,有数据就OK,接下来就调试数据!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
为了程序的完整性,请进入这个网站下载!