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

📄 ad.c

📁 使用MC9S12DG128芯片
💻 C
字号:
//AD
#include "includes.h"

INT16U DataAD[8];

 
INT8U *pAdValue;
  
INT8U ADValue[3];

//INT32U Temp1;

/********************************************************************************/
void ACD_Func(void) {
     
     INT8U  LcdAD[] = {"Entering The ACD Operation Mode "};
     
     LcdWriteAll(LcdAD);
     
     InitADC0();
     
     for(;;){
           
     while (KeyFlag == ON) {
        
         KeyFlag = OFF;
        
        if (ValueKey == Enter){DataAD[0] = ReadADC0(0);} 
        
        else if (ValueKey == Exit) return;    //if have exit key,go back
        
       }
      
     }
     
     /*InitADC();
     
     for(;;) {
      
      LcdWriteAll(LcdAD);        //display PWM menu
      
      while (KeyFlag == ON) {
        
         KeyFlag = OFF;
        
        if (ValueKey == Enter){DisplayAdData();} 
        
        else if (ValueKey == Exit) return;    //if have exit key,go back
        
       }
    }*/ 
}
     
/******************************************************************************/
/*void DisplayAdData() {
  
   INT8U LcdADData[] = {"1, .  v 2, .  v 3, .  v 4, .  v 5, .  v 6, .  v 7, .  v 8, .  v "};
   INT8U flag = ON;
   
   INT8U *pAdValue;
   
   INT8U i,j=2,k=2;
   
       
  while (flag == ON){
  
      LcdWriteAll(&LcdADData[k-2]);
     
      ReadSequenceADC01(Channel0);
     
      for(i=0;i<4;i++) {
     
          pAdValue = ADVoltage((INT32U)DataAD[(k-2)/8+i]);
     
          LcdADData[j] = (*pAdValue++ + 0x30);
     
          LcdADData[j+2] = (*pAdValue++ + 0x30);
     
          LcdADData[j+3] = (*pAdValue + 0x30);
     
          j += 8;
      
      }
     
      while (KeyFlag == ON) {
      
          KeyFlag = OFF;
      
          if (ValueKey == Exit) {flag = OFF;} 
      
          else if (ValueKey == Up) {if(k>2) k -= 16;} 
          
          else if (ValueKey == Down) {if (k<34) k+= 16;}
        
        }
        
       j = k;
        
        
  }
}  */
/*****************************************************************************
将AD转换所得的数化成电压值,小数点后两位
 *****************************************************************************/
INT8U *ADVoltage(INT32U ADData) {

  
  INT32U Temp1;
  
  Temp1 = (ADData*500/1024);
  
  Temp1 = ADData; 
  
  ADValue[0] = (Temp1/100);
  
  ADValue[1] = ((Temp1-ADValue[0]*100)/10);
  
  ADValue[2] = (Temp1-ADValue[0]*100-ADValue[1]*10);
  
  pAdValue = ADValue;
  
  return (pAdValue);
  
}  

/******************************************************************************
初始化AD模块:持续发送,多通道
*******************************************************************************/
/*void InitADC0(void)
{
  
  ATD0CTL2 = (ATD0CTL2_ADPU_MASK+ ATD0CTL2_AFFC_MASK //+ ATD0CTL2_ASCIE
  );
    
  //ATD0CTL3 = 0x08; //决定转换序列中有多少个通道使用
  
  ATD0CTL4 = 0x01;
  
}  */ 
/*******************************************************************************/
/*void InitADC1(void) {
  
   ATD1CTL2 = (ATD1CTL2_ADPU_MASK + ATD1CTL2_AFFC_MASK //+ ATD1CTL2_ASCIE
  );
    
  //ATD1CTL3 = 0x08; //决定转换序列中有多少个通道使用
  
  ATD1CTL4 = 0x01;

} */
/********************************************************************************
持续发送,多通道,两个模块
*********************************************************************************/
/*void ReadSequenceADC01(INT8U channel){
  
  INT8U i ;
  
  ATD0CTL5 = (ATD0CTL5_DJM_MASK    //向右对齐 
  + ATD0CTL5_SCAN_MASK             //连续模式
  + ATD0CTL5_MULT_MASK + channel); //多通道
  
  ATD1CTL5 = (ATD1CTL5_DJM_MASK    //向右对齐 
  + ATD1CTL5_SCAN_MASK             //连续模式
  + ATD1CTL5_MULT_MASK + channel); //多通道
  
  
  for (i=0;i<8;i++) {
   
   DataAD[i] = 0;
  
  }
  
  
  for (i=0;i<8;i++){
    
  while(((ATD0STAT0 & ATD0STAT0_SCF_MASK)==0)||((ATD1STAT0 & ATD1STAT0_SCF_MASK)==0)){};   //判断一个序列是否全部转换完毕
  
  DataAD[0] += ATD0DR0;
  
  DataAD[1] += ATD0DR1;
  
  DataAD[2] += ATD0DR2;
  
  DataAD[3] += ATD0DR3;
  
  DataAD[4] += ATD1DR0;
  
  DataAD[5] += ATD1DR1;
  
  DataAD[6] += ATD1DR2;
  
  DataAD[7] += ATD1DR3; 
  
  }
  
  for (i=0;i<8;i++) {
    
    DataAD[i] = DataAD[i] / 8 ;
  
  }
  
  ATD0CTL5_SCAN = 0;
  
  ATD1CTL5_SCAN = 0;
  

} */




/******************************************************************************
AD 转换模块
在芯片中有两套同样地8路10位AD模块,共16路
初始化 AD 转换模块0 
PS:必须初始化,再取值否则将陷入死循环
******************************************************************************/


void InitADC0(void){
	ATD0CTL2 = 0x80; // enable ADC
	// bit 7 ADPU=1 设置功率提升
	// bit 6 AFFC=0 ATD Fast Flag Clear All
	// bit 5 AWAI=0 ATD Power Down in Wait Mode
	// bit 4 ETRIGLE=0 External Trigger Level/Edge Control
	// bit 3 ETRIGP=0 External Trigger Polarity
	// bit 2 ETRIGE=0 External Trigger Mode Enable
	// bit 1 ASCIE=0 ATD Sequence Complete Interrupt Enable
	// bit 0 ASCIF=0 ATD Sequence Complete Interrupt Flag

  

	ATD0CTL4 = 0x01; // configure conversion
	// bit 7 SRES8=0 A/D Resolution Select
	//             1 = 8 bit resolution(8位AD)
	//             0 = 10 bit resolution(10位AD)
	// bit 6 SMP1=0 Sample Time Select 
	// bit 5 SMP0=0 2 clock period
	// bit 4 PRS4=0 ATD Clock Prescaler divide by 12
	// bit 3 PRS3=0 ATD Clock Prescaler
	// bit 2 PRS2=1 ATD Clock Prescaler
	// bit 1 PRS1=0 ATD Clock Prescaler
	// bit 0 PRS0=1 ATD Clock Prescaler
}  

/******************************************************************************
 初始化 AD 转换模块1, 基本同上
 *****************************************************************************/
 
void InitADC1(void){
	ATD1CTL2 = 0x80; 
	ATD1CTL4 = 0x01; 
} 

/******************************************************************************
读取某一通道AD数据 
从第一套AD中读值,PAD0/AN0 ~ PAD7/AN7
输入:channel -> 通道0 <= channel <= 7
******************************************************************************/
INT16U ReadADC0(INT8U channel){
	ATD0CTL5 = 	ATD0CTL5_DJM_MASK +  //数据右对齐
				(ATD0CTL5_Cx_MASK & channel); // 防止出错  
	// 等待CCF0 ,即转换完成, 经计算此转换要在使 while 循环31次
	while((ATD0STAT1&0x01)==0){};
	return ATD0DR0; 
} 

/*****************************************************************************
从第二套AD中读值,PAD8/AN8 ~ PAD15/AN15
输入:channel -> 通道0 <= channel <= 7
*****************************************************************************/
INT16U ReadADC1(INT8U channel){
	ATD1CTL5 = 	ATD1CTL5_DJM_MASK +  
				(ATD1CTL5_Cx_MASK & channel);  
	while((ATD1STAT1&0x01)==0){};
	return ATD1DR0; 
}


/***************************************************************************
同时读取两套AD的数据
***************************************************************************/
/*void ReadADCDouble(INT8U channel1, INT8U channel2, INT16U * a, INT16U * b) {

    channel2 -= 8;
 
    ATD0CTL5 = 	ATD0CTL5_DJM_MASK +  
				(ATD0CTL5_Cx_MASK & channel1);
	ATD1CTL5 = 	ATD1CTL5_DJM_MASK +  
				(ATD1CTL5_Cx_MASK & channel2);      
  
	while(!(ATD0STAT1_CCF0 || ATD1STAT1_CCF0)){}; 
	
	*a = ATD0DR0;
	*b = ATD1DR0;
} */

⌨️ 快捷键说明

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