From 02d17c179ca435bc9fae46d108557d204ba1c370 Mon Sep 17 00:00:00 2001 From: "REASEARCHER\\18383" <1633026436@qq.com> Date: Mon, 18 Aug 2025 13:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E5=9E=8B=E6=97=A0=E5=88=B7=EF=BC=8C?= =?UTF-8?q?=E5=8A=A0=E7=83=AD=E7=89=88=E6=9C=AC=E9=BD=BF=E8=BD=AE=E4=BC=A0?= =?UTF-8?q?=E5=8A=A8=EF=BC=8C=E8=9C=97=E8=BD=AE=E8=9C=97=E6=9D=86=E4=BC=A0?= =?UTF-8?q?=E5=8A=A8=E6=AF=9480=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=A6=82?= =?UTF-8?q?=E4=B8=8B=E4=BF=AE=E6=94=B9{=E7=A3=81=E7=BC=96=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E3=80=81=E7=94=B5=E6=9C=BA=E9=80=9F=E5=BA=A6=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E4=BF=AE=E6=94=B9=E3=80=81=E7=94=B5=E6=9C=BA=E8=BF=87?= =?UTF-8?q?=E6=B5=81=E4=BF=9D=E6=8A=A4=E4=BF=AE=E6=94=B9=E3=80=81485?= =?UTF-8?q?=E8=AF=BB=E5=86=99=E5=BB=B6=E6=97=B6=E5=87=8F=E5=B0=8F=E3=80=81?= =?UTF-8?q?=E9=A1=B6=E9=83=A8=E5=BC=80=E5=85=B3=E4=BF=9D=E5=AD=98=E3=80=81?= =?UTF-8?q?=E5=8A=A0=E7=83=AD=E6=8E=A2=E5=A4=B4}=EF=BC=8C=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E7=89=88=E6=9C=AC=E6=9C=AA=E5=AE=9E=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hyt2/APP/Appcfg/app.c | 36 +- Hyt2/APP/Common/ptz_default_value.h | 11 +- .../Device/device_Other/device_adc_collect.c | 51 +- Hyt2/APP/Device/device_Other/device_heat.c | 493 ++++++++++++++++++ Hyt2/APP/Device/device_Other/device_heat.h | 12 + Hyt2/BSP/Driver/as5047d/as5047d.h | 2 +- Hyt2/BSP/Driver/full_bridge/full_bridge.c | 8 +- Hyt2/BSP/IAR/GD32F450xE.icf | 4 +- Hyt2/PROJECT/OS2.ewp | 8 +- Hyt2/PROJECT/OS2.ewt | 6 + 10 files changed, 577 insertions(+), 54 deletions(-) create mode 100644 Hyt2/APP/Device/device_Other/device_heat.c create mode 100644 Hyt2/APP/Device/device_Other/device_heat.h diff --git a/Hyt2/APP/Appcfg/app.c b/Hyt2/APP/Appcfg/app.c index ac40624..4303ac1 100644 --- a/Hyt2/APP/Appcfg/app.c +++ b/Hyt2/APP/Appcfg/app.c @@ -49,6 +49,7 @@ #include "Timer.h" #include "systick.h" #include "service_error_count.h" +#include "device_heat.h" void task_printf_init(); @@ -176,6 +177,7 @@ static void task_start (void *p_arg) // term_printf("\n power off init \r\n\r\n"); //数据采集初始化电压、电流、温度 init_data_collect_module(); + Init_ptz_heat_data_collect_task(); // term_printf("\n data collect init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 1u, 0u); @@ -195,7 +197,7 @@ static void task_start (void *p_arg) // term_printf("\n angle init \r\n\r\n"); -// task_printf_init(); + task_printf_init(); //自检模块初始化 @@ -268,21 +270,23 @@ int main (void) */ static void task_print() { - OS_TCB *p_tcb; - OS_STK_DATA stkDat; - p_tcb = &OSTCBTbl[0]; - - char cpuusage = OSCPUUsage; - - term_printf(" Prio Used Free Per cpuusage TaskName\r\n"); - while(p_tcb != NULL) - { - OSTaskStkChk(p_tcb->OSTCBPrio, &stkDat); - term_printf(" %2d %5d %5d %02d%% %d %s\r\n ",p_tcb->OSTCBPrio, stkDat.OSUsed, stkDat.OSFree, (stkDat.OSUsed * 100)/(stkDat.OSUsed + stkDat.OSFree), cpuusage, p_tcb->OSTCBTaskName); - p_tcb = p_tcb->OSTCBPrev; - } - term_printf("\r\n"); - OSTimeDlyHMSM(0u, 0u, 1u, 0u); +// OS_TCB *p_tcb; +// OS_STK_DATA stkDat; +// p_tcb = &OSTCBTbl[0]; +// +// char cpuusage = OSCPUUsage; +// +// term_printf(" Prio Used Free Per cpuusage TaskName\r\n"); +// while(p_tcb != NULL) +// { +// OSTaskStkChk(p_tcb->OSTCBPrio, &stkDat); +// term_printf(" %2d %5d %5d %02d%% %d %s\r\n ",p_tcb->OSTCBPrio, stkDat.OSUsed, stkDat.OSFree, (stkDat.OSUsed * 100)/(stkDat.OSUsed + stkDat.OSFree), cpuusage, p_tcb->OSTCBTaskName); +// p_tcb = p_tcb->OSTCBPrev; +// } +// term_printf("\r\n"); + ptz_uart_dev_send(uart_485_handle, TempInfoGet(),80 ); + + OSTimeDlyHMSM(0u, 0u, 10u, 0u); } static void task_print_task() diff --git a/Hyt2/APP/Common/ptz_default_value.h b/Hyt2/APP/Common/ptz_default_value.h index 0b4b671..2e96f9e 100644 --- a/Hyt2/APP/Common/ptz_default_value.h +++ b/Hyt2/APP/Common/ptz_default_value.h @@ -98,11 +98,12 @@ /**********************************************************/ ///ű͵֮ļٱ - #define PTZ_VERT_MOTOR_RATIO 75.0//(50.0 * (52.0 / 35.0))//20.0 +// #define PTZ_VERT_MOTOR_RATIO 75.0//(50.0 * (52.0 / 35.0))//20.0 + #define PTZ_VERT_MOTOR_RATIO 35.15//(50.0 * (52.0 / 35.0))//20.0 ///ų֮̋ļٱ #define PTZ_VERT_BIG_GEAR_RATIO 80.0//54.00 ///ֱܼٱ - #define PTZ_VERT_RATIO 6000.0//4011.429//1080.0 + #define PTZ_VERT_RATIO 2812.0//4011.429//1080.0 ///ֱģѹֵ #define PTZ_VERT_VR_MAX 1999 ///ֱģѹСֵ @@ -114,11 +115,11 @@ ///ֱСת #define PTZ_VERT_MOTOR_MIN_SPEED 400.0//600.0 ///ֱ̨ת - #define PTZ_VERT_MAX_SPEED 0.5//0.74//2.7 + #define PTZ_VERT_MAX_SPEED 1.0//0.74//2.7 ///ֱ̨Сת - #define PTZ_VERT_MIN_SPEED 0.07//0.1//0.15//0.5 + #define PTZ_VERT_MIN_SPEED 0.15//0.1//0.15//0.5 ///ֱ̨Ĭٶ - #define PTZ_VERT_BEST_SPEED 0.4//0.7//2.0 + #define PTZ_VERT_BEST_SPEED 0.75//0.7//2.0 //ż diff --git a/Hyt2/APP/Device/device_Other/device_adc_collect.c b/Hyt2/APP/Device/device_Other/device_adc_collect.c index 7008c18..e7259bf 100644 --- a/Hyt2/APP/Device/device_Other/device_adc_collect.c +++ b/Hyt2/APP/Device/device_Other/device_adc_collect.c @@ -350,7 +350,7 @@ static void Ntc_value()//ADC1 float H_temp_f,V_temp_f;//ʼ¶,¶ short int H_temp,V_temp;//¶,¶ - adc_software_trigger_enable(ADC1,ADC_INSERTED_CHANNEL); + adc_software_trigger_enable(ADC1,ADC_REGULAR_INSERTED_CHANNEL); asm ("nop"); asm ("nop"); H_temp_f = Ntc_temp(ADC_IDATA2(ADC1)); @@ -424,7 +424,8 @@ static void ptz_Current_collect_adc1_task() adc_software_trigger_enable(ADC1,ADC_INSERTED_CHANNEL); value_I = ADC_IDATA0(ADC1); - adc1_i[adc0_num] = (((float)value_I / 4096.0 * 3.3)-3.3/2) / 0.132;//(float)value_I;// +// adc1_i[adc0_num] = (((float)value_I / 4096.0 * 3.3)-3.3/2) / 0.132;//(float)value_I;// + adc1_i[adc0_num] = ((float)value_I / 4096.0 * 3.3) / 0.25;//(float)value_I;// adc0_num ++; if(adc0_num >= 5) @@ -495,7 +496,7 @@ static void ptz_temperature_collect_tmp75_task() //ɼ static char ptz_data_collect_task() { - int i=0,j=0; +// int i=0,j=0; while(1) { @@ -510,30 +511,30 @@ static char ptz_data_collect_task() V_ADC0_Phase_current(); } - if(j >= 100) - { - j=0; - //̨Լرգ򿪲ɼ -#ifndef PTZ_NO_SELF_CHECK - ptz_Voltage_collect_adc1_task(); -#endif - OSTimeDlyHMSM(0u, 0u, 0u, 2u); - ptz_Current_collect_adc1_task(); -// OSTimeDlyHMSM(0u, 0u, 0u, 50u); - } - - if(i >= 3000) - {//¶ȲɼƵ - ptz_temperature_collect_tmp75_task(); - //·¶Ȳɼ - Ntc_value(); - i=0; - } +// if(j >= 100) +// { +// j=0; +// //̨Լرգ򿪲ɼ +//#ifndef PTZ_NO_SELF_CHECK +// ptz_Voltage_collect_adc1_task(); +//#endif +// OSTimeDlyHMSM(0u, 0u, 0u, 2u); +// ptz_Current_collect_adc1_task(); +//// OSTimeDlyHMSM(0u, 0u, 0u, 50u); +// } +// +// if(i >= 3000) +// {//¶ȲɼƵ +// ptz_temperature_collect_tmp75_task(); +// //·¶Ȳɼ +// Ntc_value(); +// i=0; +// } OSTimeDlyHMSM(0u, 0u, 0u, 1u); - i++; - j++; +// i++; +// j++; } } @@ -569,7 +570,7 @@ static void creat_task_data_collect(void) void init_data_collect_module(void) { //#ifndef PTZ_NO_SELF_CHECK - ADC1_Init();//ADɼųʼ +// ADC1_Init();//ADɼųʼ //#endif ADC2_Init();//ADɼųʼ ADC0_Init();//ADɼųʼ diff --git a/Hyt2/APP/Device/device_Other/device_heat.c b/Hyt2/APP/Device/device_Other/device_heat.c new file mode 100644 index 0000000..89a7fef --- /dev/null +++ b/Hyt2/APP/Device/device_Other/device_heat.c @@ -0,0 +1,493 @@ +#include "stdio.h" +#include "device_heat.h" +#include "gd32f4xx.h" +#include "ptz_struct.h" +#include "agent_hyt.h" +#include "pdebug.h" +#include "cpu.h" +#include "tmp75.h" +/* + * 温度采集使用的ADC1 +*/ + + +#define HC4051_S0_PIN GPIO_PIN_14 +#define HC4051_S0_PORT GPIOB +#define HC4051_S1_PIN GPIO_PIN_15 +#define HC4051_S1_PORT GPIOB + +#define HEAT_PIN GPIO_PIN_12 +#define HEAT_PORT GPIOA + + + +#define R_constant 10.0 //千欧姆——分压电阻值 + +// #define R_25 10000.0//热敏电阻常温下的电阻值 + +// #define Ntc_B 3435.0//常量B + +// #define Kelvin_temp 273.15+25//常温——开尔文温度 +//NTC电流 +static float Ntc_current(uint16_t data) +{ + static float curr; + curr = ((float)data / 4096.0 * 3.3)/R_constant; + return curr; + +} +//NTC电压 +static float Ntc_voltage(uint16_t data) +{ + static float voltage; + voltage = 3.3 - ((float)data / 4096.0 * 3.3); + return voltage; +} +//NTC电阻 +static float Ntc_resis(uint16_t data) +{ + static float resis,curr,voltage; + curr = Ntc_current(data); + voltage = Ntc_voltage(data); + resis = voltage / curr * 1000.0;//因为电流值放大了1000倍 + return resis; +} + +/*! + \brief ADC1初始化,电压,电流,NTC温度采集 + \param[in] none + \param[out] none + \retval none + \note LH @2022.07.21 +*/ +void ADC1_Init() +{ + //配置引脚时钟 + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_GPIOB); + //引脚复用,PC2——电压ADC1-CH12,PC3——电流ADC1-CH13 + gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_2); + gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_3); + /* H_NTC-PB0 ,V_NTC-PB1 */ + // gpio_mode_set(GPIOB,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_0); + gpio_mode_set(GPIOB,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_1); + + rcu_periph_clock_enable(RCU_ADC1); + //总线时钟20分频=6MHZ + adc_clock_config(ADC_ADCCK_PCLK2_DIV4); + /***********************************************/ + + //对齐方式 ADC_INSERTED_CHANNEL + adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT); + //扫描模式 + adc_special_function_config(ADC1,ADC_SCAN_MODE,ENABLE); + //外部触发关闭 + adc_external_trigger_config(ADC1,ADC_REGULAR_CHANNEL,DISABLE); + //采集通道数 + adc_channel_length_config(ADC1,ADC_INSERTED_CHANNEL, 3); + + //通道注入顺序 + adc_inserted_channel_config(ADC1, 0, ADC_CHANNEL_13, ADC_SAMPLETIME_480);//电流 + adc_inserted_channel_config(ADC1, 1, ADC_CHANNEL_12, ADC_SAMPLETIME_480);//电压 + adc_inserted_channel_config(ADC1, 2, ADC_CHANNEL_9, ADC_SAMPLETIME_480); + + adc_enable(ADC1); + + adc_calibration_enable(ADC1); + + + /* 初始化分时复用IO */ + gpio_mode_set(HC4051_S0_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HC4051_S0_PIN); + gpio_output_options_set(HC4051_S0_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HC4051_S0_PIN); + gpio_mode_set(HC4051_S1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HC4051_S1_PIN); + gpio_output_options_set(HC4051_S1_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HC4051_S1_PIN); + + /* 初始化加热引脚 */ + gpio_mode_set(HEAT_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HEAT_PIN); + gpio_output_options_set(HEAT_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HEAT_PIN); +} + +/*! + \brief 初始化分时复用控制引脚和加热使能引脚 + \param[in] none + \param[out] none + \retval none + \note psx @2025.07.31 +*/ +void heat_Init() +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + + /* 初始化分时复用IO */ + gpio_mode_set(HC4051_S0_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HC4051_S0_PIN); + gpio_output_options_set(HC4051_S0_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HC4051_S0_PIN); + gpio_mode_set(HC4051_S1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HC4051_S1_PIN); + gpio_output_options_set(HC4051_S1_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HC4051_S1_PIN); + gpio_bit_reset(HC4051_S0_PORT, HC4051_S0_PIN); + gpio_bit_reset(HC4051_S1_PORT, HC4051_S1_PIN); + + /* 初始化加热引脚 */ + gpio_mode_set(HEAT_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HEAT_PIN); + gpio_output_options_set(HEAT_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HEAT_PIN); +} + +/*! + \brief 分时复用温度采集选择为H_NTC +*/ +static void choose_H_NTC(void) +{ + gpio_bit_reset(HC4051_S0_PORT, HC4051_S0_PIN); + gpio_bit_reset(HC4051_S1_PORT, HC4051_S1_PIN); +} + +/*! + \brief 分时复用温度采集选择为V_NTC +*/ +static void choose_V_NTC(void) +{ + gpio_bit_set(HC4051_S0_PORT, HC4051_S0_PIN); + gpio_bit_reset(HC4051_S1_PORT, HC4051_S1_PIN); +} + +/*! + \brief 分时复用温度采集选择为EXT_NTC1 +*/ +static void choose_EXT_NTC1(void) +{ + gpio_bit_reset(HC4051_S0_PORT, HC4051_S0_PIN); + gpio_bit_set(HC4051_S1_PORT, HC4051_S1_PIN); +} + +/*! + \brief 分时复用温度采集选择为EXT_NTC2 +*/ +static void choose_EXT_NTC2(void) +{ + gpio_bit_set(HC4051_S0_PORT, HC4051_S0_PIN); + gpio_bit_set(HC4051_S1_PORT, HC4051_S1_PIN); +} + +typedef void(*pctr) (void); +pctr choose_ntc_func[4] = {&choose_H_NTC, &choose_V_NTC, &choose_EXT_NTC1, &choose_EXT_NTC2}; + +/*! + \brief 启动加热 +*/ +static void startHeat() +{ + gpio_bit_set(HEAT_PORT, HEAT_PIN); +} + +/*! + \brief 关闭加热 +*/ +static void closeHeat() +{ + gpio_bit_reset(HEAT_PORT, HEAT_PIN); +} + +//电压采集 +static void ptz_Voltage_collect_adc1_task() +{ + static uint32_t adc1_v[5]; + static unsigned char adc1_num; + int j,k; + float tem; + float curadc1; + uint16_t value_V; + + adc1_v[adc1_num] = ADC_IDATA1(ADC1); + + // adc1_v[adc1_num] = (float)value_V / 4096.0 * 11 *3.3;//(float)value_V;// + adc1_num++; + if (adc1_num >= 5) { + adc1_num = 0; + for (j = 0; j < 5-1; j++) {//采样值由小到大排列 + for (k = 0; k < 5-j-1; k++) { + if (adc1_v[k] > adc1_v[k+1]) { + tem = adc1_v[k]; + adc1_v[k] = adc1_v[k+1]; + adc1_v[k+1] = tem; + } + } + } + for (uint8_t i = 1; i < 5 - 1; i++) { + curadc1 = curadc1 + adc1_v[i]; + } + curadc1 = curadc1 /((float)(5 - 2));//去掉一个最大值和一个最小值求平均值 + g_ptz.Voltage = (float)curadc1 / 4096.0 * 11 *3.3;; + memset(adc1_v,0,sizeof(adc1_v)); + } +} + + +//电流采集 +static void ptz_Current_collect_adc1_task() +{ + static uint32_t adc1_i[5]; + static unsigned char adc1_num; + int j,k; + float tem; + float curadc0; + uint16_t value_I; + + adc1_i[adc1_num] = ADC_IDATA0(ADC1); + + adc1_num ++; + if (adc1_num >= 5) { + adc1_num = 0; + for (j = 0; j < 5-1; j++) {//采样值由小到大排列 + for (k = 0; k < 5-j-1; k++) { + if (adc1_i[k] > adc1_i[k+1]) { + tem = adc1_i[k]; + adc1_i[k] = adc1_i[k+1]; + adc1_i[k+1] = tem; + } + } + } + for (uint8_t i = 1; i < 5 - 1; i++) { + curadc0 = curadc0 + adc1_i[i]; + } + curadc0 = curadc0 /((float)(5 - 2));//去掉一个最大值和一个最小值求平均值 + g_ptz.electric_current = ((float)curadc0 / 4096.0 * 3.3) / 0.25; + + // memset(adc1_i, 0, sizeof(adc1_i)); + } +} + +typedef struct _heat_data { + float ext_ntc1; + float ext_ntc2; + float ntcT; +} heat_data; +heat_data m_heatData; + +//NTC温度计算,开尔文温度 +static float Ntc_temp(uint16_t adc_data, float Ntc_B) +{ + float R_ntc;//实际电阻 + double temp,K,j,l,m;//实际温度 + R_ntc = Ntc_resis(adc_data); + K = R_ntc/10000.0; + j = log(K);//log e为底数 + l = j / Ntc_B; + m = 1.0 /298.15; + temp = 1/(l+m); +// temp = 1/(j / Ntc_B + 1/Kelvin_temp); + return (float)temp; +} + +//温度采集并加热 +static void ptz_heat_collect_adc1_task() +{ + static uint32_t adc1_T[4][5]; + static uint8_t adc1_num = 0; + static uint8_t ntc_num = 0; + + adc1_T[ntc_num][adc1_num] = ADC_IDATA2(ADC1); + + if (++ntc_num < 4) { + choose_ntc_func[ntc_num](); + return; + } + ntc_num = 0; + choose_ntc_func[ntc_num](); + if (++adc1_num < 5) { + return; + } + adc1_num = 0; + + uint32_t temp; + uint32_t adc_data = 0; + + /* 采集H_NTC温度 */ + for (int j = 0; j < 5-1; j++) {//采样值由小到大排列 + for (int k = 0; k < 5-j-1; k++) { + if (adc1_T[0][k] > adc1_T[0][k+1]) { + temp = adc1_T[0][k]; + adc1_T[0][k] = adc1_T[0][k+1]; + adc1_T[0][k+1] = temp; + } + } + } + for(uint8_t i = 1; i < 5 - 1; i++) { + adc_data += adc1_T[0][i]; + } + adc_data = adc_data / 3; + g_ptz.H_boad_temp = (short int)(Ntc_temp(adc_data, 3450.0f) - 273.15 + 0.5); + adc_data = 0; + + /* 采集V_NTC温度 */ + for (int j = 0; j < 5-1; j++) { + for (int k = 0; k < 5-j-1; k++) { + if (adc1_T[1][k] > adc1_T[1][k+1]) { + temp = adc1_T[1][k]; + adc1_T[1][k] = adc1_T[1][k+1]; + adc1_T[1][k+1] = temp; + } + } + } + for(uint8_t i = 1; i < 5 - 1; i++) { + adc_data += adc1_T[1][i]; + } + adc_data = adc_data / 3; + g_ptz.V_boad_temp = (short int)(Ntc_temp(adc_data, 3450.0f) - 273.15 + 0.5); + adc_data = 0; + + /* 采集EXT_NTC1温度 */ + for (int j = 0; j < 5-1; j++) { + for (int k = 0; k < 5-j-1; k++) { + if (adc1_T[2][k] > adc1_T[2][k+1]) { + temp = adc1_T[2][k]; + adc1_T[2][k] = adc1_T[2][k+1]; + adc1_T[2][k+1] = temp; + } + } + } + for(uint8_t i = 1; i < 5 - 1; i++) { + adc_data += adc1_T[2][i]; + } + adc_data = adc_data / 3; + m_heatData.ext_ntc1 = (short int)(Ntc_temp(adc_data, 3950.0f) - 273.15 + 0.5); + adc_data = 0; + + /* 采集EXT_NTC2温度 */ + for (int j = 0; j < 5-1; j++) { + for (int k = 0; k < 5-j-1; k++) { + if (adc1_T[3][k] > adc1_T[3][k+1]) { + temp = adc1_T[3][k]; + adc1_T[3][k] = adc1_T[3][k+1]; + adc1_T[3][k+1] = temp; + } + } + } + for(uint8_t i = 1; i < 5 - 1; i++) { + adc_data += adc1_T[3][i]; + } + adc_data = adc_data / 3; + m_heatData.ext_ntc2 = (short int)(Ntc_temp(adc_data, 3950.0f) - 273.15 + 0.5); + adc_data = 0; + + //判定是否需要加热 + if (g_ptz.H_boad_temp < -25 || g_ptz.V_boad_temp < -25 + || m_heatData.ext_ntc1 < -25 || m_heatData.ext_ntc2 < -25) { + startHeat(); + } + else if (g_ptz.H_boad_temp > -15 && g_ptz.V_boad_temp > -15 + && m_heatData.ext_ntc1 > -15 && m_heatData.ext_ntc2 > -15) { + closeHeat(); + } +} + + +//温度采集 +static void ptz_temperature_collect_tmp75_task() +{ + static float tmp75[5]; + static unsigned char tmp75_num; + float curtmp75; + float tem; + int j,k; + tmp75[tmp75_num] = tmp75_read_temp(); + tmp75_num ++; + if(tmp75_num >= 5) + { + tmp75_num = 0; + for(j = 0; j < 5-1; j++)//采样值由小到大排列 + { + for(k = 0; k < 5-j-1; k++) + { + if(tmp75[k] > tmp75[k+1]) + { + tem = tmp75[k]; + tmp75[k] = tmp75[k+1]; + tmp75[k+1] = tem; + } + } + } + for(uint8_t i = 1; i < 5 - 1; i++) + { + curtmp75 = curtmp75 + tmp75[i];//去掉一个最大值和一个最小值 + } + curtmp75 = curtmp75 / ((float)(5 - 2)); + g_ptz.temperature = curtmp75; + memset(tmp75,0,sizeof(tmp75)); +// pdebug(DEBUG_LEVEL_INFO,"get ptz Temperature: %.3f℃",g_ptz.temperature); + } + +} + +/*! + \brief 采集并加热任务 +*/ +static char ptz_heat_data_collect_task() +{ + static uint16_t ntc_num = 0; + + while (1) { + adc_software_trigger_enable(ADC1, ADC_INSERTED_CHANNEL); + // OSTimeDlyHMSM(0u, 0u, 0u, 1u); + while (!adc_flag_get(ADC1, ADC_FLAG_EOC)) { + OSTimeDlyHMSM(0u, 0u, 0u, 1u); + } + adc_flag_clear(ADC1, ADC_FLAG_EOC); + + ptz_Voltage_collect_adc1_task(); + ptz_Current_collect_adc1_task(); + ptz_temperature_collect_tmp75_task(); + ptz_heat_collect_adc1_task(); + + OSTimeDlyHMSM(0u, 0u, 0u, 100u); + } +} + +static OS_STK task_heat_data_collect_stk[TASK_PTZ_HEAT_DATA_COLLECT_STK_SIZE]; +static void creat_heat_task_data_collect(void) +{ + CPU_INT08U task_err; + CPU_INT08U name_err; + + task_err = OSTaskCreateExt((void (*)(void *)) ptz_heat_data_collect_task, + (void *) 0, + (OS_STK *)&task_heat_data_collect_stk[TASK_PTZ_HEAT_DATA_COLLECT_STK_SIZE - 1], + (INT8U ) TASK_PTZ_HEAT_DATA_COLLECT_PRIO, + (INT16U ) TASK_PTZ_HEAT_DATA_COLLECT_PRIO, + (OS_STK *)&task_heat_data_collect_stk[0], + (INT32U ) TASK_PTZ_HEAT_DATA_COLLECT_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_DATA_COLLECT_PRIO, "ptz_heat_data_collect_task", &name_err); + #endif + if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) { + pdebug(DEBUG_LEVEL_INFO,"create ptz_heat_data_collect_task success\r\n"); + } else { + pdebug(DEBUG_LEVEL_FATAL,"create ptz_heat_data_collect_task failed\r\n"); + } +} + +void Init_ptz_heat_data_collect_task() +{ + ADC1_Init(); + heat_Init(); + creat_heat_task_data_collect(); +} + +static char g_str[80]; +char* TempInfoGet(void) +{ + /*加热*/ + if ( gpio_input_bit_get(HEAT_PORT, HEAT_PIN) ) + { + sprintf(g_str, "extTemp1 = %.2f, extTemp2 = %.2f,heating!\r\nH_Temp = %.2f, V_Temp = %.2f\r\n\r\n", m_heatData.ext_ntc1, m_heatData.ext_ntc2, g_ptz.H_boad_temp, g_ptz.V_boad_temp); + } + else + { + sprintf(g_str, "extTemp1 = %.2f, extTemp2 = %.2f,Noheating!\r\nH_Temp = %.2f, V_Temp = %.2f\r\n\r\n", m_heatData.ext_ntc1, m_heatData.ext_ntc2, g_ptz.H_boad_temp, g_ptz.V_boad_temp); + } + return &g_str[0]; +} + + + diff --git a/Hyt2/APP/Device/device_Other/device_heat.h b/Hyt2/APP/Device/device_Other/device_heat.h new file mode 100644 index 0000000..fda8076 --- /dev/null +++ b/Hyt2/APP/Device/device_Other/device_heat.h @@ -0,0 +1,12 @@ +#ifndef __DEVICE_HEAD_H_ +#define __DEVICE_HEAD_H_ + + +#define TASK_PTZ_HEAT_DATA_COLLECT_PRIO 52u +#define TASK_PTZ_HEAT_DATA_COLLECT_STK_SIZE 200u + + +void Init_ptz_heat_data_collect_task(); +char* TempInfoGet(void); + +#endif diff --git a/Hyt2/BSP/Driver/as5047d/as5047d.h b/Hyt2/BSP/Driver/as5047d/as5047d.h index b0074c1..5c4f24a 100644 --- a/Hyt2/BSP/Driver/as5047d/as5047d.h +++ b/Hyt2/BSP/Driver/as5047d/as5047d.h @@ -2,7 +2,7 @@ #define __AS5047D_H_ #include "gd32f4xx.h" -//#define TMR3109 1 +#define TMR3109 1 #if !(AS5047) && !(TMR3109) #define AS5047 diff --git a/Hyt2/BSP/Driver/full_bridge/full_bridge.c b/Hyt2/BSP/Driver/full_bridge/full_bridge.c index dda1723..e503915 100644 --- a/Hyt2/BSP/Driver/full_bridge/full_bridge.c +++ b/Hyt2/BSP/Driver/full_bridge/full_bridge.c @@ -370,9 +370,9 @@ void h_bldc_six_step() if(g_ptz.hori_direction_set == PTZ_HORI_DIR_RIGHT) {//ת- 1 - h_six_step_commu[H_Hall_state.Hall_value -1](); - }else{//ת h_six_step_commu[(7-H_Hall_state.Hall_value) -1](); + }else{//ת + h_six_step_commu[H_Hall_state.Hall_value -1](); } @@ -397,9 +397,9 @@ void v_bldc_six_step() { if(g_ptz.vert_direction_set == PTZ_VERT_DIR_UP) {//ת- 1 - v_six_step_commu[V_Hall_state.Hall_value -1](); - }else{//ת v_six_step_commu[(7-V_Hall_state.Hall_value) -1](); + }else{//ת + v_six_step_commu[V_Hall_state.Hall_value -1](); } diff --git a/Hyt2/BSP/IAR/GD32F450xE.icf b/Hyt2/BSP/IAR/GD32F450xE.icf index 67e4732..3074568 100644 --- a/Hyt2/BSP/IAR/GD32F450xE.icf +++ b/Hyt2/BSP/IAR/GD32F450xE.icf @@ -2,9 +2,9 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08010000; +define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08010000; +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF; diff --git a/Hyt2/PROJECT/OS2.ewp b/Hyt2/PROJECT/OS2.ewp index 9560210..ac274ae 100644 --- a/Hyt2/PROJECT/OS2.ewp +++ b/Hyt2/PROJECT/OS2.ewp @@ -825,7 +825,7 @@