2024-08-16 10:09:24 +08:00

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);
}