msp430工作笔记3

发布者:ByteChaser最新更新时间:2016-08-23 来源: eefocus关键字:msp430  工作笔记 手机看文章 扫描二维码
随时随地手机看文章
二,MSP430G2553的应用设计

(一),频率计的设计

 1,频率计的实现方法有:测频法,测周法,等精度测频。一般是低频用测周法较准,高频用测频法较准。等精度测频是比较准的。

2,测周法:

(1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。

(2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。

(3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。

3,测频法:

  (1)可以定时一定的时间,然后计算捕获脉冲的个数,从而得出周期。

  (2)把待测信号接到IO脚上,然后用IO的中断功能在一定时间内记录脉冲数。

  (3)设置Timer0_A的时钟为外接时钟TACLK,然后把待测信号接到该时钟上,把Timer0用作计数器,在一定时间内读取TAR寄存器,得出脉冲个数,从而得出频率。

  (4)测频法,使用与测高频信号,对于低频信号误差较大。

4,等精度测频:

 (1)把Timer0_A工作于计数器模式,计数待测信号。然后把Timer1_A的时钟设为ACLK,32768Hz的标准晶振,作为标准信号。然后再外部输入一个控制闸门信号PWM(我觉得也可以用看门狗定时器工作在间隔定时器模式来控制),和待测信号一起通过D触发器控制计数的开始和结束。这个外接的闸门信号可以用555振荡器产生一个周期可调的PWM,这个PWM的周期不需要精确的控制,只有知道大概的范围就可,保证计数器不溢出即可,最终测的精度和它的周期没有绝对的关系。(也可以在计数器溢出时,在溢出中断中记录溢出的次数,这样的话也可以,但是这样中断的进入和退出会对测量精度产生影响)

(2) 如果Timer0_A用于其他用途的话,也可以接一个计数器,然后把计数值在输入给单片机(如小车上测速所采用的方法)。

(3) 目前这个方案还在完善中,但初步试验表示,精度可以达到很高(10的-4以上)

 

 

(二),DAC0832的使用

 1,DAC0832,我们是用在了AGC的电路中,电压输出受控关系为:Vref=Vin*code/256

电路如下:

电设工作小结之——MSP430G2553学习笔记——3

其中0832工作于单缓冲模式,输入寄存器受控,DAC寄存器直通

一个基本的0832控制程序如下:

#include


#define uint unsigned int

#define uchar unsigned char


//dac0832 pin define  0832工作于单缓冲模式,输入寄存器受控,DAC寄存器直通

#define CS_SET P2OUT |= BIT6

#define CS_CLR P2OUT &= ~BIT6       //P26 CS

#define WR_SET P2OUT |= BIT7

#define WR_CLR P2OUT &= ~BIT7     //P27 WR


#define DI P1OUT   //DI


//1延时

//#define CPU_F ((double)16000000)//cpu frequency16000000

#define CPU_F ((double)1000000)//cpu frequency1000000

#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))

 

void write_dac(uint data)    //dac写数据函数

{


CS_CLR;

DI = data;

WR_CLR;

delay_us(1);

WR_SET;   //latch data

CS_SET;

}


void IO_init()

{

P1DIR = 0xff;

    P2DIR |= BIT6+BIT7;    //把P26和P27配置为普通IO 并为输出脚  默认为晶振的输入和输出引脚

    P2SEL &= ~(BIT6+BIT7);

    P2SEL2 &= ~(BIT6+BIT7);


}


void DCO_init()

{

    BCSCTL1 = CALBC1_1MHZ;  //设定cpu时钟DCO频率为16MHz

    DCOCTL = CALDCO_1MHZ;

}


void main(void)

{

// uint adc_data=0;

WDTCTL = WDTPW + WDTHOLD;

IO_init();

DCO_init();

write_dac(0xff);

for(;;)

{

write_dac(0xff);

delay_ms(1);

write_dac(0xc0);

delay_ms(1);

write_dac(0x7f);

delay_ms(1);

write_dac(0x3f);

delay_ms(1);

write_dac(0x00);

delay_ms(1);

}


}


   2,0832还可以用如波形发生,原理是想0832送入不同的code,会根据上面公式输入不同的电压,这样控制不同的输入code和方式的话,就可以得到不同的电压波形输出,我写了一个程序如下:

#include

#include "ser_12864.h"


//dac0832 pin define  0832工作于单缓冲模式,输入寄存器受控,DAC寄存器直通

#define CS_SET P2OUT |= BIT6

#define CS_CLR P2OUT &= ~BIT6       //P26 CS

#define WR_SET P2OUT |= BIT7

#define WR_CLR P2OUT &= ~BIT7     //P27 WR


#define DI P1OUT   //DI


uint key=0;    //按下的按键编号


uchar s_step[]=      {"step      "};

uchar s_sin[] =      {"sin       "};

uchar s_square[]=    {"square    "};

uchar s_saw[]=       {"saw       "};

uchar s_triangular[]={"triangular"};


const uchar sin_a[256]={0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,    //产生正弦波的数组

0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,

0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,

0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,

0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,

0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,

0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,

0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,

0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,

0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,

0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,

0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,

0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,

0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,

0x60,0x63,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c};


void IO_interrupt_init()     //IO中断初始化函数

{

  P2REN |= BIT0+BIT1+BIT2+BIT5;     // pullup 内部上拉电阻使能

  //使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断

  P2OUT = BIT0+BIT1+BIT2+BIT5;   // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来

          //0:下拉,1:上拉


  P2IE |= BIT0+BIT1+BIT2+BIT5;       // interrupt enabled P13中断使能

  P2IES |= BIT0+BIT1+BIT2+BIT5;          // Hi/lo edge  下降沿中断

  //P1IES &= ~BIT3;                         //上升沿触发中断

  P2IFG &= ~(BIT0+BIT1+BIT2+BIT5);         //中断标志位清零


}


void write_dac(uchar data)    //dac写数据函数

{


CS_CLR;

DI = data;

WR_CLR;

delay_us(1);

WR_SET;   //latch data

CS_SET;

}


void saw()      //锯齿波产生函数

{

uchar i=0;

for(i=0;i<255;i++)      //0~255

{

write_dac(i);

}

}


void triangular()   //产生三角波的函数

{

uchar i=0;

for(i=0;i<255;i++)

{

write_dac(i);

}

for(i=255;i>0;i--)

{

write_dac(i);

}

}

 


void square()    //产生方波函数

{

write_dac(0xff);

delay_us(500);

write_dac(0x00);

delay_us(500);

}


void sin()     //正弦波发生函数

{

uchar i;

for(i=0;i<255;i++)

{

write_dac(sin_a[i]);

}

}


void step()   //阶梯波发生函数

{

write_dac(0xff);

delay_us(500);

write_dac(0xc0);

delay_us(500);

write_dac(0x7f);

delay_us(500);

write_dac(0x3f);

delay_us(500);

write_dac(0x00);

delay_us(500);

}


void main(void)

   {

WDTCTL = WDTPW + WDTHOLD;             // Stop WDT


uchar s1[] ={"  wave_shaper "};

    uchar s2[] ={"13_sin 14_square"};

    uchar s3[] ={"15_tri 16_saw"};

    uchar s4[] ={"key:"};

 

    BCSCTL1 = CALBC1_12MHZ;  //设定CPU时钟DCO频率为12MHz

    DCOCTL = CALDCO_12MHZ;


    P2DIR |=BIT3+BIT4;      //液晶的两条线


    P1DIR = 0xff;   //0832的数据位


    P2DIR |= BIT6+BIT7;    //把P26和P27配置为普通IO 并为输出脚  默认为晶振的输入和输出引脚 作为dac0832的

    P2SEL &= ~(BIT6+BIT7);   //cs和wr控制端

    P2SEL2 &= ~(BIT6+BIT7);


    init_lcd();     //初始化LCD


    IO_interrupt_init();


      wr_string(0,0,s1);      //第一行第一个位置显示s1

      wr_string(0,1,s2);      //第二行第一个位置显示s2

      wr_string(0,2,s3);     //第三行第一个位置显示s3

      wr_string(0,3,s4);      //第四行第一个位置显示s4


      wr_int(2,3,key);    //显示按键按下次数

      wr_string(5,3,s_step);


      _EINT();      //enable interrupt


      for(;;)

      {

       if(key==13)

       {

        sin();

       }

       else if(key==14)

       {

       square();

       }

       else if(key==15)

       {

       triangular();

       }

       else if(key==16)

       {

       saw();

       }

       else

       {

       step();

       }


      }

//   _BIS_SR(LPM4_bits + GIE);                 // Enter LPM4 w/interrupt 进入低功耗模式4


}

 

// Port 2 interrupt service routine

#pragma vector=PORT2_VECTOR

__interrupt void Port_1(void)

{

  _DINT();     //关中断


  P2DIR &= ~(BIT0+BIT1+BIT2+BIT5); //在中断设为输入,用于消抖   因为IO脚默认为输入,所以这句话不要也行,但是

  //最好加上使程序清晰

  delay_ms(5);     //延迟5ms,消抖  延迟5ms 10ms都行

  if((P2IN&BIT0)==0)   //如果为低,即按键真的按下了    因为是下降沿触发中断,所以要检测是否为低

  {

     key=13;

     wr_string(5,3,s_sin);

  }

  else if((P2IN&BIT1)==0)   //如果P13为低,即按键真的按下了    因为是下降沿触发中断,所以要检测是否为低

  {

     key=14;

     wr_string(5,3,s_square);

  }

  else if((P2IN&BIT2)==0)   //如果P13为低,即按键真的按下了    因为是下降沿触发中断,所以要检测是否为低

  {

     key=15;

     wr_string(5,3,s_triangular);

  }

  else if((P2IN&BIT5)==0)   //如果P13为低,即按键真的按下了    因为是下降沿触发中断,所以要检测是否为低

  {

     key=16;

     wr_string(5,3,s_saw);

  }


  wr_int(2,3,key);    //显示按键按下次数


  P2IFG &= ~(BIT0+BIT1+BIT2+BIT5);      // P1.3 IFG cleared  软件清除中断标志位

  _EINT();    //开中断

}


//由于按键较少,所以这里各种波形的各个参数都是提前设定好的,不能再设定,

//应该可以在IO中断里利用中断嵌套,再次检测按键来设置参数,频率,占空比....,还没有完善

关键字:msp430  工作笔记 引用地址:msp430工作笔记3

上一篇:msp430工作笔记4
下一篇:msp430工作笔记二

推荐阅读最新更新时间:2024-03-16 15:06

MSP430教程:MSP430单片机ADC12模块
MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,他具有高速度,通用性等个性。大局部都内置了ADC模块.而有些不带ADC模块的片子,也可穿越利用内置的模仿比拟器来告终AD的转换。在系列产品中,我们能够穿越以下列表来容易地认识他们的ADC功能告终。 系列型号ADC功能告终转换精度 MSP430X1XX2比拟器告终10位 MSP430F13XADC模块12位 MSP430F14XADC模块12位 MSP430F43XADC模块12位 MSP430F44XADC模块12位 MSP430X32XADC模块14位 从以下ADC12构造图中能够看出,ADC12模块中是由以下局部构成:输入的16
[单片机]
用超低功耗MSP430单片机设计数据采集系统
1 MSP430单片机简介 MSP430 是TI公司近几年推出的16位系列单片机,其最早是面向于驱动LED显示的应用设计,由于极好的应用效果和很大的市场潜力,TI很快将其发展为通用单片机。现已有X1XX、X3XX、X4XX几个系列,并且还在不断的发展。MSP430作为一种新型的单片机,采用了TI公司最新的低功耗技术,使其在众多的单片机中独树一帜。MSP430工作在1.8~3.6V电压下,有正常工作模式(AM)和4种低功耗工作模式(LPM1、LPM2、LPM3、 LPM4),在电源电压为3V时,各种模式的工作电流分别为 AM:340uA、LPM1:70uA、LPM2:17uA、LPM3:2uA、LPM4:0.1uA。单片机可以方
[单片机]
用超低功耗<font color='red'>MSP430</font>单片机设计数据采集系统
解读MSP430F2274单片机设计的倒车雷达系统电路
  随着人们对汽车辅助驾驶系统智能化要求的提高和 汽车电子 系统的网络化发展,新型的倒车雷达应能够连续测距并显示障碍物距离,并具有通信功能,能够把数据发送到汽车总线上去。以往的倒车雷达设计使用的元器件较多,功能也较简单。本文介绍的基于新型高性能超低功耗单片机MSP430F2274的倒车雷达可以弥补以往产品的不足。   系统采用超声波测距原理。超声波测距仪器一般由发射器、接收器和信号处理器三部分组成。工作时,超声波发射器发出超声波脉冲,超声波接收器接收遇到障碍物反射回来的反射波,准确测量超声波从发射到遇到障碍物反射返回的时间,根据超声波的传播速度,可以计算出障碍物距离。作为一种非接触式的检测方式,超声波具有空气传播衰减小、反射能力和穿
[单片机]
解读<font color='red'>MSP430</font>F2274单片机设计的倒车雷达系统电路
MSP430 定时器输出PWM波形
硬件介绍: MSP430系列单片机的TimerA结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电表和手持式仪表的理想配置。它给开发人员提供了较多灵活的选择余地。当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM,而不需利用中断维持PWM输出。 MSP430F16x和MSP430F14x单片机内部均含有两个定时器,TA和TB;TA有三个模块,CCR0-CCR2;TB含有CCR0-CCR67个模块;其中CCR0模块不能完整的输出PWM波形(只有三种输出模式可用);TA可以输出完整的2路PWM波形;TB可以输出6路完整的PWM波形。 定时器的PWM输出有有8种模式: 输出模式0 输出模式:输出信号OUTx由
[单片机]
<font color='red'>MSP430</font> 定时器输出PWM波形
CAN总线与MSP430红外检测系统电路
  本文介绍的是一种新的检测系统,选用红外CO传感器和MSP430单片机作为核心信号处理电路,结合数字滤波、温度补偿运算.具有检测浓度范围宽、使用寿命长等优点。   系统组成及硬件设计   该系统由红外CO气体传感器、MSP430单片机、CAN总线接口及远程监控系统组成。该系统在检测现场通过单片机处理检测的数据、控制 LCD显示、声光报警,同时还配备CAN总线控制器,可以轻松获取浓度、温度以及报警记录等相关信息,实现了智能化的工业现场、远程同时监控功能。系统的组成框图如图1所示。      CAN总线接口设计   该系统CAN接口由独立的CAN总线控制器SJA1000、CAN数据收发器TJA1050组成。SJA1000是独立
[单片机]
CAN总线与<font color='red'>MSP430</font>红外检测系统电路
MSP430F149的串口RS485接口
一、简述 RS485通信基本原理和使用方法同RS232,不同点如下。 RS232接口只能实现点对点的通信方式,但这种方式不能实现联网功能,便出现了RS485解决了这个问题。RS485采用差分信号负逻辑,+2V~+6V表示“1”,- 6V~- 2V表示“0”。双机通信时只需A-A,B-B连接。 硬件电路一般采用SN65176等RS485电平转换芯片。与MCU相连时有三个引脚:DE(RE同DE连在一起),DI(接受引脚),RO(发送引脚)。MCU发送一帧信号时,要先使能DE=1;接收信号前要先使能DE=0(即RE=0)。 二、实例 2.1 发送字符8.N.1.2400 #define DRE_out P3DIR
[单片机]
使用MSP430G2 LaunchPad开发板连接步进电机的方法
在本篇文章中,我们将介绍如何使用MSP430 LaunchPad开发板连接一个步进电机。 MSP-EXP430G2是德州仪器(TI)提供的开发工具,又名LaunchPad,用于学习和练习如何使用他们提供的微控制器。该开发板属于MSP430产品线,我们可以使用它对所有MSP430系列微控制器进行编程。如果您是MSP430的新手,请查看MSP430 LaunchPad的入门教程。 所需的材料 ● MSP430 LaunchPad开发板 ● 35BYJ46或28-BYJ48步进电机 ● ULN2003驱动芯片 ● 连接导线 ● 面包板 步进电机 步进电机是一种无刷直流电机,可将电脉冲转换为不同的机械运动。步进电机的轴以
[单片机]
使用<font color='red'>MSP430</font>G2 LaunchPad开发板连接步进电机的方法
基于MSP430F169的深海环境数据采集系统设计
海洋占地球表面的71%,是各国分别占有和世界共有的。世界海洋中有2.5亿平方千米公海和国际海底区域,其中有丰富的共有海洋资源。海洋是富饶而未充分开发的资源宝库。随着陆地战略资源的日益短缺,沿海各国不断加大向海洋索取资源的力度和强度。因此,开发一种可采集深海环境信息的设备,对深入开发海洋资源,具有极其重要的作用。已有的深海环境信息采集系统有采样精度低、功耗大等缺点,无法长期在水下工作,不适于深海勘探。本文提出的深海环境数据采集系统可用于4 000 m深海环境,不仅能对温度、压力、盐度等信息进行采集,还可以自动存储到Flash中,并上传到上位机进行显示、分析。该系统具有精度高、功耗低等优点,一次充电可工作一年左右,非常适合深海探测。
[测试测量]
基于<font color='red'>MSP430</font>F169的深海环境数据采集系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved