您的位置 首页 软件

电设作业小结之——MSP430G2553学习笔记——2

(四),ADC101,ADC10是十位的AD,在g2553上有A0~A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的VCC或GND

(四),ADC10

1,ADC10是十位的AD,在g2553上有A0~A7八个能够外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的VCC或GND上。由于是10为的AD所以核算公式如下:

2 ,ADC参阅电压的挑选:ADC的参阅电压能够为:

由ADC操控寄存器0 ADC10CTL0操控。可是要进步ADC的精度的话,尽量不要用内部的参阅电压,最好外接一个比较安稳的电压作为参阅电压,由于内部的发生的参阅电压不是特别安稳或精度不是特别的高。例如我在运用时遇到的状况如下:

Vref设为2.5V但实践的值大约为2.475V, 挑选VCCVSS作为参阅,用电压表测得大约为3.58V仍是不小的误差的。

别的,在有或许的状况下,尽量选用较大的VR+和VR-,以减小纹波对采样成果的影响。

3,ADC10的采样办法有:单通道单次采样,单通道屡次采样,多通道单次采样,多通道屡次采样。

4,DTC:由于ADC10只需一个采样成果存储寄存器ADC10MEM,所以除了在单通道单次采样的形式下,其他的三个形式都有必要运用DCT,不然转化成果会不停地被新的成果给掩盖。

DTC是转化成果传送操控,也便是转化成果能够不必CPU的干涉,就能够主动地存储在指定的存储空间内。运用这种办法转化速度快,拜访便利,适用于高速采样形式中。DTC的运用能够从下面的比方中很简略看理解:

#include <msp430g2553.h>

#include “ser_12864.h”

uchar s1[]={“DTC:”};

uchar s2[]={“2_cha_2_time_DTC”};

void ADC_init()

{

ADC10CTL1 = CONSEQ_3 + INCH_1;// 2通道屡次转化, 最大转化通道为A1

ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl参阅电压选默许值VCC和VSS

//采样坚持时刻为16 x ADC10CLKs,ADC内核开,中止使能MSC屡次转化挑选开

//假如MSC置位,则第一次开端转化时需求触发源触发一次,今后的转化会主动进行中止使能

//运用DTC时,当一个块传送完毕,发生中止

//数据传送操控寄存器0 ADC10DTC0设置为默许形式:单传送块形式,单块传送完中止

ADC10DTC1 = 0x04; //数据传送操控寄存器1 4 conversions界说在每块的传送数目总共采样4次 所以单块传送4次

//今后就中止了传送 由于是两通道的,所以是每个通道采样数据传送2次

ADC10AE0 |= BIT0+BIT1;// P1.0 P1.1 ADC option select 使能模仿输入脚A0 A1

//不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,可是当都接上采样源的时分,

//采样是相同的

}

void main(void)

{

uint adc_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);// Wait if ADC10 core is active等候忙

ADC10SA = (unsigned int)adc_sample;//数据传送开端地址寄存器设置DTC的开端地址Data buffer start

//设置数据开端传送的地址为数组adc_sample[]的首地址,由于寄存器ADC10SA和转化成果都是16位的,所以要把

//地址强制转化为16位的int或unsigned int

//应该也能够用指针直接拜访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; // Sampling and conversion startADC使能,开端转化 ADC10SC为采样触发源

//不需求cpu的干涉,DTC就能够把采样成果存储到指定的存储区中

__bis_SR_register(CPUOFF + GIE);// LPM0, ADC10_ISR will force exit假如转化成果传送完结,

//就会进入中止,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]);

}

}

// ADC10 interrupt service routine

#pragma vector=ADC10_VECTOR

__interrupt void ADC10_ISR(void)//中止呼应今后,中止标志位主动清零

{

__bic_SR_register_on_exit(CPUOFF);// Clear CPUOFF bit from 0(SR)

}

上面的比方是把存储成果存储在了uint型的数组中。也能够用指针直接指定要寄存的地址,然后再用指针进行拜访(理论上能够,但还没有试过)。也能够把存储成果直接寄存在一个16位的寄存器中,如:

ADC10SA = (unsigned int)&TACCR1;// Data transfer location把转化成果存储在TACCR1地点的

//方位处,就相当于存储在TACCR1中 由于ADC转化成果和寄存器TACCR1都是16位的,所以要把地址强制转化为16位的

//int 或 unsigned int型

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

片上温度传感器的校准,能够拜见我的温度传感器校准程序,也能够参阅其他的论文。下面只给出程序的一部分:

void ADC_init()

{

ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled 参阅电压选默许值VCC和VSS

//采样坚持时刻为16 x ADC10CLKs,ADC开,中止使能

ADC10CTL1 = INCH_10;// ADC输入通道挑选A10,为内部的温度传感器

//其他是默许,采样触发输入源挑选为ADC10SC,采样输入信号不翻转,转化时钟挑选内部时钟源:ADC10OSC,3.7~6.3MHz

//不分频,单通道单次转化

//ADC10AE0 |= 0x02;// PA.1 ADC option select 使能模仿输入脚A1

//P1DIR |= 0x01;// Set P1.0 to output direction

//所以是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”

unsigned char rev;

char *string1=”Helloworld!”;

char string2[]=”Get it!”;//是换行符

void putchar(unsigned char c)//发送字符函数

{

while (!(IFG2&UCA0TXIFG));// USCI_A0 TX buffer ready? 等候TX buffer为空

UCA0TXBUF = c;// TX -> RXed character发送字符c

}

void putstr(char *s)//发送字符串函数

{

IE2 &= ~UCA0RXIE;//发送时先封闭接纳中止,不接纳

while((*s)!=)//假如没有发完,就持续循环发送

{

putchar(*s);

// putchar();//发送换行符

s++;

}

IE2 |= UCA0RXIE;//发送完了翻开接纳中止

}

void main(void)

{

WDTCTL = WDTPW + WDTHOLD;// Stop WDT

P1DIR=BIT0;

BCSCTL1 = CALBC1_1MHZ;// Set DCO 为1MHz

DCOCTL = CALDCO_1MHZ;

P1SEL = BIT1 + BIT2 ;// P1.1 = RXD, P1.2=TXD

P1SEL2 = BIT1 + BIT2;//第二外围形式挑选

//UCA0CTL1 |= UCSSEL_2;// SMCLK 其他默许:软件复位使能 USCI逻辑坚持在复位状况,用于设置串口

//UCA0CTL0悉数为默许状况:无奇偶校验,LSB first,8bit_data,一位中止位,UART形式,异步形式

//UCA0BR0 = 8;// SMCLK 1MHz 1152008

//UCA0BR1 = 0;// 1MHz 115200

//UCA0MCTL = UCBRS2 + UCBRS0;// Modulation UCBRSx = 5

//下面是挑选ACLK,波特率设置为固定的

UCA0CTL1 |= UCSSEL_1;//ACLK

UCA0BR0 = 3;// ACLK 32768Hz 960032768Hz/9600 = 3.41

UCA0BR1 = 0;// 32768Hz 9600

UCA0MCTL = UCBRS1 + UCBRS0;// Modulation UCBRSx = 3

UCA0CTL1 &= ~UCSWRST;// **Initialize USCI state machine**初始化开释,能够操作

IE2 |= UCA0RXIE;// Enable USCI_A0 RX interrupt接纳中止使能

__bis_SR_register(LPM0_bits + GIE);// Enter LPM0, interrupts enabled

}

// Echo back RXed character, confirm TX buffer is ready first

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

{

while (!(IFG2&UCA0TXIFG));// USCI_A0 TX buffer ready? 等候TX buffer为空

UCA0TXBUF = UCA0RXBUF;// TX -> RXed character发送接纳到是数据

rev=UCA0RXBUF;

if(rev&0x01)

{

P1OUT |= BIT0;

putstr(string1);

putstr(string2);

}

else

P1OUT &= ~BIT0;

}

留意:关于波特率的设置这一块还没有看懂,但上面的比方总的设置是对的

值得阐明的是:能够用定时器来完成串口通讯功用,比方还没有看。

3,关于SPI和I2C,有时有或许会用于g2553和其他的一些芯片、设备的通讯用,还没没仔细看。

(六),比较器AComparator_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

void delay(void);// Software delay

void main (void)

{

WDTCTL = WDTPW + WDTHOLD;// Stop WDT

CACTL2 = P2CA4;// CA1/P1.1 = +comp 正输入端信号挑选CA1,负输入端信号不连接外部输入信号

//其他位的设置为默许:比较器输出不滤波 , CAOUT为比较器的输出成果

CCTL0 = CCIE;// CCR0 interrupt enabled

TACTL = TASSEL_2 + ID_3 + MC_2;// SMCLK/8, cont-mode

_EINT();// enable interrupts

while (1)// Loop

{

//比较器A操控寄存器1 CACTL1选用的是默许设置:参阅电压源VCAREF加到比较器的正输入端,内部参阅源关,比较器关,

//中止不使能

CACTL1 = 0x00;// No reference voltage

_BIS_SR(LPM0_bits);// Enter LPM0

CACTL1 = CAREF0 + CAON;// 参阅源为0.25*Vcc, Comp. on

_BIS_SR(LPM0_bits);// Enter LPM0

CACTL1 = CAREF1 + CAON;// 参阅源为0.5*Vcc, Comp. on

_BIS_SR(LPM0_bits);// Enter LPM0

CACTL1 = CAREF1 + CAREF0 + CAON;//参阅源为三极管的阀值电压 0.55V, Comp. on

_BIS_SR(LPM0_bits);// Enter LPM0

}

}

// Timer A0 interrupt service routine

#pragma vector=TIMER0_A0_VECTOR

__interrupt void Timer_A (void)

{

_BIC_SR_IRQ(LPM0_bits);// Clear LPM0 bits from 0(SR)

}

7,也能够用比较器A监督供电电压,用0.25VCC和三极管的阀值电压0.55V进行比较,然后监督供电电压的凹凸,假如电压低于某个值时,能够做某种动作比方报警电池电量过低一级。

(七),低功耗形式

1,TI msp430单片机是一个特别强调超低功耗的单片机系列。关于低功耗的完成,丰厚的中止和合理的时钟体系是有必要的,别的相对独立的外设,能够不在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__

#define LPM0(CPUOFF)

#define LPM1(SCG0+CPUOFF)

#define LPM2(SCG1+CPUOFF)

#define LPM3(SCG1+SCG0+CPUOFF)

#define LPM4(SCG1+SCG0+OSCOFF+CPUOFF)

#else

#define LPM0_bits(CPUOFF)

#define LPM1_bits(SCG0+CPUOFF)

#define LPM2_bits(SCG1+CPUOFF)

#define LPM3_bits(SCG1+SCG0+CPUOFF)

#define LPM4_bits(SCG1+SCG0+OSCOFF+CPUOFF)

#include “in430.h”

#define LPM0_bis_SR_register(LPM0_bits)

#define LPM0_EXIT_bic_SR_register_on_exit(LPM0_bits)

#define LPM1_bis_SR_register(LPM1_bits)

#define LPM1_EXIT_bic_SR_register_on_exit(LPM1_bits)

#define LPM2_bis_SR_register(LPM2_bits)

#define LPM2_EXIT_bic_SR_register_on_exit(LPM2_bits)

#define LPM3_bis_SR_register(LPM3_bits)

#define LPM3_EXIT_bic_SR_register_on_exit(LPM3_bits)

#define LPM4_bis_SR_register(LPM4_bits)

#define LPM4_EXIT_bic_SR_register_on_exit(LPM4_bits)

#endif

6,详细的比方就不再举了,便是在CPU不需求作业的时分进入低功耗形式,在需求作业的时分,经过中止唤醒。

下面说说一般的低功耗的准则:

(1),最大化LPM3的时刻,用32KHz晶振作为ACLK时钟,DCO用于CPU激活后的突发时间短运转。

(2),用接口模块替代软件驱动功用。

(3),用中止操控程序运转。

(4),用可核算的分支替代标志位测验发生的分支。

(5),用快速查表替代冗长的软件核算。

(6),在冗长的软件核算中运用单周的CPU寄存器。

(7),避免频频的子程序和函数调用。

(8),尽或许直接用电池供电。

此外,在规划外设时还有一些惯例准则:

(1),将不必的FETI输入端连接到Vss。

(2),JTAG端口TMS, TCK和TDI不要连接到Vss。

(3),CMOS输入端不能有浮空节点,将一切输入端接恰当的电平。

(4),不管关于内核仍是关于各外围模块,挑选尽或许低的运转频率,假如不影响功用应规划主动关机。

(八),看门狗定时器

1,单片机的看门狗定时器的原始功用是避免程序犯错跑飞,可是在体系的研制阶段,一般不运用看门狗的。

2,msp的看门狗能够作业在看门狗形式和距离定时器形式,在距离定时器形式下,就能够当一个一般的定时器运用。其间作业形式的宏界说如下:

#define __MSP430_HAS_WDT__

SFR_16BIT(WDTCTL);

#define WDTIS0(0x0001)

#define WDTIS1(0x0002)

#define WDTSSEL(0x0004)

#define WDTCNTCL(0x0008)

#define WDTTMSEL(0x0010)

#define WDTNMI(0x0020)

#define WDTNMIES(0x0040)

#define WDTHOLD(0x0080)

#define WDTPW(0x5A00)

#define WDT_MDLY_32(WDTPW+WDTTMSEL+WDTCNTCL)

#define WDT_MDLY_8(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)

#define WDT_MDLY_0_5(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)

#define WDT_MDLY_0_064(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)

#define WDT_ADLY_1000(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)

#define WDT_ADLY_250(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)

#define WDT_ADLY_16(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)

#define WDT_ADLY_1_9(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)

#define WDT_MRST_32(WDTPW+WDTCNTCL)

#define WDT_MRST_8(WDTPW+WDTCNTCL+WDTIS0)

#define WDT_MRST_0_5(WDTPW+WDTCNTCL+WDTIS1)

#define WDT_MRST_0_064(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)

#define WDT_ARST_1000(WDTPW+WDTCNTCL+WDTSSEL)

#define WDT_ARST_250(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)

#define WDT_ARST_16(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)

#define WDT_ARST_1_9(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)

下面举一个看门狗作业于距离定时器形式下的比方:

#include

void main(void)

{

WDTCTL = WDT_MDLY_32;// Set Watchdog Timer interval to ~30msSMCLK计时

IE1 |= WDTIE;// Enable WDT interrupt 距离定时器形式中止使能

P1DIR |= 0x01;// Set P1.0 to output direction

_BIS_SR(LPM0_bits + GIE);// Enter LPM0 w/ interrupt

}

// Watchdog Timer interrupt service routine

#pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void)//WDTIFG中止标志主动铲除

{

P1OUT ^= 0x01;// Toggle P1.0 using exclusive-OR

}

3,上电今后看门狗默许是翻开的,假如不必的话就将其封闭:

WDTCTL = WDTPW + WDTHOLD;

4,看门狗操控寄存器还操控着RST/NMI管脚的功用,能够挑选它为复位管脚,也能够挑选它发生不行屏蔽中止,比方如下:

//第16脚是RST/NMI/SBWTDIO在本程序中,假如按下RESER键,会进入非可屏蔽中止,使P10 led闪耀

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD + WDTNMI + WDTNMIES;// WDT off NMI hi/lo

//WDTHOLD中止看门狗定时器WDTNMI挑选RST/NMI pin为NMI功用WDTNMIES挑选下降沿触发NMI

P1DIR |= 0x01;// Set P1.0 to output direction

P1OUT &= ~0x01;// Clear P1.0 LED off

IE1 |= NMIIE;// Enable NMI不行屏蔽中止使能

_BIS_SR(LPM0_bits);// Enter LPM0由于对错可屏蔽中止,所以不必翻开总中止

}

#pragma vector=NMI_VECTOR

__interrupt void nmi_ (void)

{

volatile unsigned int i;

P1OUT |= 0x01;// Set P1.0 LED on

for (i = 20000; i > 0; i–);// Delay

P1OUT &= ~0x01;// Clear P1.0 LED off

IFG1 &= ~NMIIFG;// Reclear NMI flag in case bounce

//NMI中止标志位有必要要软件铲除

IE1 |= NMIIE;// Enable NMI

//当非可屏蔽中止被相应,一切的NMI使能位都会主动地被复位,所以NMI相应之后,用户有必要软件从头使能需求的NMI

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/256241.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部