身份证中提取性别:LM3S1138作为下位机,用于电压采集、脉冲发生、电流采集、频率测量、脉冲测量等

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 16:20:04
  
转载

这几天培训结束了,在这边也是闲的无聊,就是在电脑边上打发打发时间,坐等下班。哎这样的日子真无聊,今天接到通知,好像内部的培训还要到5月。。我猜怎么着也要到内部培训结束才给定岗。没事干,摆弄摆弄自己的板子,随便搞一搞,用LM3S1138作为下位机,用于电压采集、脉冲发生、电流采集、频率测量、脉冲测量等。        

#include  "systemInit.h"
#include  "uartGetPut.h"
#include 
#include 
#include 
#include 

#define  PART_LM3S1138
#include 

#define  ADCSequEnable          ADCSequenceEnable
#define  ADCSequDisable         ADCSequenceDisable
#define  ADCSequConfig          ADCSequenceConfigure
#define  ADCSequStepConfig      ADCSequenceStepConfigure
#define  ADCSequDataGet         ADCSequenceDataGet

volatile tBoolean ADC_EndFlag = false;                         //  定义ADC转换结束的标志

volatile tBoolean CAP_Flag = false;                            //  定义捕获标志

unsigned char function,Per,Frequence,num,init_time,second;

unsigned char received_data[3];

unsigned long Time;

volatile unsigned char Channel;

char cc[10];

//  ADC初始化
void adcInit(void)
{

    SysCtlPeriEnable(SYSCTL_PERIPH_ADC);                    //  使能ADC模块
    SysCtlADCSpeedSet(SYSCTL_ADCSPEED_1MSPS);               //  设置ADC采样速率
    ADCSequDisable(ADC_BASE, 0);                            //  配置前先禁止采样序列

    //  采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
    ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);

    //  采样步进设置:ADC基址,采样序列编号,步值,通道设置
    ADCSequStepConfig(ADC_BASE, 0, 0, Channel |
                                      ADC_CTL_END |
                                      ADC_CTL_IE);

    ADCIntEnable(ADC_BASE, 0);                              //  使能ADC中断
    IntEnable(INT_ADC0);                                    //  使能ADC采样序列中断
    IntMasterEnable();                                      //  使能处理器中断

    ADCSequEnable(ADC_BASE, 0);                             //  使能采样序列
}


//  ADC采样
void adcSample(void)
{  
    unsigned long ulVal;
    unsigned long ulValue;
    char cBuf[10];
    ADCProcessorTrigger(ADC_BASE, 0);                       //  处理器触发采样序列
    while (!ADC_EndFlag);                                   //  等待采样结束
    ADC_EndFlag = false;                                    //  清除ADC采样结束标志
    ADCSequDataGet(ADC_BASE, 0, &ulValue);                  //  读取ADC转换结果
    ulVal = (ulValue * 3000) / 1024;                        //  转换成电压值(mv)
    sprintf(cBuf, "%ld", ulVal);                            //  输出格式化
    uartPuts(cBuf);                                         //  通过UART显示结果
}

 

//  在CCP1管脚产生1KHz方波(N=10,K=2),为Timer2的16位输入边沿定时捕获功能提供时钟源
void pulseInit(unsigned char N,unsigned char K)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0);                 //  使能TIMER0模块
    SysCtlPeriEnable(CCP1_PERIPH);                          //  使能CCP1所在的GPIO端口
    GPIOPinTypeTimer(CCP1_PORT, CCP1_PIN);                  //  配置相关管脚为Timer功能

    TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |     //  配置TimerB为16位PWM
                                TIMER_CFG_B_PWM);

    TimerLoadSet(TIMER0_BASE, TIMER_B, 60000/N);            //  设置TimerB初值
    TimerMatchSet(TIMER0_BASE, TIMER_B, (60000/N)/K);       //  设置TimerB匹配值
   
    TimerEnable(TIMER0_BASE, TIMER_B);
  
}


//  定时器16位输入边沿计数捕获功能初始化
void timerInitCapCount(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1);                 //  使能Timer模块
    SysCtlPeriEnable(CCP2_PERIPH);                          //  使能CCP2所在的GPIO端口
    GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN);                  //  配置CCP2管脚为脉冲输入

    TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR |     //  配置Timer为16位事件计数器
                                TIMER_CFG_A_CAP_COUNT);

    TimerControlEvent(TIMER1_BASE,                          //  控制TimerA捕获CCP负边沿
                      TIMER_A,
                      TIMER_EVENT_NEG_EDGE);

    TimerLoadSet(TIMER1_BASE, TIMER_A, 40000);              //  设置计数器初值
    TimerMatchSet(TIMER1_BASE, TIMER_A, 0);                 //  设置事件计数匹配值

    TimerIntEnable(TIMER1_BASE, TIMER_CAPA_MATCH);          //  使能TimerA捕获匹配中断
    IntEnable(INT_TIMER1A);                                 //  使能Timer中断
    IntMasterEnable();                                      //  使能处理器中断

}

 

//  定时器16位输入边沿定时捕获功能初始化
void timerInitCapTime(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER2);                 //  使能Timer模块
    SysCtlPeriEnable(CCP4_PERIPH);                          //  使能CCP4所在的GPIO端口
    GPIOPinTypeTimer(CCP4_PORT, CCP4_PIN);                  //  配置CCP4管脚为脉冲输入

    TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR |     //  配置Timer为16位事件定时器
                                TIMER_CFG_A_CAP_TIME);

    TimerControlEvent(TIMER2_BASE,                          //  控制TimerA捕获CCP正边沿
                      TIMER_A,
                      TIMER_EVENT_POS_EDGE);

    TimerControlStall(TIMER2_BASE, TIMER_A, true);          //  允许在调试时暂停定时器计数
    TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT);          //  使能TimerA事件捕获中断
    IntEnable(INT_TIMER2A);                                 //  使能TimerA中断
    IntMasterEnable();                                      //  使能处理器中断
}

 

//  测量输入脉冲频率并显示
void pulseMeasure(void)
{
    unsigned short i;
    unsigned short usVal[2];
    char s[10];

    TimerLoadSet(TIMER2_BASE, TIMER_A, 0xFFFF);             //  设置计数器初值
    TimerEnable(TIMER2_BASE, TIMER_A);                      //  使能Timer计数

    for (i = 0;  i < 2;  i++)
    {
        while (!CAP_Flag);                                  //  等待捕获输入脉冲

        CAP_Flag = false;                                   //  清除捕获标志
        usVal[i] = TimerValueGet(TIMER2_BASE, TIMER_A);     //  读取捕获值
    }

    TimerDisable(TIMER2_BASE, TIMER_A);                     //  禁止Timer计数
    sprintf(s, "%d", 6000000/(usVal[0] - usVal[1]));        //  输出测定的脉冲频率
    uartPuts(s);
}


//  主函数(程序入口)
int main(void)
{
    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:晶振,6MHz
    //adcInit();
    uartInit();                                             //  UART初始化
    timerInitCapTime();                                     //  Timer初始化:16位定时捕获
  
    timerInitCapCount();
    
    IntPrioritySet(INT_UART2, 0xff);                        //  设置Uart2中断优先级
    //IntPrioritySet(INT_TIMER2A, 0xcf);                    //  设置Timer2A中断优先级  
    //IntPrioritySet(INT_ADC0, 0xaf);                       //  设置ADC0中断优先级  
    pulseInit(10,2);

    for (;;)
    {
  
     if( function==0x00)
     {
       pulseMeasure();
       SysCtlDelay(1500 * (TheSysClock / 3000));
     }
    
     if( function==0x01)
     {
       adcInit();
       adcSample();
       SysCtlDelay(1500 * (TheSysClock / 3000));
     }
    
     if( function==0x02)
     {
        pulseInit(Frequence,Per);
     }
    
      if( function==0x03)
     {
       adcInit();
       adcSample();
       SysCtlDelay(1500 * (TheSysClock / 3000));
     }
   
    
     if( function==0x04)
     { 
        TimerEnable(TIMER1_BASE, TIMER_A);                   //  使能Timer计数
     
        SysCtlDelay(second* (TheSysClock / 3));              //  延时stick 秒
     
        TimerDisable(TIMER1_BASE, TIMER_A);
      
        Time = 40000*init_time+(39999-TimerValueGet(TIMER1_BASE, TIMER_A));    //  获取当前的Timer计数值
     
        sprintf(cc, "%ld", Time);                            //  输出格式化
        uartPuts(cc);                                        //  通过UART显示结果
        TimerLoadSet(TIMER1_BASE, TIMER_A, 40000);           //  重新设置计数器初值
        init_time=0;
     }
    
      if( function==0x0A)
     {
      
     }
  }
}


//  Timer2的中断服务函数
void Timer2A_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = TimerIntStatus(TIMER2_BASE, true);           //  读取当前中断状态
    TimerIntClear(TIMER2_BASE, ulStatus);                   //  清除中断状态,重要!

    if (ulStatus & TIMER_CAPA_EVENT)                        //  若是TimerA事件捕获中断
    {
        CAP_Flag = true;                                    //  置位捕获标志
    }
}

//  ADC采样序列0的中断
void ADC_Sequence_0_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = ADCIntStatus(ADC_BASE, 0, true);             //  读取中断状态
    ADCIntClear(ADC_BASE, 0);                               //  清除中断状态,重要

    if (ulStatus != 0)                                      //  如果中断状态有效
    {
        ADC_EndFlag = true;                                 //  置位ADC采样结束标志
    }
}


// UART2中断服务函数
void UART2_ISR(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART2_BASE, true);                // 读取当前中断状态
UARTIntClear(UART2_BASE, ulStatus);                        // 清除中断状态

if((ulStatus & UART_INT_RT)||(ulStatus & UART_INT_RX))     // 若是接收中断
{
  received_data[num] = UARTCharNonBlockingGet(UART2_BASE);
  num++;
  if(num==3)
  {
    num=0;
    function=received_data[0];
   
    if(function==0x01)
    {
      switch(received_data[1])      //采用received_data[1]数据配置电压采集通道
      {
       
        case 1:
        Channel=ADC_CTL_CH0;
        break;

        case 2:
        Channel=ADC_CTL_CH1;
        break;

        case 3:
        Channel=ADC_CTL_CH2;
        break;

        case 4:
        Channel=ADC_CTL_CH3;
        break;

        case 5:
        Channel=ADC_CTL_CH4;
        break;

        case 6:
        Channel=ADC_CTL_CH5;
        break;

        case 7:
        Channel=ADC_CTL_CH6;
        break;
      }
     
    }
   
      if(function==0x02)
    {
      Frequence=received_data[1];
      Per=received_data[2];
    }
   
     if(function==0x03)
    {
      Channel=ADC_CTL_CH7;        //采用通道八作为电流固定采集端
    }
   
   
    if(function==0x04)
    {
      second=received_data[1];   //采用received_data[1]作为计数间隔时间 
    }
  }
}
}

//  Timer2的中断服务函数
void Timer1A_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = TimerIntStatus(TIMER1_BASE, true);           //  读取当前中断状态
    TimerIntClear(TIMER1_BASE, ulStatus);                   //  清除中断状态,重要!

    if (ulStatus & TIMER_CAPA_MATCH)                        //  若是TimerA捕获匹配中断
    {
        init_time++;
        TimerLoadSet(TIMER1_BASE, TIMER_A, 40000);          //  重新设置计数器初值
        TimerEnable(TIMER1_BASE, TIMER_A);                  //  TimerA已停止,重新使能
    }
}