msp430f149定时器

合集下载

MSP430F149 定时器

MSP430F149 定时器

MSP430F149 定时器(1)利用定时器A的模式2(连续)实现的定时资料利用定时器A的模式2(连续)实现的定时资料在程序中对TACTL的控制,当TACTL为如下的赋值时TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt可以改变TASSEL_X来实现不同的定时,当为TASSEL_1时选ACLK为定时时钟,可以实现最短2S的定时,其次为2S的倍数的定时。

当为TASSEL_2时选SMCLK为定时时钟,定时取决于SMCLK的时钟源,1、SMCLK选DCO = 800KHZ为时钟源,最短定时时间为0.08S 的定时,其次为其倍数。

2、SMCLK选XT2也即外部高频晶振,此时定时取决于晶振频率,及其对分频的设置上。

主要是设置BCSCTL1及BCSCTS2.BCSCTL1 &= ~XT2OFF;BCSCTL2 |= SELS + DIVS_3;通过对上面两句的不同设置,可实现不同的延时。

/****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software and Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the TA// overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz.// Proper use of the TAIV interrupt vector generator is demonstrated.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A功能: 由定时器A,采用800KHz的DCO,来实现近一秒的定时中断;计算方法: T = 1/800,000 = 1.25uS so 根据连续计数模式,当计到0XFFFF时,发生溢出中断因此溢出一次的时间是: 65536*1.25 = 0.0819S,所以计时1秒需12次溢出。

msp430f149技术资料

msp430f149技术资料

MSP430是德州公司新开发的一类具有16位总线的带FLASH的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器。

具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M的时钟。

由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化,MSP430系列将会得到越来越多人的喜爱。

第三章MSP430F149 资源的应用介绍及开发第一节中断介绍及存储器段介绍中断在MSP430中得以广泛的应用,它可以快速进入中断程序,之后返回中断前的状态,其时序为:PC执行程序中断允许置位SR中的GIE置位 EINT(中断开)中断到,中断标志位(IFG)置位从中断向量表中读取中断程序的入口地址,进入中断程序执行中断程序中断允许位复位 RETI中断返回回到原来地址。

具体应用将会在应用程序中的到应用。

有关中断源和中断优先级及中断允许位、中断标志位在参考资料1上有详细介绍。

MSP430单片机的片上存储器共为64K,表示为图:第三节 P 口MSP430F149有6个8位的P口,其中P1、P2口占两个中断向量,共可以接16 个中断源,还可以直接利用 P口的输入输出寄存器,直接对外进行通信。

MSP430F149中文资料--部分

MSP430F149中文资料--部分

基于MSP430F149的GPS
(芯片篇)
1、系统功能框图
2芯片资料:
MSP430F149:
低电源电压范围:1.8~3.6V
超低功耗:待机模式:1.6uA 关闭模式(RAM保持):0.1uA 活动模式:280uA at 1MHz,2.2V
5种省电模式
6us内从待机模式唤醒
16位RISC结构,125ns指令周期
带内部参考,采样保持和自动扫描特性的12位A/D转换器
有7个捕获/比较寄存器的16位定时器Timer_B 有3个捕获/比较寄存器的16位定时器Timer_A
片内集成比较器
串行在线编程,无需外部编程电压,安全熔丝可编程代码保护.
器件系列包括:–MSP430F133:8KB+256B闪速存储器,256B的RAM –MSP430F135:16KB+256B闪速存储器,512B的RAM –MSP430F147,MSP430F1471:32KB+256B闪速存储器,1KB的RAM –MSP430F148, MSP430F1481:48KB+256B闪速存储器,2KB的RAM –MSP430F149, MSP430F1491:60KB+256B闪速存储器,2KB的RAM
可用封装:64脚方形扁平封装(QFP).
功能框图。

用MS430F149实现GS时间数据处理及CAN总线通信系统

用MS430F149实现GS时间数据处理及CAN总线通信系统

用MS430F149实现GS时间数据处理及CAN总线通信系统【摘要】本文介绍一种使用TI的16位超低功耗单片机MSP430F149来接收GPS OEM板的时间数据,进行守时处理,并把实时时间数据通过CAN总线来对外传输。

其中,CAN总线是利用MSP430F149单片机和独立CAN控制器MCP2515来实现的。

【关键词】MSP430F149;GPS数据;CAN总线;MCP2515一、引言TI的MSP430系列单片机是一种16位单片机。

由于它集成度高、外围设备丰富、超低功耗等优点,因此在许多领域内得到了广泛的应用。

本设计中所涉及的MSP430F149功能模块的利用:2个串行通信接口(USART0/1)、2个16位的定时器(TimerA/B)、I/O口的一般I/O功能和P1和P2口的I/O中断功能。

二、CAN总线简介CAN总线是一种串行数据通信协议,其通信接口集成了CAN协议的物理层和数据链路层功能,可完成对数据的成帧处理。

CAN总线支持全双工通信,采用对通信数据块编码的方式,可使网络内节点个数在理论上不受限制,还可使不同的节点同时接收到相同的数据。

CAN总线以其可靠性高、通信速率快、稳定性好、抗干扰能力强等特点,成为工控领域中最佳的选择。

三、系统硬件设计框图该系统硬件主要由以下几部分组成:GPS OEM板,MCU为TI的MSP430F149,CAN总线控制器为MicroChip公司的MCP2515,CAN收发器为PHILIPS的PCA82C250,以及电源输入与电源切换电路。

具体见图1:1.GPS OEM板性能与GPRMC语句本文所采用GPS OEM板,其输出串行数据格式为:波特率9600,无校验、8个数据位、1个停止位。

输出信息设置为符合NMEA0183 VER2.0协议的ASCII 码。

输出语句为GPRMC语句,其具体数据格式为:$GPRMC,,,,,,,,,,,,*hh其中,“$”表示串头;GP为标识符;RMC表示语句名;,,….,为输出语句的数据字段;“*”表示串尾;hh代表“$”和“*”之间所有字符代码的校验和。

MSP430F149定时数据采集程序

MSP430F149定时数据采集程序

MSP430F149定时数据采集程序[调试通过]该程序是用于过程控制的,改一下采样时间,就可以用于运动控制,里面没有添加如PID控制算法,自己添加自己的控制算法就可以了,希望对大家有用!#include <msp430x14x.h>#define RS_H P5OUT |=BIT3 //Data Register is selected#define RS_L P5OUT &=~BIT3 //Instruction Register is selected#define READ P5OUT |= BIT2 //读LCD#define WRITE P5OUT &= ~BIT2 //写LCD#define EN_H P5OUT |= BIT1 //Enable Read/Write Operation#define EN_L P5OUT &=~BIT1 //Disable Read/Write Operationunsigned char a[]="AD&DA change!";int AD_result;void Init_CLK(void); //时钟初始化函数void Init_ADC(void); //AD转换函数void Init_TimerA(void);void DATransfer(unsigned DA_data);//DA转换子函数void Init_Port(){P3SEL=0x00; //LCD所需端口设置P3DIR=0xFF;P3OUT&=~BIT5; //74HC245的DIR为低电平,输入方向由B端到A端P5SEL=0x00; //P5输出P5DIR=0xFF;P5OUT=0x00;P4SEL=0x00; //P4输出P4DIR=0xFF;P4OUT=0x00;P6SEL=0xF0; //P6.4-p6.5作为AD输入通道,P6.0-P6.3作为一般的IO口P6DIR=0xFF;P6OUT=0x00;}void Delay(unsigned int i) //延时子程序{while(i--); //延时时间为i*5+6个时钟周期}void Write_Command(unsigned char command ){P4OUT=command;RS_L; //选择程序寄存器WRITE; //允许写操作EN_H; //液晶使能Delay(50);//延时EN_L; //液晶读写操作禁止Delay(50);}void Write_Data(unsigned char data ){P4OUT=data;RS_H; //选择数据寄存器WRITE; //允许写操作EN_H; //液晶使能Delay(50); //延时EN_L ; //液晶读写操作禁止Delay(50);}void Clear_Second_Line() //用于删除2*16字符液的晶第二行的函数{int i=16;Write_Command(0xC0); //设置DDRAM的初始地址while(i--){P4OUT=0x20;RS_H; //选择数据寄存器WRITE; //允许写操作EN_H; //液晶使能Delay(50); //延时EN_L ; //液晶读写操作禁止Delay(50);}}void Init_LCD(void){Write_Command( 0x38 );//8位总线接口,双行显示,5*7点阵型Delay(100);Write_Command(0x0F);//开显示,开光标,光标闪烁Delay(100);Write_Command(0x01);//清屏,将空格字符ASCII码20H写入到所有的DDRAM单元Delay(2500);Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移Delay(100);Write_Command(0x80);//设置DDRAM的初始地址}void Init_ADC(void){//P6SEL = BIT7; //设置P6.7为模拟输入A7ADC12CTL0 &= ~(ENC); //设置ENC为0,从而可以修改ADC12寄存器的值ADC12CTL0 += ADC12ON+MSH; //开A/D转换,允许多次采样ADC12MCTL7 = EOS+INCH_7;//ADC12MCTL7的输入通道为A7,参考电压分别为AVSS和AVCC ADC12CTL1 = 0X00; //转换的起始地址为:ADCMEM7ADC12CTL1 = CSTARTADD0+CSTARTADD1+CSTARTADD2;ADC12CTL1 += SHP; //采样脉冲来自采样定时器ADC12CTL1 += CONSEQ_2; //单通道多次转换ADC12CTL1 += ADC12SSEL0; //ADC12内核时钟源为ACLKADC12IE = 0x00; //关闭各个通道的转换中断ADC12CTL0 |= ENC; //使能ADC转换return;}void Init_TimerA(void){TACTL = TASSEL0 + TACLR; // 选择ACLK:32K,清除TARTACTL +=ID1; // 1/8 SMCLKTACTL +=ID0;CCTL0 = CCIE; // CCR0 中断允许CCR0 = 2000; // 时间间隔为 0.5STACTL |= MC0; // 增记数模式return;}void Init_CLK(void){unsigned int i;BCSCTL1 = 0X00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1do{IFG1 &= ~OFIFG; // 清除OSCFault标志for (i = 0x20; i > 0; i--);}while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1BCSCTL2 = 0X00; //将寄存器的内容清零BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1}#pragma vector=TIMERA0_VECTOR //定时器A0的中断函数__interrupt void TimerA_ISR(void){float AD_data;char a;char b;int m;int n;// 读出转换结果P5OUT^=BIT6;while((ADC12IFG & BIT7)==0) ; //判断有没有转换结束_NOP();ADC12CTL0 &= ~ENC; // 关闭转换P5OUT^=BIT5;AD_result = ADC12MEM7; //读到AD转换的12位二进制数DATransfer(AD_result);if((ADC12IFG & BIT7)==0){P5OUT^=BIT4;}AD_data=AD_result*3.3/4095; //将读到的12位二进制数转化为对应的电压m=(int)AD_data;n=(int)(AD_data*10-m*10);a=48+m; //将符点型的电压值转化为字符数,便于液晶显示 b=48+n;Clear_Second_Line(); //删除16*2字符液晶的第二行数据Write_Command(0x06); // 设置液晶进入方式,DDRAM自增,整个显示右移Delay(100);Write_Command(0xC0); //设置液晶DDRAM的初始地址Write_Data(a);Delay(100);Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移Write_Data('.');Delay(100);Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移Delay(100);Write_Data(b);ADC12CTL0 |= ENC; // 允许AD转换ADC12CTL0|=ADC12SC; //开始新的转换}void DATransfer(unsigned DA_data) //DAC转换子程序{int i;unsigned int da_data;P6OUT&=~BIT0; //CS为低电平for(i=0;i<16;i++){P6OUT&=~BIT2; //SCLK为低电平P6OUT&=~BIT1;da_data=0x3000+(DA_data&0x0fff); //送入待转换的数字量,并选中A通道输出 da_data=((da_data>>(15-i))&0x0001)<<1;P6OUT|=da_data ; //输出一位二进制数Delay(10);P6OUT|=BIT2; //SCLK为高电平Delay(10);}P6OUT&=~BIT2; //SCLK为低电平P6OUT|=BIT0; //CS为高电平,开始转换数据Delay(10);}void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗_DINT(); // 关闭中断Delay(50000);Init_Port();Init_LCD();Init_CLK(); // 初始化Init_ADC();Init_TimerA();_EINT(); // 打开中断for(unsigned int i=0;a!='\0';i++){Write_Data(a);}P5OUT|=BIT7;ADC12CTL0 |=ADC12SC;while(1){ }}。

第四章 MSP430F149看门狗定时器

第四章 MSP430F149看门狗定时器
程序如下:
#include <msp430x14x.h> void main(void) {
WDTCTL=WDT_ADLY_1000;//1000ms 定时 //WDT_ADLY_1000=WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL
P6DIR |=BIT0;//P6.0 输出 P6OUT |=BIT0;//P6.0 输出高电平关闭 LED 灯 IE1 |=WDTIE;//允许 WDT 中断 _EINT();//开放系统中断 while(1) {
例:设置看门狗间隔定时器模式,选择 ACLK(32768Hz)时钟源,定时 1s。
WDTCTL=WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL;
口令
定时工作模式 清除计数器
选择 ACLK
思考:
选择 ACLK(32786Hz)时钟源,定时 250ms/16ms/1.95ms,如何设置 WDTCTL?
说明:
WDTPW——口令,固定格式。
WDTCNTCL——计数器清零
WDTCTL.2(WDTSSEL)——WDTCTL 第二位时钟源选择位,
0:选择 SMCLK
1:选择 ACLK
WDTISx——定时间隔选择控制位,T 为时钟源时钟周期。
WDTISx=00,定时间隔 T×215 WDTISx=01,定时间隔 T×213
2、IE1 中断使能寄存器 1
7
6
5
4
3
2
1
0
NMIIE
WDTIE
rw-0
rw-0
NMIIE:非屏蔽中断允许控制位。
NMIIE=0,禁止 NMI 中断

基于MSP430F149单片计算机的可编程定时开关设计

基于MSP430F149单片计算机的可编程定时开关设计

基于MSP430F149单片计算机的可编程定时开关设计本文基于MSP430单片机理论,发挥其“低功耗”的特性,以MSP430F149单片机为核心部件、ZLG7290 I2C接口键盘/LED驱动器为输入/显示设备的系统构架设计开发硬件。

标签:定时开关;低功耗;单片机;MSP430F149引言定时开关应用于生产生活的诸多领域。

但是,目前市场上大量使用的定时开关系统,控制对象单一,定时时间不可调节。

比如说,有的只能控制路灯,有的只能控制单一生产设备等。

然而现如今可编程逻辑器件、单片计算机等的蓬勃发展,不但填补了上述欠缺,而且使其应用领域进一步扩大,应用深度也进一步加深。

可编程定时开关[1]的实现方案具有极高的可定制性,有基于简单的C51单片计算机实现的,也有基于可编程逻辑器件FPGA实现的,甚至有基于PC(个人计算机)实现的,但最普遍的还是基于单片机来实现的。

单片机实现可编程定时开关控制设计简洁,效果良好,成本低廉。

本设计主要通过MSP430F149单片机实现功能。

1 MSP430F149单片机的说明[2]为了得到最容易实现设计目标且性价比高的机型,在芯片的选型上,主要需考虑系统功耗资源要求、芯片功能要求(考虑引脚、体积)以及系统存储器容量的要求。

MSP430F149单片机集中体现了现代单片机先进的低功耗设计理念,其设计结构完全以系统低功耗运行为核心。

单片机采用FLASH存储器作为程序代码及信息存储,因此可实现多次的写入和擦除,也可实现在线写入,且存储空间大,其中ROM为60K,RAM为2K。

在单片机内集成了一个12位精度、高效通用的A/D转换模块,即数据采集子系统。

片内有一个硬件乘法器,是一个16位的外围模块,它并不集成于CPU中,因此它的运算独立于CPU,也不需要特殊的指令。

片内有2个串行通讯接口,支持通用异步协议(UART协议)和同步协议(SPI协议)。

片内有2个16位的定时器,且带有多个捕获/比较寄存器,这样寄存器的使用将更加灵活。

MSP430F149的定时器A操作

MSP430F149的定时器A操作

MSP430F149的定时器A定时操作1)定时器A的图解图1 定时器A图解2)定时器A的四种计数模式。

1.停止模式。

2.增计数模式。

(产生两个中断标志)也就是当计数到跟TACCR0一样的时候,就返回0,重新计数。

当计数到TACCR0的同时产生一个中断标志CCIFG,而当计数器溢出返回零的同时又同时产生一个中断标志TAIFG。

如图:图2 增计数模式的波形图3.连续计数模式。

(产生一个中断标志)也就是计数器将直接计数到计数器所能计数的最大值0FFFFH之后重新返回零,再次计数。

返回零的同时产生一个TAIFG中断标志。

如图:4.增减计数模式。

(产生两个中断标志)也就是当计数器计数到跟TACCR0一样的之后,然后从TACCR0开始又减少,直到为零,然后又开始增。

当计数跟TACCT0一样的时候产生一个中断标志CCIFG,当减到为零的时候又产生一个中断标志TAIFG。

如图:注意:当重新写入TACCR0数值的时候,当新的数据大于原来的数值的时候,计数器将计数到新的数值才重新返回零;当新的数据小于原来的数值的时候,计数器将直接返回零重新计数。

3)定时器A的寄存器。

1.TACTL●TASSELx:计时器A的时钟来源选择。

●IDx:计时器A时钟的分频选择。

●MCx:计时器A四种计数模式选择。

●TACLR:计数器A的TAR计数清零,同时也可以清楚时钟分频器和计数方向。

●TAIE:TAIFG中断标志使能。

在捕获模式下可以打开所有CCIFG的中断使能。

●TAIFG:中断标志位。

2.TAR计数器的计数寄存器。

3.TACCTLx●CMx:捕获模式选择。

00:关闭;01:上升沿捕获;10:下降沿捕获;11:上升下降沿捕获。

●CCISx:捕获引脚选择。

●SCS:选择捕获电平方式。

0异步时钟;1同步时钟。

●SCCI:锁存同步时钟输入端。

也就是锁存EQUx的值,以供CPU读取。

●CAP:捕获模式和比较模式选择。

0比较;1捕获。

●OUTMODx:输出模式选择。

MSP430F149定时器B讲解

MSP430F149定时器B讲解

MSP430F149定时器B1.定时器B模块:TimerB与TimerA大部分相同,不同点在于定时器B的捕获/比较单元增加了锁存器。

二者区别:(1)TimerB计数长度为8位,10位,12位,16位可编程,由TBCTL寄存器的CNTLx两位来配置,而定时器A的计数长度是固定的16位;(2)TimerB没有实现定时器A中的SCCI功能位的功能;(3)TimerB在比较模式下的捕获/比较寄存器功能与TimerA不同,增加了捕获比较锁存器;(4)有些芯片型号当中TimerB输出实现了高阻抗输出;(5)比较模式的原理有所不同:TimerA当中CCRx寄存器当中保存与TAR相比较的数据,而在TimerB 当中CCRx中保存要比较的数据,但并不直接与定时器TBR相比较,而是将CCRx当中的数据锁存到相应的锁存器之后,由锁存器与TBR相比较。

从捕获/比较寄存器相比较锁存器传输数据的过程的时间也是可编程的,可以是写入比较捕获寄存器之后立即传输,也可有一个定时器来触发传输。

(6)TimerB支持多种同步的定时功能,多重比较捕获功能和多重波形输出功能(PWM波)。

而且,通过对比较数据的两级缓冲,可实现多个PWM波同步周期更新。

2.TimerB的逻辑结构图:定时器B的逻辑结构基本与定时器A相同。

3.定时器B的寄存器:寄存器相关位的配置过程参考定时器A和数据手册。

4.定时器B的比较功能当定时器B工作在比较模式时,将数据写入捕获比较锁存器TBCCRx当中,当TBCCTLx当中的CLLDx位决定的装载事件的发生时,TBCCRx中的数据会自动地传输到比较寄存器当中。

5.TI提供的例程://// ////// MSP430F149// -----------------// /|| XIN|-// | | | HF XTAL (455k - 8MHz)// --|RST XOUT|-// | |// | P4.1/TB1|--> CCR1 - 75% PWM// | P4.2/TB2|--> CCR2 - 25% PWM//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************。

msp430f149定时器

msp430f149定时器

用msp430实现计数器的功能,在1602第一行显示时钟,第二行显示”***TIMER***”--------------------------------------------------main-------------------------------------------------------#include <msp430x14x.h>#include "Display.h"#include "Common.h"unsigned char sec,min,hour;//定时器A初始化函数void Init_TimerA(){TACTL=TASSEL0+TACLR;//选择ACLK,32768HzTACCTL0=CCIE;CCR0=32768; //1sTACTL |=MC0;//增计数模式}//Init IOvoid Port_Init(){P4SEL = 0x00;P4DIR = 0xFF;P5SEL = 0x00;P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式}void main( void ) //主函数{unsigned char i,*p;WDT_Init();Clock_Init();Port_Init();Init_TimerA();_EINT();Delay_Ms(100);LCD_Init();LCD_Clear();while(1){i=2;p="***TIMER***";LCD_Pos(6);LCD_write_data(':');LCD_Pos(9);LCD_write_data(':');LCD_Writesfm(10,sec);LCD_Writesfm( 7,min);LCD_Writesfm( 4,hour);while(*p){LCD_Writechar(i,1,*p);i++;p++;Delay_Ms(1);}}}/***********定时器A中断服务程序**************/#pragma vector=TIMERA0_VECTOR__interrupt void TimerA_ISR(void){sec++;if(sec==60){min++;sec=0;if(min==60){hour++;min=0;if(hour==24)hour=0;}}}-------------------------------------------------Display.c,要添加到工程中-------------------------------------/****************************************************fun: Display.cfunction:input:ouput:auther:*****************************************************/#include "Display.h"//***********************************************************************// 1602显示屏初始化函数//*********************************************************************** void LCD_Init(void){LCD_write_com(0x38); //显示模式设置Delay_Ms(5);LCD_write_com(0x08); //显示关闭Delay_Ms(5);LCD_write_com(0x01); //显示清屏Delay_Ms(5);LCD_write_com(0x06); //显示光标移动设置Delay_Ms(5);LCD_write_com(0x0C); //显示开及光标设置Delay_Ms(5);}//*********************************************************************** // 1602显示屏清空显示//***********************************************************************void LCD_Clear(void){LCD_write_com(0x01); //清屏幕显示Delay_Ms(5);}//********************************************************************// 1602显示屏命令写入函数//***********************************************************************void LCD_write_com(unsigned char com){RS_CLR;RW_CLR;EN_SET;DataPort = com; //命令写入端口Delay_Ms(5);EN_CLR;}//*********************************************************************** // 1602显示屏数据写入函数//***********************************************************************void LCD_write_data(unsigned char data){RS_SET;RW_CLR;EN_SET;DataPort = data; //数据写入端口Delay_Ms(5);EN_CLR;}//*********************************************************************** // 显示屏字符串写入函数//***********************************************************************void LCD_Writestr(unsigned char x,unsigned char y,unsigned char *s){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}while (*s){LCD_write_data( *s);s ++;}}//*********************************************************************** // 显示屏单字符写入函数//***********************************************************************void LCD_Writechar(unsigned char x,unsigned char y,unsigned char data){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}LCD_write_data( data);}//***********************************************************************// 显示位置函数//***********************************************************************void LCD_Pos(unsigned char pos){LCD_write_com(0x80+pos);}//***********************************************************************// 显示时分秒函数//***********************************************************************void LCD_Writesfm(unsigned char add,unsigned char date){ unsigned char shi,ge;shi=date/10;ge=date%10;LCD_write_com(0x80+add);LCD_write_data(0x30+shi);LCD_write_data(0x30+ge);}----------------------------------------------Display.h,要添加到工程中------------------------------------------#include"Common.h"#define P55 5#define P56 6#define P57 7 //我149的板子是这三个口为控制口,如果要用请根据你板子的电路图修改//对应控制口#define RS_CLR P5OUT &= ~(1 << P55) //RS置低#define RS_SET P5OUT |= (1 << P55) //RS置高#define RW_CLR P5OUT &= ~(1 << P56) //RW置低#define RW_SET P5OUT |= (1 << P56) //RW置高#define EN_CLR P5OUT &= ~(1 << P57) //E置低#define EN_SET P5OUT |= (1 << P57) //E置高#define DataPort P4OUT //P4口为数据口void LCD_Init(void);void LCD_Clear(void);void LCD_write_com(unsigned char com);void LCD_write_data(unsigned char data);void LCD_Writestr(unsigned char x,unsigned char y,unsigned char *s);void LCD_Writechar(unsigned char x,unsigned char y,unsigned char data);void LCD_Writesfm(unsigned char add,unsigned char date);void LCD_Pos(unsigned char pos);-------------------------------------------Common.c,要加到工程中----------------------------------------- #include"Common.h"void Clock_Init(void){uchar i;BCSCTL1&=~XT2OFF; //打开XT2振荡器BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZdo{IFG1&=~OFIFG; //清楚振荡器错误标志for(i=0;i<100;i++)_NOP();}while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待IFG1&=~OFIFG;}void WDT_Init(){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗}------------------------------------Common.h,要加到工程中---------------------------------------------/*********************************************frequency:8MHz*********************************************//****************************************************fun:function: 常用宏定义库,有待扩充input:ouput:auther:*****************************************************/#include <msp430x14x.h>#define CPU_F ((double)8000000)#define Delay_Us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define Delay_Ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define uchar unsigned char#define uint unsigned int#define ulong unsigned longextern void Clock_Init(void);extern void WDT_Init(void);。

基于MSP430F149单片机实现的步进电机通用控制器

基于MSP430F149单片机实现的步进电机通用控制器

1.前言基于步进电机的控制系统,除了步进电机一般还需要专门的驱动电源,驱动电源仅仅完成功率驱动部分,用户并不能使整个控制系统按预定的、期望的工作状态运行,必须对它的驱动电源予以控制,用户需要再次开发。

鉴于此,设计了基于MSP430F149单片机实现的步进电机通用控制器,可以满足大多数控制场合下的要求。

控制器的主要功能为:①可控制多套步进电机驱动系统;目前可同时控制3套系统。

②工作方式灵活,可按设定的曲线运行,曲线最多达8段;可按外部检测到的控制信号运行;可按模拟调节测试功能运行;2.系统的设计2.1系统的结构本控制器主要实现了多台步进电机在多段曲线上的运行控制。

系统结构如图1所示。

本设计选用了TI公司所生产的MSP系列单片机MSP430F149。

目的是应用其丰富的接口资源和强大的定时器功能,MSP430F149的性能特点如下:①6个八位并行接口;完全可以实现该系统所有信号的输入、输出,无须硬件扩展,其中P1、P2八位并行端口的每根口线都具有中断功能,使键盘的软、硬件设计变的非常简单。

②12位A/D转换器ADC;完成模拟设定功能。

③强大的定时器功能;TIMER-A3、TIMER-B7分别为带有3个和7个捕捉/比较寄存器的16位定时器,可以满足系统速度的设定及曲线定时的要求。

④液晶驱动模块;⑤内置2KB RAM、60KB的FLASH;MSP430F149所提供的丰富资源,外围硬件扩展只需做很少的工作,不仅设计变得非常简单,而且该控制器体积小、可靠性高。

2.3步进电机起动及加/减速控制方案步进电动机的最高起动频率(突跳频率)一般为0.1KHz到3-4KHz,而最高运行频率则可以达到N*102 KHz。

以超过最高起动频率的频率直接起动,将出现"失步"现象,甚至无法起动。

较为理想的起动曲线,应是按指数规律起动。

但实际应用对起动段的处理可采用按直线拟合的方法,即"阶梯升速法"。

MSP430F149开发板说明

MSP430F149开发板说明

MSP430F149开发板说明一,MSP430F149自带硬件资源:(1) 基础时钟模块,包括1个数控振荡器(DCO)和2个晶体振荡器;(2) 看门狗定时器Watchdog Timer,可用作通用定时器:(3) 带有3个捕捉/比较寄存器的16位定时器Timer-A;(4) 带有7个捕捉/比较寄存器的16位定时器Timer_B;(5) 2个具有中断功能的8位并行端口:P1与P21(6) 6个8位端口:P1、P2、P3、P4、P5、P6。

(7) 模拟比较器COMPARATOR_A;(8) 12位A/D转换器;(9) 2通道串行通信接口(软件选择UART/SPI模式);(10) 1个硬件乘法器;(11) 60KB+256字节FLASH,2KBRAM。

二,MSP430F149开发板外围电路和硬件:1、两种可选供电方式(标准5V稳压器接口、USB接口)2、3.3V和5V电平接口3、一个兼容USB2.0规范、符合USB1.1规范的标准USB接口4、一个12864液晶显示屏接口5、一个JTAG仿真调试下载端口6、一个蜂鸣器7、一个NRF905射频通信模块接口8、一个8位的LED指示灯模块9、一个8路12-Bit模数转换(ADC)接口10、一个ZIGBEE(型号SZ05)无线通信接口11、一个IR红外串口无线通信模块12、一个8位数码管显示和4X4键盘模块13、一个L298电机驱动模块(可驱动两个电机)14、一个IIC模块包含:PCF8563时钟、LM75温度传感器、AT24C02数据存储15、一个单路输出10位DA转换芯片(TLC5615)16、一个标准的MAX3232接口17、一个的MAX485接口三,MSP430F149的性能MSP430系列单片机最显著的特点就是它的超低功耗。

在1.8—3.6V 电压、1MHz的时钟条件下运行。

耗电电流在0.1—400mA.之间,RAM 在节电模式耗电为0.1mA,等待模式下仅为0.7mA。

MSP430F149的看门狗操作

MSP430F149的看门狗操作

MSP430F149的看门狗操作1)看门狗的图解图1 看门狗图解2)看门狗介绍看门狗由一个16位寄存器控制,高八位是密匙,密匙密码是05AH,读取是069H。

MSP430F149的看门狗是系统默认开启的,所有一般不用的时候,程序一开始就关闭看门狗。

看门狗有两种工作模式:1.看门狗模式。

2.定时器模式。

3)看门狗的控制寄存器1.WDTCTL●WDTPW:高八位是密匙。

一般IAR的头文件里面都包含有。

●WDTHOLD:选择是否打开看门狗。

0开1关。

●WDTNMIES:当复位端用作NMI(外部的非可屏蔽中断)的时候,选择是上升沿触发中断还是下降沿触发中断。

0上升1下降。

●WDTNMI:选择复位端是作为复位端口还是NMI(外部的非可屏蔽中断)端口。

0复位1NMI。

●WDTTMSEL:选择看门狗模式还是定时器模式。

0看门狗1定时器。

●WDTCNTCL:看门狗计数清零。

1清零。

●WDTSSEL:看门狗的时钟来源选择。

0子系统时钟1主系统时钟。

●WDTISx:看门狗时钟分频选择。

2.IE1●NIMIE:外部非可屏蔽中断使能。

●WDTIE:看门狗中断使能。

(当看门狗做定时器的时候也是这个使能)3.IFG1(一般C语言不操作,都会有硬件置位)●NMIIFG:外部非可屏蔽中断标志。

●WDTIFG:看门狗中断标志。

4)当看门狗用作定时器使用的时候的操作。

1.把看门狗设置到定时器模式。

(也还可以设置触发边沿,选择时钟和分频)2.清零看门狗。

3.打开看门狗中断使能。

#include<msp430x14x.h>#define uint unsigned intvoid main(){WDTCTL=WDT_MDLY_32;//相当于WDTPW+WDTTMSEL+WDTCNTCL//也就是密匙+选择定时器模式+清零看门狗IE1|=WDTIE;//打开看门狗中断使能,由于看门狗是非可屏蔽中断所有不用//打开总中断IEwhile(1){LPM3;}}#pragma vector=WDT_VECTOR//看门狗的中断入口地址是WDT_VECTOR,NMI的入口地址是NMI_VECTOR __interrupt void P1RT(void){//中断程序,硬件自动清除中断标志所有不用软件清除。

MSP430F149 TIMER_A(一)——16位定时计数

MSP430F149 TIMER_A(一)——16位定时计数

MSP430F149 TIMER_A(一)——16 位定时计数TIMER_A 有四个可选时钟源,为了方便一般选择ACLK 和SMCLK,经过分频器产生一个时基,其结构图如下:TIMER_A 有三种定时/计数方式:(1).增计数模式:计数周期:TAR 从0 增加到TACCR0,(2).连续计数模式:计数周期:TAR 从0 增加到0xffff,(3).增减计数模式:计数周期:TAR 从0 增加到TACCR0 然后再从TACCR0 减到0由上图可见TIMER_A 的中断标志有两个,分别是TAIFG 和CCIFG。

TACTL 中的TAIE 允许产生TAIFG 中断标志,中断入口是TIMERA_1 VECTOR 即0FFEAh,此入口有三个中断源,由TAIV 的值决定。

在IAR 中,进入中断服务的方式如下:#pragma vector=中断向量的入口地址__interrupt void 函数名(类型)比如:#pragma vector=0x14__interrupt void my_handler(void);TIMERA0_VECTOR 是单中断源的,因此不需要判断#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A0 (void){ P4OUT–BIT0;}既然TIMERA1_VECTOR 由三种中断源,则需要判断,例子如下#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A1 (void){ switch(TAIV) { case 0x02:break; case 0x04:break; case 0x0a:P4OUT–BIT0;break; }}tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

MSP430F149介绍文档

MSP430F149介绍文档

MSP430F149介绍文档MSP430F149是德州仪器(Texas Instruments)推出的一款低功耗、高性能的MSP430系列32位微控制器。

它采用16位RISC架构,工作频率高达16MHz,具有较大的存储容量和丰富的外设资源,适用于各种嵌入式应用开发。

MSP430F149具有较低的工作电压和功耗,能够在1.8V到3.6V的范围内正常工作,使其在电池供电系统中具有较长的续航时间。

它的典型工作电流仅为0.6mA,待机电流为0.1μA,非常适合对功耗要求严格的应用场景。

此外,MSP430F149还支持多种低功耗模式,包括LPM4(电平3)模式,可以实现极低的功耗消耗。

MSP430F149内置了8KB的闪存和512B的RAM,可以通过内部的编程接口进行非易失性存储器(NVM)编程。

它还支持外扩存储器,包括片外SRAM和EEPROM,可以满足更大容量的数据存储需求,灵活应对各种应用场景。

此外,MSP430F149还支持多种通信接口,包括USART、SPI和I2C 等,可以方便地与其他外部设备进行数据交换和通信。

MSP430F149具有多种芯片外设,包括多通道的12位ADC、多个通用定时器、比较器、高速PWM输出等。

这些外设资源可以满足不同应用中的各种控制和计时需求。

此外,MSP430F149还支持内置RTC(实时时钟)模块,提供了精确的时间管理功能,适用于需要时间戳功能的应用场景。

MSP430F149采用了MSP430系列独特的开发环境和编程方式。

德州仪器提供了MSP430编程和调试工具套件,包括MSP430硬件调试接口(HDI)和MSP430调试器(MSP-FET)。

开发人员可以使用这些工具进行软件编译、调试和烧录,快速开发MSP430F149的应用程序。

总之,MSP430F149是一款极具性价比的嵌入式微控制器,具有低功耗、高性能、丰富的外设资源和易用的开发环境等优点。

它适用于各种嵌入式应用开发,包括消费电子产品、工业自动化系统、智能传感器等领域。

MSP430F149单片机定时器B捕获例程

MSP430F149单片机定时器B捕获例程
break;
case 12:
ccr6=TBCCR6; //P46口
break;
case 14: //溢出
break;
}
}
/****************************定时器B捕获中断入口0*********************************/
#pragma vector=TIMERB0_VECTOR
#define uchar unsigned char
uint ccr0=0;
uint ccr1=0;
uint ccr2=0;
uint ccr3=0;
uint ccr4=0;
uint ccr5=0;
uint ccr6=0;
/*****************************main函数***********************/
捕获模式上升捕获选择cci6a同步捕获中断开tbctlaclkup模式tbccrx要在中断时候抓取16位定时计数器中的数值eint
/**
***************************************************************
MSP430F149单片机定时器B捕获例程
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P5DIR|= BIT6; // P5.6输出
P5SEL|= BIT6; // P5.6输出ACLK
P4SEL|= BIT0;
P4DIR&= ~BIT0;
P4SEL|= BIT1;
P4DIR&= ~BIT1;
{

msp430f149 TIMERA的几点说明

msp430f149 TIMERA的几点说明
{
TACTL|=TASSEL_1+TACLR+ID0+ID1+MC0;//选择ACLK的8分频作为定时器的时钟,定时器为增加模式
//SMCLK+TimerA_Clear+8分频+增加模式+中断使能
CCTL0 = CCIE; //使能CCR0中断
CCIE:This bit enables the interrut request of the corresponding CCIFG flag
增计数模式。(产生两个中断标志)
当计数到TACCR0的时候,产生中断标志位CCIFG;而当TACCR0变为0时,计数器溢出,产生中断标志位AIFG
使用不同中断标志,程序不一样:
/************************
溢出中断,TAIE使能,中断入口也不一样
************************/
//定时初始化
void int_timer(void)
{ //注:宏定义TASSEL_1=TASSEL0
TACCR0=2047;//定时0.5s
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P2OUT ^= 0xff; //P2口输出取反
}
break;
default: break;
}
}
/************************
CCIFG中断,CCIE使能 中断入口也不一样
************************/
//定时初始化

MSP430F149中文资料--部分

MSP430F149中文资料--部分

基于MSP430F149的GPS
(芯片篇)
1、系统功能框图
2芯片资料:
MSP430F149:
低电源电压范围:1.8~3.6V
超低功耗:待机模式:1。

6uA 关闭模式(RAM保持):0。

1uA 活动模式:280uA at 1MHz,2。

2V
5种省电模式
6us内从待机模式唤醒
16位RISC结构,125ns指令周期
带内部参考,采样保持和自动扫描特性的12位A/D转换器
有7个捕获/比较寄存器的16位定时器Timer_B 有3个捕获/比较寄存器的16位定时器Timer_A
片内集成比较器
串行在线编程,无需外部编程电压,安全熔丝可编程代码保护。

器件系列包括:–MSP430F133:8KB+256B闪速存储器,256B的RAM –MSP430F135:16KB+256B闪速存储器,512B的RAM –MSP430F147,MSP430F1471:32KB+256B闪速存储器,1KB的RAM –MSP430F148, MSP430F1481:48KB+256B闪速存储器,2KB的RAM –MSP430F149, MSP430F1491:60KB+256B闪速存储器,2KB的RAM
可用封装:64脚方形扁平封装(QFP).
功能框图。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用msp430实现计数器的功能,在1602第一行显示时钟,第二行显示”***TIMER***”--------------------------------------------------main-------------------------------------------------------#include <msp430x14x.h>#include "Display.h"#include "Common.h"unsigned char sec,min,hour;//定时器A初始化函数void Init_TimerA(){TACTL=TASSEL0+TACLR;//选择ACLK,32768HzTACCTL0=CCIE;CCR0=32768; //1sTACTL |=MC0;//增计数模式}//Init IOvoid Port_Init(){P4SEL = 0x00;P4DIR = 0xFF;P5SEL = 0x00;P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式}void main( void ) //主函数{unsigned char i,*p;WDT_Init();Clock_Init();Port_Init();Init_TimerA();_EINT();Delay_Ms(100);LCD_Init();LCD_Clear();while(1){i=2;p="***TIMER***";LCD_Pos(6);LCD_write_data(':');LCD_Pos(9);LCD_write_data(':');LCD_Writesfm(10,sec);LCD_Writesfm( 7,min);LCD_Writesfm( 4,hour);while(*p){LCD_Writechar(i,1,*p);i++;p++;Delay_Ms(1);}}}/***********定时器A中断服务程序**************/#pragma vector=TIMERA0_VECTOR__interrupt void TimerA_ISR(void){sec++;if(sec==60){min++;sec=0;if(min==60){hour++;min=0;if(hour==24)hour=0;}}}-------------------------------------------------Display.c,要添加到工程中-------------------------------------/****************************************************fun: Display.cfunction:input:ouput:auther:*****************************************************/#include "Display.h"//***********************************************************************// 1602显示屏初始化函数//*********************************************************************** void LCD_Init(void){LCD_write_com(0x38); //显示模式设置Delay_Ms(5);LCD_write_com(0x08); //显示关闭Delay_Ms(5);LCD_write_com(0x01); //显示清屏Delay_Ms(5);LCD_write_com(0x06); //显示光标移动设置Delay_Ms(5);LCD_write_com(0x0C); //显示开及光标设置Delay_Ms(5);}//*********************************************************************** // 1602显示屏清空显示//***********************************************************************void LCD_Clear(void){LCD_write_com(0x01); //清屏幕显示Delay_Ms(5);}//********************************************************************// 1602显示屏命令写入函数//***********************************************************************void LCD_write_com(unsigned char com){RS_CLR;RW_CLR;EN_SET;DataPort = com; //命令写入端口Delay_Ms(5);EN_CLR;}//*********************************************************************** // 1602显示屏数据写入函数//***********************************************************************void LCD_write_data(unsigned char data){RS_SET;RW_CLR;EN_SET;DataPort = data; //数据写入端口Delay_Ms(5);EN_CLR;}//*********************************************************************** // 显示屏字符串写入函数//***********************************************************************void LCD_Writestr(unsigned char x,unsigned char y,unsigned char *s){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}while (*s){LCD_write_data( *s);s ++;}}//*********************************************************************** // 显示屏单字符写入函数//***********************************************************************void LCD_Writechar(unsigned char x,unsigned char y,unsigned char data){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}LCD_write_data( data);}//***********************************************************************// 显示位置函数//***********************************************************************void LCD_Pos(unsigned char pos){LCD_write_com(0x80+pos);}//***********************************************************************// 显示时分秒函数//***********************************************************************void LCD_Writesfm(unsigned char add,unsigned char date){ unsigned char shi,ge;shi=date/10;ge=date%10;LCD_write_com(0x80+add);LCD_write_data(0x30+shi);LCD_write_data(0x30+ge);}----------------------------------------------Display.h,要添加到工程中------------------------------------------#include"Common.h"#define P55 5#define P56 6#define P57 7 //我149的板子是这三个口为控制口,如果要用请根据你板子的电路图修改//对应控制口#define RS_CLR P5OUT &= ~(1 << P55) //RS置低#define RS_SET P5OUT |= (1 << P55) //RS置高#define RW_CLR P5OUT &= ~(1 << P56) //RW置低#define RW_SET P5OUT |= (1 << P56) //RW置高#define EN_CLR P5OUT &= ~(1 << P57) //E置低#define EN_SET P5OUT |= (1 << P57) //E置高#define DataPort P4OUT //P4口为数据口void LCD_Init(void);void LCD_Clear(void);void LCD_write_com(unsigned char com);void LCD_write_data(unsigned char data);void LCD_Writestr(unsigned char x,unsigned char y,unsigned char *s);void LCD_Writechar(unsigned char x,unsigned char y,unsigned char data);void LCD_Writesfm(unsigned char add,unsigned char date);void LCD_Pos(unsigned char pos);-------------------------------------------Common.c,要加到工程中----------------------------------------- #include"Common.h"void Clock_Init(void){uchar i;BCSCTL1&=~XT2OFF; //打开XT2振荡器BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZdo{IFG1&=~OFIFG; //清楚振荡器错误标志for(i=0;i<100;i++)_NOP();}while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待IFG1&=~OFIFG;}void WDT_Init(){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗}------------------------------------Common.h,要加到工程中---------------------------------------------/*********************************************frequency:8MHz*********************************************//****************************************************fun:function: 常用宏定义库,有待扩充input:ouput:auther:*****************************************************/#include <msp430x14x.h>#define CPU_F ((double)8000000)#define Delay_Us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define Delay_Ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define uchar unsigned char#define uint unsigned int#define ulong unsigned longextern void Clock_Init(void);extern void WDT_Init(void);。

相关文档
最新文档