⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main1.c

📁 利用FREE SCALE的DSP56F803编写的AD采集程序
💻 C
字号:
/* adc_1: main.c */
/*   for the comunication of the MCU and DSP*/

#include "adc.h"
#include "port.h"
#include "sci.h"
#include "gpio.h"
#include "bsp.h"
#include "timer.h"
#include "dspfunc.h"
#include "fcntl.h"
#include "arch.h"
#include "pcmasterdrv.h"
#include "spi.h"

/*******************************************************
* Skeleton C main program for use with Embedded SDK
*******************************************************/

void CC_CallBack1(adc_eCallbackType type, adc_tSampleMask causedSampleMask );
static void transhow( float);
static void Timer1ISR();
static void Initialize();
/******************************************************************************/

spi_sParams       SpiParams;
int SerialMaster;

UWord16 Data0=0x01;
UWord16 Data1=0xD0;
UWord16 Data2=0x00;
UWord16 Data3=0x00;


int PortE;
bool b=0;
int  AdcFD;               
int NumberRead;
float ResultAdc=0;
float ResultAdc_show=0,ResultAdc_show1=0,ResultAdc_show2=0;
int a=0;
float ResultAdc_[10]={0,0,0,0,0,0,0,0,0,0};
Frac16 ReadValue;
bool bSatMad;

static const adc_sState sAdc0={
               ADC_CHANNEL_0,
               1,								 /* NumSamplesPerScan   = */
               0, 								 /* OffsetRegister      = */
               0, 								 /* LowLimitRegister    = */
               0x7ff8,  								/* HighLimitRegister   = */
               ADC_ZC_DISABLE,								/* ZeroCross = */  
             };

/***************************************************************************************************/

void main (void)
{
    Initialize();
    
	while(1)
	{
	adcIoctl(AdcFD,ADC_START,0,BSP_DEVICE_NAME_ADC_0);
    asm(nop);
	}
  
 }  


static void Timer1ISR()
{
   
    if(a==10)
    {
      ResultAdc_show1=(ResultAdc_[0]+ResultAdc_[1]+ResultAdc_[2]+ResultAdc_[3]+ResultAdc_[4]+ResultAdc_[5]+ResultAdc_[6]+ResultAdc_[7]+ResultAdc_[8]+ResultAdc_[9])/10;
      ResultAdc_show2= ResultAdc_show1/32768*3.3;           //此句可删可留,留则显示电压值,删则显示所读寄存器的值
   
      transhow(ResultAdc_show2);
      a=0;
    }  
   
    ResultAdc_[a]= ResultAdc;
    a++;

}
  	

static void transhow( float f1)
    { 
        bool bSatMode;
    UWord16 Data0=0x01;
    UWord16 Data1=0xD0;
    UWord16 Data2=0x00;
    UWord16 Data3=0x00;
    int  k1, k2, k3, k4, k5;
    float t1,t2,t3;
   
    if ( ( f1 >= 1e-6 )&& ( f1 < 10 ))
       {
   		 k1 = (int)f1;
   		 t1 = (f1 - k1)*10;
    	 k2 = (int)t1;
    	 t2 = (t1 - k2)*10 ;
   		 k3 = (int)t2;
    	 t3 = (t2-k3)*10;
	     k4 = (int)t3;
         k5 = (t3-k4)*10;
         k2 = k2*16;
         k4 = k4*16;
         Data1 = 0xD0; // this can place the dot after the Bank5 ,eg: 1.2087
         Data1 = Data1 +k1;
         Data2 = Data2 + k2 +k3  ;
         Data3 = Data3 +k4 +k5;
       }
       
      else if ( ( f1 >= 10.0 ) && ( f1 <= 99.999 ))
           {
              t1 = (int)f1;
   		      k1 = (int)(f1/10);
    	      k2 = t1-k1*10;
    	      t2 = (f1-t1)*10;
    	      k3 = (int)t2;
    	 	  t3 = t2*10-k3*10;
	     	  k4 = (int)t3;
         	  k5 = (t3-k4)*10;
         	  k2 = k2*16;
        	  k4 = k4*16;
         	  Data1 = 0xC0; // this can place the dot after the Bank4 ,eg: 12.087
         	  Data1 = Data1 +k1;
         	  Data2 = Data2 + k2 +k3  ;
         	  Data3 = Data3 +k4 +k5;
            }
      
        else if ( ( f1 >= 100.00 ) && ( f1 <= 999.99 ))
         {
              t1 = (int)f1;
   		      k1 = (int)(f1/100);
    	      k2 = (int)((t1-k1*100)/10);
    	      k3 = t1-k1*100-k2*10;
    	 	  t3 = f1-t1;
    	 	  bSatMode = archGetSetSaturationMode(false);
	     	  k4 = (int)(t3*10);
	     	  archGetSetSaturationMode(bSatMode);
         	  k5 = t3*100-k4*10;
         	  k2 = k2*16;
        	  k4 = k4*16;
         	  Data1 = 0xB0; // this can place the dot after the Bank5 ,eg: 120.87
         	  Data1 = Data1 +k1;
         	  Data2 = Data2 + k2 +k3  ;
         	  Data3 = Data3 +k4 +k5;
            }
        else if ( ( f1  >= 1000.0 ) && ( f1 <= 9999.0))
         {
              t1 = (int)f1;
   		      k1 = (int)(f1/1000);
    	      k2 = (int)((t1-k1*1000)/100);
    	      k3 =(int) ((t1-k1*1000-k2*100)/10);
    	 	  k4 = t1-k1*1000-k2*100-k3*10;
         	  k5 = (f1-t1)*10;
         	  k2 = k2*16;
        	  k4 = k4*16;
         	  Data1 = 0xA0; // this can place the dot after the Bank5 ,eg: 1208.7
         	  Data1 = Data1 +k1;
         	  Data2 = Data2 + k2 +k3  ;
         	  Data3 = Data3 +k4 +k5;
            }
        
        else
        
        {
              k1 = (int)(f1/10000);
    	      k2 = (int)(f1/1000-k1*10);
    	      k3 = (int)(f1/100-k1*100-k2*10);
    	 	  k4 = (int)(f1/10-k1*1000-k2*100-k3*10);
         	  k5 = f1-k1*10000-k2*1000-k3*100-k4*10;
         	  k2 = k2*16;
        	  k4 = k4*16;
         	  Data1 = 0x80; // this can place the dot after the Bank5 ,eg: 1208.7
         	  Data1 = Data1 +k1;
         	  Data2 = Data2 + k2 +k3  ;
         	  Data3 = Data3 +k4 +k5;
        } 	  
    
    
    gpioIoctl(PortE, GPIO_CLEAR, gpioPin(E, 6), BSP_DEVICE_NAME_GPIO_E);
    write(SerialMaster,(UWord16 * )(&Data0),sizeof(Data0));
    gpioIoctl(PortE, GPIO_SET, gpioPin(E, 6), BSP_DEVICE_NAME_GPIO_E);
    gpioIoctl(PortE, GPIO_CLEAR, gpioPin(E, 6),BSP_DEVICE_NAME_GPIO_E);
    write(SerialMaster,(UWord16 * )(&Data1),sizeof(Data1));
    write(SerialMaster,(UWord16 * )(&Data2),sizeof(Data2));
    write(SerialMaster,(UWord16 * )(&Data3),sizeof(Data3));
    gpioIoctl(PortE, GPIO_SET , gpioPin(E, 6), BSP_DEVICE_NAME_GPIO_E);
}

   

void CC_CallBack1(adc_eCallbackType type, adc_tSampleMask causedSampleMask )
{
    
   NumberRead=adcRead(AdcFD,&ReadValue,sizeof(ReadValue));
   bSatMad = archGetSetSaturationMode( false);
   ResultAdc = (float)ReadValue;
   archGetSetSaturationMode(bSatMad);
    
}


static void Initialize()
{
  	
	struct sigevent     Timer1Event;
	timer_t Timer1;
    struct itimerspec Timer1Settings; 
	
	SpiParams.pSlaveSelect     = NULL;                       	  /* Set up SPI device */	
	SpiParams.pSlaveDeselect   = NULL;
	SpiParams.bSetAsMaster     = 1;
	SpiParams.TransmissionSize = 0x0007; 
    SerialMaster = open(BSP_DEVICE_NAME_SPI_0, 0,  &SpiParams); 
    ioctl(SerialMaster,SPI_DATA_SHIFT_MSB_FIRST ,NULL);	
    ioctl(SerialMaster,SPI_BAUDRATE_DIVIDER_16,NULL);
    
    PortE = gpioOpen(BSP_DEVICE_NAME_GPIO_E,0); 
    ioctl(PortE, GPIO_SETAS_GPIO, gpioPin(E,6));
    ioctl(PortE, GPIO_SETAS_OUTPUT, gpioPin(E,6));
    gpioIoctl(PortE, GPIO_SET , gpioPin(E, 6), BSP_DEVICE_NAME_GPIO_E);
	  
	   
      
	  Timer1Event.sigev_notify_function = Timer1ISR;
      timer_create(CLOCK_AUX1, &Timer1Event, &Timer1);
      Timer1Settings.it_interval.tv_sec = 0;                         /*  s   */ 
      Timer1Settings.it_interval.tv_nsec =50000000;                  /*  ns  */ 
      Timer1Settings.it_value.tv_sec = 0;
      Timer1Settings.it_value.tv_nsec =50000000;						//50ms
      timer_settime(Timer1, 0, &Timer1Settings, NULL);
       
    AdcFD=adcOpen(BSP_DEVICE_NAME_ADC_0, 0,(adc_sState *)&sAdc0);
}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -