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

📄 0.#1

📁 C8051F350控制器
💻 #1
📖 第 1 页 / 共 2 页
字号:
/************************************************************************************
*  Copyright (c) 2007,杭州丰禾石油科技有限公司
*            All rights reserved.
* 文件名称: MAIN.C
* 文件标识: none
* 适用器件: C8051F350
* 作    者: 蔡新林
* 完成日期: 2007年4月18日
*************************************************************************************/
	#include "C8051F350.h"
	#include "STDIO.h"
	#include "math.h"
	#include "string.h"

    /*全局常量定义*/
		#define     BAUDRATE    9600                //波特率
		#define     SYSCLK      24500000/4(6125000) // SYSCLK frequency (Hz)
		#define     MDCLK       2450000             // Modulator Clock (Hz)
    	#define     OWR         100                 // desired Output Word Rate in Hz  10ms
		//#define VREF         243UL                // Internal VREF (x 10^-2 V)
		#define     a           16                  //采样次数
		#define     k           89                  //电极系常数
		#define     uchar       unsigned char                                     
		#define     uint        unsigned int
		#define     ul          unsigned long
  	    #define		Kp		    112					//比例系数
	    #define 	Ki 		    120					//积分系数
//	    #define 	Kd 		    12					//微分系数
	    #define		PWMBASE		20					//PWM基值   
  	    #define 	PID_AREA 	150
  	    
//全局变量定义
		ul        pdata   result[4];    //ADC采样值(mv) AIN0-3
	//	uint      data    DATA_llds;
        uint      data    DATA_lld;     //深侧向DAC输出电流控制值
		uint      data    DATA_lls;     //浅侧向DAC输出电流控制值
	    ul        idata   ed;           //深侧向电压值
	    ul        idata   id;           //深侧向电流值
	    ul        idata   es;           //浅侧向电压值
	    ul        idata   is;           //浅侧向电流值
//      long      idata   voltage;
		long      idata   ftp_llds;     //功率计算函数中的深浅侧向实际功率对数值
		long      idata   ftp_lld;      //深侧向实际功率对数值
	//	long      idata   typ_llds;	    
        long      idata   typ_lld;	    //深侧向理论功率对数值
		long      idata   ftp_lls;	    //浅侧向实际功率对数值
     	long      idata   typ_lls;	    //浅侧向理论功率对数值

        long      idata   PID_Integral;	//积分累加单元
   	    int       idata   PID_P,PID_I;  //PID_D;//比例、积分、微分
  	    uint      idata   Setpoint;		//PID输入功率理论对数值
	    uint      idata   nextpoint;    //前端采样功率实际对数值
//      uchar     idata   PID_llds;		//
        uchar     idata   PID_lld;		//PID深侧向输出项,范围0~200
        uchar     idata   PID_lls;		//PID浅侧向输出项,范围0~200		

	//函数说明			
		void      DelayMs(uint n);		                //延时(n)MS
		void      SYSCLK_Init (void);                   //系统时钟初始化*/
		void      PORT_Init (void);                     //I/O端口初始化*/
		void      ADC0_Init (void);                     //ADC0初始化*/
		void      DAC_Init (void);                      //DAC初始化*/
		void      ADC0_Conver (void);                   //ADC转换子程序
		void      DAC0_Out_mV(uint v);                  //DAC0转换子程序
		void      DAC1_Out_mV(uint v);                  //DAC1转换子程序
        int       PID_CRT(long Setpoint,long nextpoint);//PID计算
        long      power_calc_llds(long eds,long ids);   //功率计算
				
 void DelayMs(uint n)     //延时(n)MS
   {uint i;
	for(; n > 0; n--)
	 {for(i = 2211; i > 0; i--);}
    }

 void SYSCLK_Init (void)  //配置系统时钟
  { OSCICN = 0xC1;        // enable intosc                     使能内部振荡 4分频 SYSCLK=6.125MHZ
    CLKSEL = 0x00;        // select intosc as sysclk source    内部振荡器(由OSCICN寄存器中的IFCN位决定)
    VDM0CN = 0x80;        // enable VDD monitor                使能VDD监视器(缺省)
    RSTSRC = 0x02;        // enable VDD monitor reset sources  使能VDD监视器为复位源
	PCA0MD &= ~0x40;       // 关闭 WDT
   }

 void PORT_Init (void)
  { XBR0    = 0x01;       //UART TX0, RX0 连到端口引脚 P0.4 和 P0.5
    XBR1    = 0x40;       //T0连到端口引脚
    P0MDIN  = 0x00;       //P0 全部设置为模拟输入           P0MDIN= 0xF3;//P0.2 P0.3设置模拟输入
    P1MDIN  = 0x3F;       //P1.6 P1.7设置模拟输入
    P0MDOUT = 0x10;       //P0.4设置输出
    P1MDOUT = 0xC0;       //P1.6,P1.7 设置为推挽方式(输出)P1MDOUT   = 0x30;//P1.4 P1.5设置输出
    P0SKIP  = 0xFF;       //P0全部跳过                      P0SKIP= 0x0C;//跳过P0.2 P0.3
    P1SKIP  = 0XC0;       //P.6 P1.7跳过
   }

//-----------------------------------------------------------------------------
// ADC0_Init extVREF Unipolar AIN0.0-AIN0.3
//-----------------------------------------------------------------------------
// This function initializes the ADC to measure across AIN0.0 and AIN0.3
// on the Target Board (Differential measurements, Unipolar codes)
 void ADC0_Init (void)
 { // unsigned ADC0_decimation;
   EA=0;                       //禁止中断
   ADC0MD   = 0x84;            // 校准 Offset
   while(!AD0CALC);
   ADC0MD   = 0x85;            // 校准 Gain
   while(!AD0CALC);
   DelayMs(50);

   ADC0MD = 0x80;               // 使能ADC0 ADC0=空闲模式  可以进行校准或转换
   REF0CN |= 0x03;              // (enable internal vref) 内部振荡器偏压,内部基准偏压 被使能  |:位或
                                //内部振荡器偏压使能位由内部振荡器使能位决定
   ADC0CN = 0x00;               //单极性 PGA=1
   ADC0CF = 0x00;               //interrupts upon SINC3 filter output and uses internal VREF  ADC0CF:ADC0配置寄存器
                                // SINC3滤波器  使能内部电压基准(2.5V)
   ADC0CLK=1.5;                 // Generate MDCLK for modulator.  Ideally MDCLK = 2.4576
                                // Ideally, MDCLK = 2.4576 MHz
   ADC0DECL = 0x0BF;            // set slowest OWR
                               // program decimation rate for desired OWR
//   ADC0_decimation = (unsigned long) SYSCLK/ (unsigned long) OWR /
//                     (unsigned long) (ADC0CLK+1)/(unsigned long)128;
//   ADC0_decimation--;          //ADC0_decimation:抽取比
//   ADC0DEC = ADC0_decimation;  //ADC0DEC:ADC0抽取比寄存器
//   ADC0BUF = 0x00;             // Turn off Input Buffers  ADC0输入缓冲器控制寄存器
//   ADC0MUX = 0x08;           // Input pin selection:
                               // Setup for differential measurements
                               // AIN+ => AIN0.0
                               // AIN- => AGND
//   ADC0MUX = 0x18;             // Input pin selection:
                               // Setup for differential measurements
                               // AIN+ => AIN0.1
                               // AIN- => AGND
//   ADC0MUX = 0x28;             // Input pin selection:
                               // Setup for differential measurements
                               // AIN+ => AIN0.2
                               // AIN- => AGND
//   ADC0MUX = 0x38;             // Input pin selection:
                               // Setup for differential measurements
                               // AIN+ => AIN0.3
                               // AIN- => AGND

   ADC0STA = 0x00;             // 清ADC0状态寄存器
   EIE1 &= ~0x08;              // 禁止ADC0中断(查询采样时使用)
   ADC0MD |= 0x81;             // 全内部校准(偏移、斜率)
   while (!AD0CALC);           // 等待校准完成
   ADC0MD &= ~0x07;            // ADC0进入空闲模式
 }

 void DAC_Init(void)       // DAC初始化;
  { REF0CN = 0x03;         // 使用内部VREF发生器
	IDA0CN = 0xF3;         // 打开DAC0,设置模式 写IDA0触发DAC输出更新 满度输出电流2.0mA
    IDA1CN = 0xF3;         // 打开DAC1,设置模式,从VDD吸取的电流与IDA1输出字有关
   }

//void SystemInit(void)     //系统配置
//{  PCA0MD &= ~0x40;       // 关闭 WDT
//   PCA0MD = 0x00;
//   LED1 = 0;
//   LED2 = 0;
//   LED3 = 0;
//   LED4 = 0;
//}

// ADC0查询采样子程序
 void ADC0_Conver (void)
  { ul temp;
    uint i,n;                  // ADC mux 通道 (0-8)
// unsigned long temp;
    ul idata result[3];       //unsigned long result[9];  // AIN0-3
     for (i=0;i<4;i++)
     {  n = i<<4;
        n &= 0xf0;
        ADC0MUX  = 0x08;
        ADC0MUX |= n;               // 选择AINx作为ADC
		DelayMs(1);
		AD0INT = 0;               // 清除ADC转换完成标志
		ADC0MD |= 0x02;           // 启动单次转换
		while (!AD0INT);          // 等待转换结束
		temp = ADC0H;
		temp = (temp<<8) + ADC0M;
		temp = (temp<<8) + ADC0L;
		result[i] = temp;            // 读ADC值
   }
//  ADC0MUX = 0xf8;                  // 选择温度传感器
//	DelayMs(1);
//	AD0INT = 0;                      // 清除ADC转换完成标志
//	ADC0MD |= 0x02;
//	while (!AD0INT);
//	temp = ADC0H;
//	temp = (temp<<8) + ADC0M;
//	temp = (temp<<8) + ADC0L;
//	result[i] = temp;                // 读ADC值
 }

 void DAC0_Out_mV(uint v)     // DAC0输出电压(mV)
  { float x;
    x = v / 2000.0 * 255;
    v = x;
    IDA0 = v;
   }

 void DAC1_Out_mV(uint v)      // DAC1输出电压(mV)
  { float x;
    x = v / 2000.0 * 255;
    v = x;
    IDA1 = v;
   }

//   输入:侧向输入模拟量:ed  es   id  is
//   输出:理论功率对数值:ftp_lld   ftp_lls   已扩大8192倍(2^13)  
//         实际功率对数值:typ_lld   typ_lls   已扩大8192倍(2^13)
//         PID控制输出量: lld_OUT   lls_OUT
//		   DAC控制输出量: DATA_lld   DATA_lls

⌨️ 快捷键说明

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