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

📄 adc.c

📁 430的SD16模块扩展到20bit采样精度的范例
💻 C
字号:
#include <MSP430X42X.h>
#include "SysConfig.h"
#include "Global.h"
#define Analog_PWRON   P2OUT|= BIT2
#define Analog_PWROFF  P2OUT&=!BIT2
unsigned char ADCFlag0=0;
unsigned char ADCFlag1=0;

void ADC_Init()
{

#if (OUT_MODE==FREQ)
  SD16CTL=SD16DIV_3+SD16SSEL_0;
#else
  SD16CTL=SD16DIV_2+SD16SSEL_0;
#endif
  SD16INCTL0 = SD16GAIN_1 + SD16INCH_0;          // 1x gain, channel pair0
  SD16CCTL0 = SD16DF+SD16IE;                   // Continuous conv., 2s compl. 
  SD16INCTL1 = SD16GAIN_1 + SD16INCH_1;          // 1x gain, channel pair1
  SD16CCTL1 = SD16DF+SD16SNGL ;//+ SD16IE;                   // Continuous conv., 2s compl. 
}

#pragma vector = SD16_VECTOR
__interrupt void SD16_ISR(void)
{
  if ((SD16CCTL0 & SD16IFG)) ADCFlag0=1;
  if ((SD16CCTL1 & SD16IFG)) ADCFlag1=1; 
  SD16CCTL0 &=~ SD16IFG; 
  SD16CCTL0 &=~ SD16OVIFG;   
  SD16CCTL1 &=~ SD16IFG; 
  SD16CCTL1 &=~ SD16OVIFG;     
   __low_power_mode_off_on_exit();
}

long int ADC_MeasureInput()
{
 long int var,sum=0;
 unsigned int i;
  SD16CCTL0 |= SD16SC;
 for(i=0;i<128;i++)
 {
  while(1)
  {
    if(ADCFlag0) break;
    LPM0;
  }
  ADCFlag0=0;
  SD16CCTL0 &= ~SD16LSBACC; 
  var = (long)(int)SD16MEM0 << 6; 
  SD16CCTL0 |= SD16LSBACC; 
  var |= ((int)SD16MEM0 & 0xFC) >> 2;
  sum+=var;
 }
  SD16CCTL0 &=~SD16SC;
  return(sum/128);       //光电测试技术 朴少光
}

long int ADC_MeasureInput_AVE()
{
 long int var;
 long long int sum=0;
 unsigned int i;
  SD16CCTL0 |= SD16SC;
 for(i=0;i<2048;i++)
 {
  while(1)
  {
    if(ADCFlag0) break;
    LPM0;
  }
  ADCFlag0=0;
  SD16CCTL0 &= ~SD16LSBACC; 
  var = (long)(int)SD16MEM0 << 6; 
  SD16CCTL0 |= SD16LSBACC; 
  var |= ((int)SD16MEM0 & 0xFC) >> 2;
  sum+=var;
 }
  SD16CCTL0 &=~SD16SC;
  return(sum/2048);       //光电测试技术 朴少光
}

int ADC_MeasureBattery()
{
 int BattVal;
 SD16CCTL1 |= SD16SC;
 while((SD16CCTL1 & SD16IFG)==0);
 BattVal=(int)SD16MEM1;
 if(BattVal>(BATT_FULL*655360)/(VOL_REF*11)) return(3) ;
 if(BattVal>(BATT_2*655360)/(VOL_REF*11)) return(2) ;
 if(BattVal>(BATT_1*655360)/(VOL_REF*11)) return(1) ;
 return(0) ; 
}

void ADC_Measure()
{
  Analog_PWRON;
  Batt_Level=ADC_MeasureBattery();
  Batt_Level=ADC_MeasureBattery();
  InputValue=ADC_MeasureInput(); 
  Analog_PWROFF;  
}

⌨️ 快捷键说明

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