电流自动调节OK
This commit is contained in:
parent
26b37c972e
commit
1b4971d3f3
407
app_code/main.c
407
app_code/main.c
@ -1,17 +1,15 @@
|
|||||||
#include "STC8.H"
|
#include "STC8.H"
|
||||||
#include <intrins.h>
|
#include <intrins.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
OUT_INIT=0,
|
OUT_INIT = 0,
|
||||||
OUT_RUNNING,
|
OUT_RUNNING,
|
||||||
OUT_AUTOSTOP,
|
OUT_AUTOSTOP,
|
||||||
OUT_ERR,
|
OUT_ERR,
|
||||||
|
|
||||||
OUTSTATE_NUM,
|
OUTSTATE_NUM,
|
||||||
}OUTSTATE_t;
|
} OUTSTATE_t;
|
||||||
|
|
||||||
/*************** 宏定义 **************/
|
/*************** 宏定义 **************/
|
||||||
#define FOSC 11059200UL // MCU工作频率为11.0592MHz
|
#define FOSC 11059200UL // MCU工作频率为11.0592MHz
|
||||||
@ -19,7 +17,8 @@ typedef enum
|
|||||||
|
|
||||||
#define IAP_ADDRESS 0x0000
|
#define IAP_ADDRESS 0x0000
|
||||||
|
|
||||||
#define LED_OFF P00 = 1
|
#define LED_ON P16 = 1
|
||||||
|
#define LED_OFF P16 = 0
|
||||||
|
|
||||||
#define WT_30M 0x80
|
#define WT_30M 0x80
|
||||||
#define WT_24M 0x81
|
#define WT_24M 0x81
|
||||||
@ -30,45 +29,45 @@ typedef enum
|
|||||||
#define WT_2M 0x86
|
#define WT_2M 0x86
|
||||||
#define WT_1M 0x87
|
#define WT_1M 0x87
|
||||||
|
|
||||||
#define ISP_STANDBY() ISP_CMD = 0 /* ISP空闲命令(禁止)*/
|
#define IAP_STANDBY() IAP_CMD = 0 /* ISP空闲命令(禁止)*/
|
||||||
#define ISP_READ() ISP_CMD = 1 /* ISP读出命令 */
|
#define IAP_READ() IAP_CMD = 1 /* ISP读出命令 */
|
||||||
#define ISP_WRITE() ISP_CMD = 2 /* ISP写入命令 */
|
#define IAP_WRITE() IAP_CMD = 2 /* ISP写入命令 */
|
||||||
#define ISP_ERASE() ISP_CMD = 3 /* ISP擦除命令 */
|
#define IAP_ERASE() IAP_CMD = 3 /* ISP擦除命令 */
|
||||||
|
|
||||||
// sfr ISP_TRIG = 0xC6;
|
// sfr IAP_TRIG = 0xC6;
|
||||||
#define ISP_TRIG() ISP_TRIG = 0x5A, ISP_TRIG = 0xA5 /* ISP触发命令 */
|
#define IAP_TRIG() IAP_TRIG = 0x5A, IAP_TRIG = 0xA5 /* ISP触发命令 */
|
||||||
|
|
||||||
// 7 6 5 4 3 2 1 0 Reset Value
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
// sfr ISP_CONTR = 0xC7; ISPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //ISP Control Register
|
// sfr IAP_CONTR = 0xC7; ISPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //ISP Control Register
|
||||||
#define ISP_EN (1 << 7)
|
#define IAP_EN (1 << 7)
|
||||||
#define ISP_SWBS (1 << 6)
|
#define IAP_SWBS (1 << 6)
|
||||||
#define ISP_SWRST (1 << 5)
|
#define IAP_SWRST (1 << 5)
|
||||||
#define ISP_CMD_FAIL (1 << 4)
|
#define IAP_CMD_FAIL (1 << 4)
|
||||||
#define ISP_WAIT_1MHZ 7
|
#define IAP_WAIT_1MHZ 7
|
||||||
#define ISP_WAIT_2MHZ 6
|
#define IAP_WAIT_2MHZ 6
|
||||||
#define ISP_WAIT_3MHZ 5
|
#define IAP_WAIT_3MHZ 5
|
||||||
#define ISP_WAIT_6MHZ 4
|
#define IAP_WAIT_6MHZ 4
|
||||||
#define ISP_WAIT_12MHZ 3
|
#define IAP_WAIT_12MHZ 3
|
||||||
#define ISP_WAIT_20MHZ 2
|
#define IAP_WAIT_20MHZ 2
|
||||||
#define ISP_WAIT_24MHZ 1
|
#define IAP_WAIT_24MHZ 1
|
||||||
#define ISP_WAIT_30MHZ 0
|
#define IAP_WAIT_30MHZ 0
|
||||||
|
|
||||||
#if (FOSC >= 24000000L)
|
#if (FOSC >= 24000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_30MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_30MHZ
|
||||||
#elif (FOSC >= 20000000L)
|
#elif (FOSC >= 20000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_24MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_24MHZ
|
||||||
#elif (FOSC >= 12000000L)
|
#elif (FOSC >= 12000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_20MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_20MHZ
|
||||||
#elif (FOSC >= 6000000L)
|
#elif (FOSC >= 6000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_12MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_12MHZ
|
||||||
#elif (FOSC >= 3000000L)
|
#elif (FOSC >= 3000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_6MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_6MHZ
|
||||||
#elif (FOSC >= 2000000L)
|
#elif (FOSC >= 2000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_3MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_3MHZ
|
||||||
#elif (FOSC >= 1000000L)
|
#elif (FOSC >= 1000000L)
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_2MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_2MHZ
|
||||||
#else
|
#else
|
||||||
#define ISP_WAIT_FREQUENCY ISP_WAIT_1MHZ
|
#define IAP_WAIT_FREQUENCY IAP_WAIT_1MHZ
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***************函数声明**************/
|
/***************函数声明**************/
|
||||||
@ -91,7 +90,7 @@ void Parameter_Save(void);
|
|||||||
unsigned int Get_ADC12bitResult(unsigned char channel); // channel = 0~14
|
unsigned int Get_ADC12bitResult(unsigned char channel); // channel = 0~14
|
||||||
unsigned int ADC_Average(unsigned int *buff, unsigned int num, unsigned int threshold);
|
unsigned int ADC_Average(unsigned int *buff, unsigned int num, unsigned int threshold);
|
||||||
|
|
||||||
//new
|
// new
|
||||||
void OutPutCtrl(void);
|
void OutPutCtrl(void);
|
||||||
|
|
||||||
/***************变量定义**************/
|
/***************变量定义**************/
|
||||||
@ -176,7 +175,6 @@ unsigned char xdata Shut_Min = 0;
|
|||||||
unsigned char xdata Shut_Sec = 0;
|
unsigned char xdata Shut_Sec = 0;
|
||||||
unsigned int xdata Shut_MS = 0;
|
unsigned int xdata Shut_MS = 0;
|
||||||
|
|
||||||
|
|
||||||
int OffsetVoltage = 0; // 补偿电压
|
int OffsetVoltage = 0; // 补偿电压
|
||||||
|
|
||||||
float xdata IA; // 实际输出电流
|
float xdata IA; // 实际输出电流
|
||||||
@ -185,9 +183,13 @@ float xdata AdjVoltage = 0; // 调节电压
|
|||||||
float xdata CompensationValue = 0; // 补偿系数
|
float xdata CompensationValue = 0; // 补偿系数
|
||||||
float xdata OutGain = 0; // 输出增益调节
|
float xdata OutGain = 0; // 输出增益调节
|
||||||
|
|
||||||
//new
|
// new
|
||||||
OUTSTATE_t xdata OutPutState;
|
OUTSTATE_t xdata OutPutState;
|
||||||
unsigned int xdata InitTimeCnt;
|
unsigned int xdata InitTimeCnt;
|
||||||
|
unsigned int xdata TimeBaseCnt, TimeBaseCntLast;
|
||||||
|
bit ledState;
|
||||||
|
unsigned int xdata TargetCurrent;
|
||||||
|
unsigned int xdata OutputVol;
|
||||||
/*************** 主函数 **************/
|
/*************** 主函数 **************/
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
@ -209,54 +211,37 @@ void main()
|
|||||||
Delay10ms();
|
Delay10ms();
|
||||||
|
|
||||||
EEPROM_read_n(IAP_ADDRESS, TableRead, 18); // 从EEPROM读取数据
|
EEPROM_read_n(IAP_ADDRESS, TableRead, 18); // 从EEPROM读取数据
|
||||||
|
if (TableRead[0] == 0x55 && TableRead[1] == 0xaa)
|
||||||
|
{
|
||||||
|
TargetCurrent = (TableRead[2] << 8) + TableRead[3];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TargetCurrent = 1000; // 10mA
|
||||||
|
Save_Flag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
RunTime = TableRead[0] * 256UL + TableRead[1]; // 读EEPROM数据--运行时间
|
// RunTime = TableRead[0] * 256UL + TableRead[1]; // 读EEPROM数据--运行时间
|
||||||
SetVoltage = TableRead[2] * 256UL + TableRead[3]; // 读EEPROM数据--设置电压
|
// SetVoltage = TableRead[2] * 256UL + TableRead[3]; // 读EEPROM数据--设置电压
|
||||||
SetCorroV = TableRead[4] * 256UL + TableRead[5]; // 读EEPROM数据--腐蚀电压
|
// SetCorroV = TableRead[4] * 256UL + TableRead[5]; // 读EEPROM数据--腐蚀电压
|
||||||
|
|
||||||
OutSet = TableRead[6] * 256UL + TableRead[7]; // 读EEPROM数据--输出设置
|
// OutSet = TableRead[6] * 256UL + TableRead[7]; // 读EEPROM数据--输出设置
|
||||||
DisSet = TableRead[8] * 256UL + TableRead[9]; // 读EEPROM数据--显示设置
|
// DisSet = TableRead[8] * 256UL + TableRead[9]; // 读EEPROM数据--显示设置
|
||||||
CurrentError = (float)(TableRead[10] * 256UL + TableRead[11]) / 100; // 读EEPROM数据--电流误差
|
// CurrentError = (float)(TableRead[10] * 256UL + TableRead[11]) / 100; // 读EEPROM数据--电流误差
|
||||||
AdjVoltage = (float)(TableRead[12] * 256UL + TableRead[13]); // 读EEPROM数据--调节电压
|
// AdjVoltage = (float)(TableRead[12] * 256UL + TableRead[13]); // 读EEPROM数据--调节电压
|
||||||
AcqError = (float)(TableRead[14] * 256UL + TableRead[15]) / 10; // 读EEPROM数据--采集误差
|
// AcqError = (float)(TableRead[14] * 256UL + TableRead[15]) / 10; // 读EEPROM数据--采集误差
|
||||||
Limitvoltage = TableRead[16] * 256UL + TableRead[17]; // 读EEPROM数据--极限电压(新增)
|
// Limitvoltage = TableRead[16] * 256UL + TableRead[17]; // 读EEPROM数据--极限电压(新增)
|
||||||
// 第一次运行程序,EEPROM数据全是FFFF,进行参数初始化处理
|
// 第一次运行程序,EEPROM数据全是FFFF,进行参数初始化处理
|
||||||
if (RunTime == 0xFFFF)
|
|
||||||
{
|
RunTime = 0;
|
||||||
RunTime = 0;
|
SetVoltage = 2000;
|
||||||
}
|
SetCorroV = 920;
|
||||||
if (SetVoltage == 0xFFFF)
|
Limitvoltage = 1600;
|
||||||
{
|
AdjVoltage = 3;
|
||||||
SetVoltage = 2000;
|
CurrentError = 1000;
|
||||||
}
|
AcqError = 100;
|
||||||
if (SetCorroV == 0xFFFF)
|
OutSet = 10000;
|
||||||
{
|
DisSet = 16146;
|
||||||
SetCorroV = 920;
|
|
||||||
}
|
|
||||||
if (Limitvoltage == 0xFFFF)
|
|
||||||
{
|
|
||||||
Limitvoltage = 1600;
|
|
||||||
}
|
|
||||||
if (AdjVoltage == 0xFFFF)
|
|
||||||
{
|
|
||||||
AdjVoltage = 3;
|
|
||||||
}
|
|
||||||
if (CurrentError == (0xFFFF) / 100.0)
|
|
||||||
{
|
|
||||||
CurrentError = 1000;
|
|
||||||
}
|
|
||||||
if (AcqError == (0xFFFF) / 10.0)
|
|
||||||
{
|
|
||||||
AcqError = 100;
|
|
||||||
}
|
|
||||||
if (OutSet == 0xFFFF)
|
|
||||||
{
|
|
||||||
OutSet = 10000;
|
|
||||||
}
|
|
||||||
if (DisSet == 0xFFFF)
|
|
||||||
{
|
|
||||||
DisSet = 16146;
|
|
||||||
}
|
|
||||||
|
|
||||||
OutGain = (float)OutSet / 10000;
|
OutGain = (float)OutSet / 10000;
|
||||||
|
|
||||||
@ -265,12 +250,36 @@ void main()
|
|||||||
|
|
||||||
AcqInitCnt = 0;
|
AcqInitCnt = 0;
|
||||||
InitTimeCnt = 0;
|
InitTimeCnt = 0;
|
||||||
|
TimeBaseCnt = 0;
|
||||||
|
TimeBaseCntLast = 0;
|
||||||
|
OutPutState = OUT_INIT;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
DataParsing(); // 串口数据解析
|
if (TimeBaseCnt > TimeBaseCntLast)
|
||||||
UartSendData(); // 串口定时发送数据
|
{
|
||||||
Read_ADC(); // AD采集数据处理
|
TimeBaseCntLast++;
|
||||||
Parameter_Save();
|
DataParsing(); // 串口数据解析
|
||||||
|
UartSendData(); // 串口定时发送数据
|
||||||
|
Read_ADC(); // AD采集数据处理
|
||||||
|
Parameter_Save();
|
||||||
|
|
||||||
|
if (TimeBaseCntLast % 10 == 0)
|
||||||
|
{
|
||||||
|
OutPutCtrl();
|
||||||
|
}
|
||||||
|
if (TimeBaseCntLast % 1000 == 0)
|
||||||
|
{
|
||||||
|
ledState = !ledState;
|
||||||
|
P16 = ledState;
|
||||||
|
}
|
||||||
|
if (TimeBaseCnt >= 10000)
|
||||||
|
{
|
||||||
|
TimeBaseCnt = 0;
|
||||||
|
TimeBaseCntLast = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (AcqInitFlag == 0) // 上电采集初始电压
|
if (AcqInitFlag == 0) // 上电采集初始电压
|
||||||
{
|
{
|
||||||
if (AcqInitCnt > 1000) // 上电3秒内采集初始电压,时间可修改
|
if (AcqInitCnt > 1000) // 上电3秒内采集初始电压,时间可修改
|
||||||
@ -283,26 +292,42 @@ void main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//AutoAction(); // 运行自动程序
|
// AutoAction(); // 运行自动程序
|
||||||
OutPutCtrl();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutPutCtrl(void)
|
void OutPutCtrl(void)
|
||||||
{
|
{
|
||||||
|
OutCurrent = (unsigned int)(IA * 100); // 放大10倍后的电流(触摸屏显示用)
|
||||||
switch (OutPutState)
|
switch (OutPutState)
|
||||||
{
|
{
|
||||||
case OUT_INIT:
|
case OUT_INIT:
|
||||||
PWM_TO_DAC(5000,2000);
|
PWM_TO_DAC(5000, 1000);
|
||||||
InitTimeCnt++;
|
InitTimeCnt++;
|
||||||
if (InitTimeCnt > 1000)
|
if (InitTimeCnt > 100)
|
||||||
{
|
{
|
||||||
InitTimeCnt = 0;
|
InitTimeCnt = 0;
|
||||||
OutPutState = OUT_RUNNING;
|
OutPutState = OUT_RUNNING;
|
||||||
|
OutputVol = 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case OUT_RUNNING:
|
case OUT_RUNNING:
|
||||||
|
if (OutCurrent > TargetCurrent + 20)
|
||||||
|
{
|
||||||
|
if (OutputVol > 100)
|
||||||
|
{
|
||||||
|
OutputVol--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (OutCurrent < TargetCurrent - 20)
|
||||||
|
{
|
||||||
|
if (OutputVol < 5000)
|
||||||
|
{
|
||||||
|
OutputVol++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PWM_TO_DAC(5000, OutputVol);
|
||||||
break;
|
break;
|
||||||
case OUT_AUTOSTOP:
|
case OUT_AUTOSTOP:
|
||||||
break;
|
break;
|
||||||
@ -1146,11 +1171,11 @@ void Delay10ms() //@11.0592MHz
|
|||||||
*/
|
*/
|
||||||
void DisableEEPROM(void)
|
void DisableEEPROM(void)
|
||||||
{
|
{
|
||||||
ISP_CONTR = 0; // 关闭ISP功能
|
IAP_CONTR = 0; // 关闭ISP功能
|
||||||
ISP_CMD = 0; // 清除命令寄存器
|
IAP_CMD = 0; // 清除命令寄存器
|
||||||
ISP_TRIG = 0; // 清除触发寄存器
|
IAP_TRIG = 0; // 清除触发寄存器
|
||||||
ISP_ADDRH = 0x80; // 将地址设置到非ISP区域
|
IAP_ADDRH = 0x80; // 将地址设置到非ISP区域
|
||||||
ISP_ADDRL = 0x00;
|
IAP_ADDRL = 0x00;
|
||||||
}
|
}
|
||||||
/*========================================================================
|
/*========================================================================
|
||||||
// 函数: void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number)
|
// 函数: void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number)
|
||||||
@ -1165,17 +1190,17 @@ void DisableEEPROM(void)
|
|||||||
void EEPROM_read_n(unsigned int EE_address, unsigned char *DataAddress, unsigned int number)
|
void EEPROM_read_n(unsigned int EE_address, unsigned char *DataAddress, unsigned int number)
|
||||||
{
|
{
|
||||||
// EA = 0; //禁止中断
|
// EA = 0; //禁止中断
|
||||||
ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够
|
IAP_CONTR = (IAP_EN + IAP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够
|
||||||
ISP_READ(); // 送字节读命令,命令不需改变时,不需重新送命令
|
IAP_READ(); // 送字节读命令,命令不需改变时,不需重新送命令
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ISP_ADDRH = EE_address / 256; // 送地址高字节(地址需要改变时才需重新送地址)
|
IAP_ADDRH = EE_address / 256; // 送地址高字节(地址需要改变时才需重新送地址)
|
||||||
ISP_ADDRL = EE_address % 256; // 送地址低字节
|
IAP_ADDRL = EE_address % 256; // 送地址低字节
|
||||||
ISP_TRIG(); // 先送5AH,再送A5H到ISP/ISP触发寄存器,每次都需要如此
|
IAP_TRIG(); // 先送5AH,再送A5H到ISP/ISP触发寄存器,每次都需要如此
|
||||||
// 送完A5H后,ISP/ISP命令立即被触发启动
|
// 送完A5H后,ISP/ISP命令立即被触发启动
|
||||||
// CPU等待ISP完成后,才会继续执行程序。
|
// CPU等待ISP完成后,才会继续执行程序。
|
||||||
_nop_();
|
_nop_();
|
||||||
*DataAddress = ISP_DATA; // 读出的数据送往
|
*DataAddress = IAP_DATA; // 读出的数据送往
|
||||||
EE_address++;
|
EE_address++;
|
||||||
DataAddress++;
|
DataAddress++;
|
||||||
} while (--number);
|
} while (--number);
|
||||||
@ -1198,11 +1223,11 @@ void EEPROM_SectorErase(unsigned int EE_address)
|
|||||||
// EA = 0; //禁止中断
|
// EA = 0; //禁止中断
|
||||||
// 只有扇区擦除,没有字节擦除,512字节/扇区。
|
// 只有扇区擦除,没有字节擦除,512字节/扇区。
|
||||||
// 扇区中任意一个字节地址都是扇区地址。
|
// 扇区中任意一个字节地址都是扇区地址。
|
||||||
ISP_ADDRH = EE_address / 256; // 送扇区地址高字节(地址需要改变时才需重新送地址)
|
IAP_ADDRH = EE_address / 256; // 送扇区地址高字节(地址需要改变时才需重新送地址)
|
||||||
ISP_ADDRL = EE_address % 256; // 送扇区地址低字节
|
IAP_ADDRL = EE_address % 256; // 送扇区地址低字节
|
||||||
ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够
|
IAP_CONTR = (IAP_EN + IAP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够
|
||||||
ISP_ERASE(); // 送扇区擦除命令,命令不需改变时,不需重新送命令
|
IAP_ERASE(); // 送扇区擦除命令,命令不需改变时,不需重新送命令
|
||||||
ISP_TRIG();
|
IAP_TRIG();
|
||||||
_nop_();
|
_nop_();
|
||||||
DisableEEPROM();
|
DisableEEPROM();
|
||||||
// EA = 1; //重新允许中断
|
// EA = 1; //重新允许中断
|
||||||
@ -1221,14 +1246,14 @@ void EEPROM_write_n(unsigned int EE_address, unsigned char *DataAddress, unsigne
|
|||||||
{
|
{
|
||||||
// EA = 0; //禁止中断
|
// EA = 0; //禁止中断
|
||||||
|
|
||||||
ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够
|
IAP_CONTR = (IAP_EN + IAP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够
|
||||||
ISP_WRITE(); // 送字节写命令,命令不需改变时,不需重新送命令
|
IAP_WRITE(); // 送字节写命令,命令不需改变时,不需重新送命令
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ISP_ADDRH = EE_address / 256; // 送地址高字节(地址需要改变时才需重新送地址)
|
IAP_ADDRH = EE_address / 256; // 送地址高字节(地址需要改变时才需重新送地址)
|
||||||
ISP_ADDRL = EE_address % 256; // 送地址低字节
|
IAP_ADDRL = EE_address % 256; // 送地址低字节
|
||||||
ISP_DATA = *DataAddress; // 送数据到ISP_DATA,只有数据改变时才需重新送
|
IAP_DATA = *DataAddress; // 送数据到IAP_DATA,只有数据改变时才需重新送
|
||||||
ISP_TRIG();
|
IAP_TRIG();
|
||||||
_nop_();
|
_nop_();
|
||||||
EE_address++;
|
EE_address++;
|
||||||
DataAddress++;
|
DataAddress++;
|
||||||
@ -1250,8 +1275,8 @@ void EEPROM_write_n(unsigned int EE_address, unsigned char *DataAddress, unsigne
|
|||||||
*/
|
*/
|
||||||
void ADC_Init()
|
void ADC_Init()
|
||||||
{
|
{
|
||||||
P1M0 = 0x00; // 设置P1.4、P1.5、P1.6、P1.7为ADC口
|
P1M0 = 0x40; // 设置P1.4、P1.5、P1.6、P1.7为ADC口
|
||||||
P1M1 = 0xF0;
|
P1M1 = 0xA0;
|
||||||
|
|
||||||
ADCCFG |= 0x2F; // 设置ADC时钟为系统时钟/2/16/Speed,设置结果右对齐
|
ADCCFG |= 0x2F; // 设置ADC时钟为系统时钟/2/16/Speed,设置结果右对齐
|
||||||
ADC_CONTR = 0x80; // 使能ADC模块
|
ADC_CONTR = 0x80; // 使能ADC模块
|
||||||
@ -1370,8 +1395,8 @@ void Read_ADC()
|
|||||||
OutVoltage = ADC0_Value * 4.03 * 2498UL / DisSet; // 输出电压(负载两端电压),根据实际情况修改
|
OutVoltage = ADC0_Value * 4.03 * 2498UL / DisSet; // 输出电压(负载两端电压),根据实际情况修改
|
||||||
// AcqVolatage = ADC1_Value * 2498UL / DisSet * 1.0 - AcqError; // 采集电压
|
// AcqVolatage = ADC1_Value * 2498UL / DisSet * 1.0 - AcqError; // 采集电压
|
||||||
|
|
||||||
IA = ((float)ADC2_Value * 2498UL / DisSet / 10.08) / 2.0 - CurrentError; // 实际输出电流,根据实际情况修改
|
// IA = ((float)ADC2_Value * 2498UL / DisSet / 10.08) / 2.0 - CurrentError; // 实际输出电流,根据实际情况修改
|
||||||
|
IA = ((float)ADC2_Value * 2498UL / DisSet / 10.00) / 2.0;
|
||||||
AD_Refresh = 1;
|
AD_Refresh = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1420,14 +1445,9 @@ void UartIsr() interrupt 4 using 1
|
|||||||
if (RI)
|
if (RI)
|
||||||
{
|
{
|
||||||
RI = 0;
|
RI = 0;
|
||||||
// Rx_Busy = 1;
|
|
||||||
|
|
||||||
aRxBufferTemp = SBUF;
|
aRxBufferTemp = SBUF;
|
||||||
|
|
||||||
// //上位机有数据发送,停止轮发
|
|
||||||
// SendEN = 0;
|
|
||||||
// UartCnt= 0;
|
|
||||||
|
|
||||||
if (RX_5A_OK)
|
if (RX_5A_OK)
|
||||||
{
|
{
|
||||||
if (RX_A5_OK)
|
if (RX_A5_OK)
|
||||||
@ -1486,91 +1506,13 @@ void DataParsing(void)
|
|||||||
if (Uart1Ready_R == 1) // 数据接收完成,处理接收到的数据
|
if (Uart1Ready_R == 1) // 数据接收完成,处理接收到的数据
|
||||||
{
|
{
|
||||||
// 按键返回
|
// 按键返回
|
||||||
if ((Rxbuff[0] == 0x06) && (Rxbuff[1] == 0x83) && (Rxbuff[2] == 0x00) && (Rxbuff[3] == 0x20) && (Rxbuff[4] == 0x01) && (Rxbuff[5] == 0x00) && (Rxbuff[6] == 0x00))
|
if (Rxbuff[0] == 0x02)
|
||||||
{
|
{
|
||||||
// 参数复位
|
// 参数复位
|
||||||
RunTime = 0; // 运行时间
|
TargetCurrent = Rxbuff[1] << 8 + Rxbuff[2];
|
||||||
Save_Cnt = 0;
|
|
||||||
SetVoltage = 2000; // 设置电压
|
|
||||||
SetCorroV = 650; // 腐蚀电压
|
|
||||||
// SetCorroV = 920; //腐蚀电压 //万博
|
|
||||||
AdjVoltage = 3.0; // 调节电压
|
|
||||||
CurrentError = 0; // 电流误差
|
|
||||||
AcqError = 0; // 采集误差
|
|
||||||
OutSet = 10000;
|
|
||||||
DisSet = 16146; // 显示设置
|
|
||||||
OutGain = 1.0000; // 输出设置
|
|
||||||
Limitvoltage = 1600; // 极限电压
|
|
||||||
|
|
||||||
// 参数掉电保存(直接调用函数)
|
// 参数掉电保存(直接调用函数)
|
||||||
Save_Flag = 1;
|
Save_Flag = 1;
|
||||||
Parameter_Save();
|
// Parameter_Save();
|
||||||
}
|
|
||||||
|
|
||||||
// 参数返回
|
|
||||||
if ((Rxbuff[0] == 0x06) && (Rxbuff[1] == 0x83) && (Rxbuff[2] == 0x00))
|
|
||||||
{
|
|
||||||
if ((Rxbuff[3] == 0x04) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
SetVoltage = Rxbuff[5] * 256 + Rxbuff[6]; // 设置电压
|
|
||||||
CalibrationVoltage = SetVoltage;
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
if ((Rxbuff[3] == 0x05) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
SetCorroV = Rxbuff[5] * 256 + Rxbuff[6]; // 腐蚀电压
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Rxbuff[3] == 0x0E) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
OutSet = Rxbuff[5] * 256 + Rxbuff[6]; // 输出设置
|
|
||||||
OutGain = (float)OutSet / 10000;
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Rxbuff[3] == 0x0F) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
DisSet = Rxbuff[5] * 256 + Rxbuff[6]; // 显示设置
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
if ((Rxbuff[3] == 0x10) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
CurrentError = (float)(Rxbuff[5] * 256 + Rxbuff[6]) / 100; // 电流误差
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
if ((Rxbuff[3] == 0x11) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
AdjVoltage = (float)(Rxbuff[5] * 256 + Rxbuff[6]); // 调节电压
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
if ((Rxbuff[3] == 0x0D) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
AcqError = (float)(Rxbuff[5] * 256 + Rxbuff[6]) / 10; // 采集误差
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Rxbuff[3] == 0x12) && (Rxbuff[4] == 0x01))
|
|
||||||
{
|
|
||||||
Limitvoltage = Rxbuff[5] * 256 + Rxbuff[6]; // 新增--极限电压
|
|
||||||
// 参数掉电保存(直接调用函数)
|
|
||||||
Save_Flag = 1;
|
|
||||||
Parameter_Save();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Uart1Ready_R = 0;
|
Uart1Ready_R = 0;
|
||||||
@ -1595,19 +1537,22 @@ void UartSendData(void)
|
|||||||
busy = 1;
|
busy = 1;
|
||||||
if (!SendInit)
|
if (!SendInit)
|
||||||
{
|
{
|
||||||
SendBuffer[0] = 0x5A;
|
SendBuffer[0] = 0x55;
|
||||||
SendBuffer[1] = 0xA5;
|
SendBuffer[1] = 0xAA;
|
||||||
SendBuffer[2] = 0X2F; // 长度
|
|
||||||
SendBuffer[3] = 0X82; // 命令
|
SendBuffer[2] = RunTime >> 8; // 运行时间H
|
||||||
SendBuffer[4] = 0X00; // 首地址H
|
SendBuffer[3] = RunTime; // 运行时间L
|
||||||
SendBuffer[5] = 0X00; // 首地址L
|
SendBuffer[4] = InVoltage >> 8; // 输入电压H
|
||||||
// 第一页参数显示
|
SendBuffer[5] = InVoltage; // 输入电压L
|
||||||
SendBuffer[6] = RunTime >> 8; // 运行时间H
|
SendBuffer[6] = OutVoltage >> 8; // 输出电压H
|
||||||
SendBuffer[7] = RunTime; // 运行时间L
|
SendBuffer[7] = OutVoltage; // 输出电压L
|
||||||
SendBuffer[8] = InVoltage >> 8; // 输入电压H
|
SendBuffer[8] = OutCurrent >> 8; // 输出电流H
|
||||||
SendBuffer[9] = InVoltage; // 输入电压L
|
SendBuffer[9] = OutCurrent;
|
||||||
SendBuffer[10] = OutVoltage >> 8; // 输出电压H
|
|
||||||
SendBuffer[11] = OutVoltage; // 输出电压L
|
SendBuffer[10] = TargetCurrent >> 8;
|
||||||
|
SendBuffer[11] = TargetCurrent;
|
||||||
|
SendBuffer[12] = 0X5A;
|
||||||
|
/*
|
||||||
SendBuffer[12] = OffsetVoltage >> 8; // 补偿电压H
|
SendBuffer[12] = OffsetVoltage >> 8; // 补偿电压H
|
||||||
SendBuffer[13] = OffsetVoltage; // 补偿电压L
|
SendBuffer[13] = OffsetVoltage; // 补偿电压L
|
||||||
SendBuffer[14] = SetVoltage >> 8; // 设置电压H
|
SendBuffer[14] = SetVoltage >> 8; // 设置电压H
|
||||||
@ -1645,14 +1590,12 @@ void UartSendData(void)
|
|||||||
SendBuffer[43] = Limitvoltage; // 新增-极限电压
|
SendBuffer[43] = Limitvoltage; // 新增-极限电压
|
||||||
SendBuffer[44] = Shut_Min >> 8; // 新增-重启时间
|
SendBuffer[44] = Shut_Min >> 8; // 新增-重启时间
|
||||||
SendBuffer[45] = Shut_Min; // 新增-重启时间
|
SendBuffer[45] = Shut_Min; // 新增-重启时间
|
||||||
SendBuffer[46] = OutCurrent >> 8; // 输出电流H
|
*/
|
||||||
SendBuffer[47] = OutCurrent; // 输出电流L
|
|
||||||
|
|
||||||
SendInit = 1;
|
SendInit = 1;
|
||||||
SentCnt = 0;
|
SentCnt = 0;
|
||||||
}
|
}
|
||||||
SBUF = SendBuffer[SentCnt++];
|
SBUF = SendBuffer[SentCnt++];
|
||||||
if (SentCnt > 47)
|
if (SentCnt > 12)
|
||||||
{
|
{
|
||||||
SendEN = 0;
|
SendEN = 0;
|
||||||
}
|
}
|
||||||
@ -1692,7 +1635,7 @@ void TM0_Isr() interrupt 1 using 1
|
|||||||
ADC_Cnt++;
|
ADC_Cnt++;
|
||||||
Cnt++;
|
Cnt++;
|
||||||
AcqInitCnt++;
|
AcqInitCnt++;
|
||||||
|
TimeBaseCnt++;
|
||||||
/*** 新增2019-11-14 ***/
|
/*** 新增2019-11-14 ***/
|
||||||
if (PWM_ON_EN)
|
if (PWM_ON_EN)
|
||||||
{
|
{
|
||||||
@ -1812,29 +1755,13 @@ void Parameter_Save(void)
|
|||||||
{
|
{
|
||||||
// 参数掉电保存
|
// 参数掉电保存
|
||||||
EEPROM_SectorErase(IAP_ADDRESS);
|
EEPROM_SectorErase(IAP_ADDRESS);
|
||||||
|
TableWrite[0] = 0x55;
|
||||||
|
TableWrite[1] = 0xAA;
|
||||||
|
|
||||||
TableWrite[0] = RunTime >> 8; // 运行时间H
|
TableWrite[2] = TargetCurrent >> 8; // 运行时间H
|
||||||
TableWrite[1] = RunTime; // 运行时间L
|
TableWrite[3] = TargetCurrent & 0XFF; // 运行时间L
|
||||||
TableWrite[2] = SetVoltage >> 8; // 设置电压H
|
|
||||||
TableWrite[3] = SetVoltage; // 设置电压L
|
|
||||||
TableWrite[4] = SetCorroV >> 8; // 腐蚀电压H
|
|
||||||
TableWrite[5] = SetCorroV; // 腐蚀电压L
|
|
||||||
|
|
||||||
TableWrite[6] = OutSet >> 8; // 输出设置H
|
EEPROM_write_n(IAP_ADDRESS, TableWrite, 4);
|
||||||
TableWrite[7] = OutSet; // 输出设置L
|
|
||||||
TableWrite[8] = DisSet >> 8; // 显示设置H
|
|
||||||
TableWrite[9] = DisSet; // 显示设置L
|
|
||||||
TableWrite[10] = (unsigned int)(CurrentError * 100) >> 8; // 电流误差H
|
|
||||||
TableWrite[11] = (unsigned int)(CurrentError * 100); // 电流误差L
|
|
||||||
TableWrite[12] = (unsigned int)AdjVoltage >> 8; // 调节电压H
|
|
||||||
TableWrite[13] = (unsigned int)AdjVoltage; // 调节电压L
|
|
||||||
TableWrite[14] = (unsigned int)AcqError >> 8; // 采集误差H
|
|
||||||
TableWrite[15] = (unsigned int)AcqError; // 采集误差L
|
|
||||||
|
|
||||||
TableWrite[16] = Limitvoltage >> 8; // 新增-极限电压
|
|
||||||
TableWrite[17] = Limitvoltage; // 新增-极限电压
|
|
||||||
|
|
||||||
EEPROM_write_n(IAP_ADDRESS, TableWrite, 18);
|
|
||||||
Save_Flag = 0;
|
Save_Flag = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user