打印

MSP430F149定时数据采集程序

[复制链接]
735|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dirtwillfly|  楼主 | 2016-2-1 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 Operation

unsigned 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为模拟输入A7                 
    ADC12CTL0 &= ~(ENC);        //设置ENC为0,从而可以修改ADC12寄存器的值        
    ADC12CTL0 += ADC12ON+MSH;   //开A/D转换,允许多次采样
    ADC12MCTL7 = EOS+INCH_7;//ADC12MCTL7的输入通道为A7,参考电压分别为AVSS和AVCC         
    ADC12CTL1 = 0X00;           //转换的起始地址为:ADCMEM7
    ADC12CTL1 = CSTARTADD0+CSTARTADD1+CSTARTADD2;
    ADC12CTL1 += SHP;              //采样脉冲来自采样定时器
    ADC12CTL1 += CONSEQ_2;      //单通道多次转换
    ADC12CTL1 += ADC12SSEL0;    //ADC12内核时钟源为ACLK

    ADC12IE = 0x00;             //关闭各个通道的转换中断                  
   
    ADC12CTL0 |= ENC;              //使能ADC转换            
    return;
}

void Init_TimerA(void)
{
     
    TACTL = TASSEL0 + TACLR;    // 选择ACLK:32K,清除TAR
     
    TACTL +=ID1;                // 1/8 SMCLK                  
    TACTL +=ID0;      
    CCTL0 = CCIE;               // CCR0 中断允许
     
    CCR0 = 2000;                // 时间间隔为 0.5S
     
    TACTL |= MC0;              // 增记数模式            
    return;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;             //将寄存器的内容清零
                        //XT2震荡器开启
                        //LFTX1工作在低频模式
                        //ACLK的分频因子为1
                             
    do
    {
     IFG1 &= ~OFIFG;                       // 清除OSCFault标志
     for (i = 0x20; i > 0; i--);               
    }
    while ((IFG1 & OFIFG) == OFIFG);          // 如果OSCFault =1   
                             
     BCSCTL2 = 0X00;            //将寄存器的内容清零
     BCSCTL2 += SELM1;            //MCLK的时钟源为TX2CLK,分频因子为1
     BCSCTL2 += 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)
    {   }
} file:///C:\Users\DIY\AppData\Local\Temp\ksohtml\wps87A8.tmp.jpg

相关帖子

沙发
dirtwillfly|  楼主 | 2016-2-1 20:51 | 只看该作者
MSP430F149定时数据采集程序.rar (6.83 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1180

主题

34793

帖子

1116

粉丝