297 lines
6.3 KiB
C
297 lines
6.3 KiB
C
#include <config.H>
|
|
#include"tm1650.h"
|
|
#include"uart.h"
|
|
#include <math.h>
|
|
|
|
/*[-外部信号-][-开始-][-220V电源检测模块-][-----][-----]*/
|
|
u8 ACC_NUM_RST = 3;
|
|
|
|
extern bool UART_SEND_OK;
|
|
/*[-PTC加热继电器-][-开始-][-----][-----][-----]*/
|
|
u8 PTC_WORK_POS = 99;
|
|
u8 PTC_DEL_TIME = 0;
|
|
bool PTC_STATE = FALSE;
|
|
static void PTC_WORK();
|
|
|
|
/*[-PWM8-][-开始-][-----][-----][-----]*/
|
|
#define PWM 10000
|
|
u8 PWM_DUT = 50;
|
|
static void SETPWM8(u16 cycle, u16 duty);
|
|
|
|
/*[-ADC采样-][-开始-][-----][-----][可控硅温度]*/
|
|
u16 FAN_TEMP = 0;
|
|
bool ADC_TEMP_OK = FALSE;
|
|
u16 GETADC_ADC0(); // 获取ADC数据
|
|
static void ADCINIT(); // 温度采集 初始化
|
|
static void AUTOFAN(); // 自动风扇
|
|
static float temp_data(float ADC_data); // 计算温度数据
|
|
|
|
/*[-定时器0-][-结束-][-----][-----][-----]*/
|
|
u16 SYS_TIME_NUM = 0;
|
|
u8 hour = 0, min = 0, sec = 0;
|
|
void Timer0_Init(void); // 25毫秒@24.000MHz
|
|
|
|
/*[-外部中断0-][-开始-][-----][-----][-----]*/
|
|
u8 ACC_NUM = 0;
|
|
u8 ACC_FREQ = 0;
|
|
|
|
/*[-函数声明-][-----][-----][-----][-----]*/
|
|
static void SYSINIT(); // 系统初始化
|
|
static void SMGSHOW(); // 数码管显示
|
|
#ifdef HEATING_CONTROL_P1000
|
|
void FILA_WORK(); // 耗材仓加热
|
|
#endif
|
|
|
|
/*[-变量声明-][-----][-----][-----][-----]*/
|
|
static u8 pag = 0;
|
|
xdata u8 FILA_PTC_TIME = 0;
|
|
xdata u16 FILA_FAN_TIME = 0;
|
|
|
|
void main()
|
|
{
|
|
SYSINIT(); // 系统初始化
|
|
SETPWM8(2400, 80);
|
|
ADCINIT();
|
|
while (1)
|
|
{
|
|
SMGSHOW(); // 数码管显示
|
|
AUTOFAN();
|
|
PTC_WORK(); // PTC工作程序
|
|
UART_CMD(); // 串口命令
|
|
#ifdef HEATING_CONTROL_P1000
|
|
FILA_WORK(); // 耗材仓加热
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#ifdef HEATING_CONTROL_P1000
|
|
void FILA_WORK() // 耗材仓加热
|
|
{
|
|
if (FILA_PTC_TIME > 0)
|
|
{
|
|
FILA_PTC_TIME--;
|
|
MCU_FILA_PTC_1 = MCU_FILA_PTC_2 = 1;
|
|
}
|
|
else
|
|
{
|
|
MCU_FILA_PTC_1 = MCU_FILA_PTC_2 = 0;
|
|
}
|
|
|
|
if (FILA_FAN_TIME > 0)
|
|
{
|
|
FILA_FAN_TIME--;
|
|
MCU_FILA_FAN = 1;
|
|
}
|
|
else
|
|
{
|
|
MCU_FILA_FAN = 0;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
static void setRelay(u8 relay1, u8 relay2, u8 relay3, u8 relay4)
|
|
{
|
|
PTC_RLY_1 = relay1;
|
|
PTC_RLY_2 = relay2;
|
|
PTC_RLY_3 = relay3;
|
|
PTC_RLY_FAN = relay4;
|
|
}
|
|
static void PTC_WORK()
|
|
{
|
|
switch (PTC_WORK_POS)
|
|
{
|
|
case 0: setRelay(0, 1, 1, 0); PTC_WORK_POS = 1; PTC_DEL_TIME = 20; break;
|
|
case 1: if (PTC_DEL_TIME == 0) { setRelay(0, 0, 1, 0); PTC_WORK_POS = 2; PTC_DEL_TIME = 20;} break;
|
|
case 2: if (PTC_DEL_TIME == 0) { setRelay(0, 0, 0, 0); PTC_WORK_POS = 3; PTC_DEL_TIME = 0; } break;
|
|
case 3: setRelay(0, 0, 0, 0); break; // 全开
|
|
|
|
case 90: setRelay(1, 1, 1, 0); PTC_WORK_POS = 91; PTC_DEL_TIME = 20; break; // 延时关闭
|
|
case 91: if (PTC_DEL_TIME == 0) { PTC_RLY_FAN = 0; PTC_WORK_POS = 99; } break;
|
|
case 99: setRelay(1, 1, 1, 1); break; // 全部关闭
|
|
}
|
|
#ifdef HEATING_CONTROL_P800
|
|
MCU_FILA_FAN = !PTC_RLY_FAN;
|
|
#endif
|
|
|
|
}
|
|
|
|
static void SETPWM8(u16 cycle, u16 duty)
|
|
{
|
|
unsigned long a, b, c;
|
|
a = cycle;
|
|
b = duty;
|
|
c = a * b / 100;
|
|
P_SW2 = 0x80;
|
|
PWMB_CCER2 = 0x00; // 写CCMRx前必须先清零CCERx关闭通道
|
|
PWMB_CCMR4 = 0x68;
|
|
PWMB_CCER2 = 0x10;
|
|
PWMB_CCR8 = (u16)c;
|
|
PWMB_ARR = (u16)a; // 设置周期时间
|
|
PWMB_ENO = 0x40;
|
|
PWMB_PS = 0x80;
|
|
PWMB_BKR = 0x80; // 使能主输出
|
|
PWMB_CR1 = 0x01; // 开始计时
|
|
}
|
|
static void SMGSHOW() // 数码管显示
|
|
{
|
|
switch (pag)
|
|
{
|
|
case 0:
|
|
if (PW_OUT_ACC == 1)
|
|
SMG1x4_B(FAN_TEMP % 1000 / 100, FAN_TEMP % 100 / 10, FAN_TEMP % 10, 12, 2);
|
|
else
|
|
SMG1x4(10, 10, 10, 10);
|
|
break;
|
|
} //TODO
|
|
}
|
|
|
|
static void SYSINIT()//系统初始化
|
|
{
|
|
/*[-PINS-][-INIT-][-----][-----][-----]*/
|
|
setRelay(1, 1, 1, 1);
|
|
P0M0 = 0x0e; P0M1 = 0x00;
|
|
P1M0 = 0x00; P1M1 = 0x08;
|
|
P2M0 = 0xff; P2M1 = 0x00;
|
|
P3M0 = 0x00; P3M1 = 0x00;
|
|
P4M0 = 0x00; P4M1 = 0x00;
|
|
P5M0 = 0x10; P5M1 = 0x00;
|
|
P6M0 = 0x00; P6M1 = 0x00;
|
|
P7M0 = 0x00; P7M1 = 0x00;
|
|
SMG1x4_B(28,1,1,2,2); // 显示版本号
|
|
delayMs(500);
|
|
setRelay(0, 0, 0, 0);
|
|
MCU_FILA_PTC_1=0;
|
|
MCU_FILA_PTC_2 = 0;
|
|
MCU_BED_1 = 0;
|
|
MCU_BED_2 = 0;
|
|
IN_PTC = 1;
|
|
IN_BED = 1;
|
|
MCU_FILA_FAN = 0;
|
|
IN_PWR = 1;
|
|
/*[-IO状态-][-INIT-][-----][-----][-----]*/
|
|
BUZZER = 0;
|
|
|
|
/*[-上电提示-][-----][-----][-----][-----]*/
|
|
BUZZER=1;delayMs(100);BUZZER=0;delayMs(100);
|
|
BUZZER=1;delayMs(200);BUZZER=0;delayMs(100);
|
|
UartInit2();
|
|
UartInit(); // 串口初始化
|
|
Timer0_Init(); // 定时器初始化
|
|
IT0 = 1; // 使能INT0上升沿和下降沿中断
|
|
EX0 = 1; // 使能INT0中断
|
|
EA = 1; // 开总中断
|
|
}
|
|
/*[-外部中断-][-INT0-][-----][-----][-END-]*/
|
|
void INT0_Isr() interrupt 0
|
|
{
|
|
// P32 上升沿和下降沿
|
|
ACC_NUM++;
|
|
ACC_NUM_RST = 1;
|
|
}
|
|
|
|
/*[-定时器0-][-开始-][-25ms-][-24Mhz-][-----]*/
|
|
void Timer0_Init(void)
|
|
{
|
|
AUXR &= 0x7F; //定时器时钟12T模式
|
|
TMOD &= 0xF0; //设置定时器模式
|
|
TL0 = 0xB0; //设置定时初始值
|
|
TH0 = 0x3C; //设置定时初始值
|
|
TF0 = 0; //清除TF0标志
|
|
TR0 = 1; //定时器0开始计时
|
|
ET0=1;
|
|
}
|
|
void TM0_Isr() interrupt 1
|
|
{
|
|
SYS_TIME_NUM = (SYS_TIME_NUM + 1) % 40;
|
|
if (SYS_TIME_NUM == 0)
|
|
{
|
|
sec = (sec + 1) % 60;
|
|
if (sec == 0)
|
|
min = (min + 1) % 60;
|
|
if (sec == 0 && min == 0)
|
|
hour++;
|
|
|
|
ACC_FREQ = ACC_NUM;
|
|
ACC_NUM = 0;
|
|
|
|
UART_SEND_OK = 1;
|
|
ADC_TEMP_OK = TRUE;
|
|
if (PTC_DEL_TIME > 0)
|
|
PTC_DEL_TIME--;
|
|
}
|
|
if (PTC_STATE != IN_PTC)
|
|
{
|
|
PTC_STATE = IN_PTC;
|
|
PTC_WORK_POS = IN_PTC ? 90 : 0;
|
|
}
|
|
MCU_BED_1 = MCU_BED_2 = !IN_BED;
|
|
|
|
if (ACC_NUM_RST > 0)
|
|
{
|
|
ACC_NUM_RST--;
|
|
PW_OUT_ACC = 1;
|
|
}
|
|
else
|
|
{
|
|
PW_OUT_ACC = 0;
|
|
}
|
|
}
|
|
|
|
/*[-ADC-][-开始-][-----][-----][-----]*/
|
|
static void ADCINIT()
|
|
{
|
|
P_SW2 |= 0x80;
|
|
ADCTIM = 0x3f; //设置ADC内部时序
|
|
P_SW2 &= 0x7f;
|
|
ADCCFG = 0x2f; //设置ADC时钟为系统时钟/2/16
|
|
ADC_CONTR = 0x80; //使能ADC模块
|
|
|
|
}
|
|
u16 GETADC_ADC0()
|
|
{
|
|
u16 val = 0;
|
|
ADC_CONTR |= 0x43; // 启动AD转换
|
|
_nop_();
|
|
_nop_();
|
|
while (!(ADC_CONTR & 0x20)); // 查询ADC完成标志
|
|
ADC_CONTR &= ~0x20; // 清完成标志,读取ADC结果
|
|
val = ADC_RES * 256 + ADC_RESL;
|
|
return val;
|
|
}
|
|
static float temp_data(float ADC_data)
|
|
{
|
|
float temp;
|
|
float Rt = 0;
|
|
float Rp = 100000;
|
|
float T2 = 273.15 + 25;
|
|
float Bx = 3950;
|
|
float Ka = 273.15;
|
|
float vol = 0;
|
|
vol = (((float)ADC_data) * 2.5 / 1024); // 公式缩减 ADC*(5/1024)
|
|
Rt = (470000 * vol) / (2.5 - vol); // 4.7k 更改为1000k 更改为470K
|
|
temp = 1 / ((log(Rt / Rp)) / Bx + 1 / T2) - Ka;
|
|
if (temp < 0) temp = -1;
|
|
temp = temp * 10.0;
|
|
return temp;
|
|
}
|
|
static void AUTOFAN() // 自动风扇
|
|
{
|
|
/* 35度以下停止工作 后面温度计算方式 */
|
|
if (ADC_TEMP_OK)
|
|
{
|
|
FAN_TEMP = (u16)temp_data(GETADC_ADC0());
|
|
ADC_TEMP_OK = FALSE;
|
|
}
|
|
if (FAN_TEMP > 350)
|
|
{
|
|
PWM_DUT = (FAN_TEMP - 350);
|
|
PWM_DUT = PWM_DUT / 10;
|
|
PWM_DUT = PWM_DUT * 2;
|
|
}
|
|
else
|
|
{
|
|
PWM_DUT = 0;
|
|
}
|
|
SETPWM8(PWM, PWM_DUT);
|
|
}
|