153 lines
4.9 KiB
C
153 lines
4.9 KiB
C
#include "ptz_header_file.h"
|
|
#include "device_heatresistor.h"
|
|
#include "tmp75.h"
|
|
#include "agent_hyt.h"
|
|
|
|
///加热电阻
|
|
HeatResistor heat_resistor;
|
|
|
|
//加热电阻开关
|
|
void ptz_heat_resistor_switch(PTZ_DATA_PACK *pack)
|
|
{
|
|
if(pack->command[1] == 1)
|
|
{//打开电阻加热
|
|
heat_resistor.pwm_duty_cycle = ((float)((pack->data[0] << 8) | pack->data[1])) / 100.0;
|
|
heat_resistor.heat_switch = PTZ_HEAT_RESISTOR_ON;
|
|
}
|
|
else
|
|
{
|
|
heat_resistor.pwm_duty_cycle = 0;
|
|
heat_resistor.heat_switch = PTZ_HEAT_RESISTOR_OFF_1;
|
|
}
|
|
}
|
|
|
|
//加热电阻初始化
|
|
static void ptz_heat_resistor_init()
|
|
{
|
|
//总线时钟使能
|
|
rcu_periph_clock_enable(RCU_GPIOE);
|
|
|
|
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0| GPIO_PIN_1);
|
|
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_0| GPIO_PIN_1);
|
|
|
|
PTZ_HEAT_RESISTOR_A_OFF;
|
|
PTZ_HEAT_RESISTOR_B_OFF;
|
|
}
|
|
|
|
//电阻加热任务
|
|
static void ptz_heat_resistor_task()
|
|
{
|
|
while(1)
|
|
{
|
|
switch(heat_resistor.heat_switch)
|
|
{
|
|
case PTZ_HEAT_RESISTOR_ON:
|
|
//加热时间清0
|
|
heat_resistor.heat_timer_ms = 0;
|
|
heat_resistor.heat_timer_s = 0;
|
|
heat_resistor.heat_timer_min = 0;
|
|
//PWM波控制总周期
|
|
heat_resistor.pwm_t = PTZ_HEAT_RESISTOR_PWM_T;
|
|
//计算允许最大的占空比
|
|
heat_resistor.pwm_duty_cycle_max =
|
|
PTZ_HEAT_RESISTOR_I_MAX * PTZ_HEAT_RESISTOR_R / PTZ_HEAT_RESISTOR_V_MAX;
|
|
//判断输入占空比是否满足要求
|
|
if(heat_resistor.pwm_duty_cycle > heat_resistor.pwm_duty_cycle_max)
|
|
{
|
|
heat_resistor.pwm_duty_cycle = heat_resistor.pwm_duty_cycle_max;
|
|
}
|
|
//根据占空比计算电阻通电和关电的时间
|
|
heat_resistor.pwm_power_on_t =
|
|
(unsigned short int)(heat_resistor.pwm_duty_cycle * heat_resistor.pwm_t + 0.5);
|
|
heat_resistor.pwm_power_off_t = heat_resistor.pwm_t - heat_resistor.pwm_power_on_t;
|
|
//根据占空比计算电阻两端实际电压
|
|
heat_resistor.resistor_v =
|
|
heat_resistor.pwm_duty_cycle * PTZ_HEAT_RESISTOR_V_MAX;
|
|
//根据电阻两端实际电压计算电阻电流
|
|
heat_resistor.resistor_i = heat_resistor.resistor_v / PTZ_HEAT_RESISTOR_R;
|
|
heat_resistor.heat_switch = PTZ_HEAT_RESISTOR_ON_PWM;
|
|
OSTimeDlyHMSM(0u, 0u, 0u, 20u);
|
|
break;
|
|
|
|
case PTZ_HEAT_RESISTOR_ON_PWM:
|
|
//加热PWM输出
|
|
PTZ_HEAT_RESISTOR_A_ON;
|
|
PTZ_HEAT_RESISTOR_B_ON;
|
|
OSTimeDlyHMSM(0u, 0u, 0u, heat_resistor.pwm_power_on_t);
|
|
PTZ_HEAT_RESISTOR_A_OFF;
|
|
PTZ_HEAT_RESISTOR_B_OFF;
|
|
OSTimeDlyHMSM(0u, 0u, 0u, heat_resistor.pwm_power_off_t);
|
|
//加热时间计算
|
|
heat_resistor.heat_timer_ms =
|
|
heat_resistor.heat_timer_ms + heat_resistor.pwm_t;
|
|
if(heat_resistor.heat_timer_ms >= 1000)
|
|
{
|
|
heat_resistor.heat_timer_s ++;
|
|
heat_resistor.heat_timer_ms = heat_resistor.heat_timer_ms - 1000;
|
|
}
|
|
if(heat_resistor.heat_timer_s >= 60)
|
|
{
|
|
heat_resistor.heat_timer_min ++;
|
|
heat_resistor.heat_timer_s = heat_resistor.heat_timer_s - 60;
|
|
}
|
|
//加热保护机制,云台本来温度就合适,防止加热电阻被误打开
|
|
if(g_ptz.temperature >= PTZ_HEAT_RESISTOR_TEMP)
|
|
{
|
|
heat_resistor.heat_switch = PTZ_HEAT_RESISTOR_OFF_1;//关闭加热
|
|
}
|
|
break;
|
|
|
|
case PTZ_HEAT_RESISTOR_OFF_1:
|
|
PTZ_HEAT_RESISTOR_A_OFF;
|
|
PTZ_HEAT_RESISTOR_B_OFF;
|
|
heat_resistor.heat_timer_ms = 0;
|
|
heat_resistor.heat_timer_s = 0;
|
|
heat_resistor.heat_timer_min = 0;
|
|
heat_resistor.heat_switch = PTZ_HEAT_RESISTOR_OFF_0;
|
|
OSTimeDlyHMSM(0u, 0u, 0u, 20u);
|
|
break;
|
|
|
|
default://PTZ_HEAT_RESISTOR_OFF_0
|
|
OSTimeDlyHMSM(0u, 0u, 0u, 1000u);
|
|
break;
|
|
}
|
|
|
|
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static OS_STK task_heat_resistor_stk[TASK_PTZ_HEAT_RESISTOR_STK_SIZE];
|
|
static void creat_task_heat_resistor(void)
|
|
{
|
|
CPU_INT08U task_err;
|
|
CPU_INT08U name_err;
|
|
|
|
task_err = OSTaskCreateExt((void (*)(void *)) ptz_heat_resistor_task,
|
|
(void *) 0,
|
|
(OS_STK *)&task_heat_resistor_stk[TASK_PTZ_HEAT_RESISTOR_STK_SIZE - 1],
|
|
(INT8U ) TASK_PTZ_HEAT_RESISTOR_PRIO,
|
|
(INT16U ) TASK_PTZ_HEAT_RESISTOR_PRIO,
|
|
(OS_STK *)&task_heat_resistor_stk[0],
|
|
(INT32U ) TASK_PTZ_HEAT_RESISTOR_STK_SIZE,
|
|
(void *) 0,
|
|
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
|
|
#if (OS_TASK_NAME_EN > 0)
|
|
OSTaskNameSet(TASK_PTZ_HEAT_RESISTOR_PRIO, "ptz_heat_resistor_task", &name_err);
|
|
#endif
|
|
|
|
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
|
|
pdebug(DEBUG_LEVEL_INFO,"create ptz_heat_resistor_task success...\n\r");
|
|
} else {
|
|
pdebug(DEBUG_LEVEL_FATAL,"create ptz_heat_resistor_task failed...\n\r");
|
|
}
|
|
}
|
|
|
|
void init_heat_resistor_module()
|
|
{
|
|
ptz_heat_resistor_init();
|
|
creat_task_heat_resistor();
|
|
|
|
}
|