📄 0.#1
字号:
/************************************************************************************
* 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 + -