This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/application/src/mode_pwmp_hd.c

228 lines
4.6 KiB
C

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "mode_pwmp_hd.h"
#include "mode.h"
#include "entity.h"
#include "board.h"
#include "pdctrl.h"
#include "pid.h"
#include "convert.h"
#include "at_hc24.h"
mode_minor_t *mode_minor;
static execute_rsp_t *execute_dac_plan1(void); // 执行方案1
static execute_rsp_t *execute_dac_plan2(void); // 执行方案2
static execute_rsp_t *execute_dac_plan3(void); // 执行方案3
static execute_rsp_t *execute_dac_plan4(void); // 执行方案4
/*********************************** 控制任务 ***********************************/
// 算法方案初始化
void minor_pid_init(execute_plan_minor_e plan)
{
switch (plan)
{
case EXECUTE_PLAN_1:
break;
case EXECUTE_PLAN_2:
break;
case EXECUTE_PLAN_3:
break;
case EXECUTE_PLAN_4:
default:
break;
}
}
// 算法方案执行
void execute_dac(execute_plan_minor_e plan)
{
switch (plan)
{
case EXECUTE_PLAN_1:
execute_dac_plan1();
case EXECUTE_PLAN_2:
execute_dac_plan2();
case EXECUTE_PLAN_3:
execute_dac_plan3();
case EXECUTE_PLAN_4:
execute_dac_plan4();
default:
mode_minor->execute.code = EXECUTE_NONE;
}
}
// 执行方案1
static execute_rsp_t *execute_dac_plan1(void)
{
return 0;
}
// 执行方案2
static execute_rsp_t *execute_dac_plan2(void)
{
return 0;
}
// 执行方案3
static execute_rsp_t *execute_dac_plan3(void)
{
return 0;
}
// 执行方案4
static execute_rsp_t *execute_dac_plan4(void)
{
return 0;
}
// 控制进程
static void mode_minor_control(void)
{
}
/*********************************** 整定任务 ***********************************/
// 同步整定参数
static void minor_public_params_update(void)
{
}
// 启动整定
static void minor_adjust_start(void)
{
// 设置整定阶段
mode_minor->adjust.step = MINOR_ADJUST_IDEL;
// 使能整定
mode_minor->adjust.enable = TRUE;
// 初始化整定状态
mode_minor->adjust_state = ADJUST_ONGING;
}
// 停止整定
static void minor_adjust_stop(void)
{
// 输出最小值
pdctrl_out(CON_MIN);
// 清除整定任务
osel_memset((uint8_t *)&mode_minor->adjust, 0, sizeof(minor_adjust_t));
// 切换控制状态
minor_process_state_set(MINOR_PROCESS_CONTROL);
}
// 整定进程
static void mode_minor_adjust(void)
{
uint8_t ts = 0;
if (mode_minor->adjust.enable != TRUE)
{
minor_adjust_start();
}
ts = mode_minor->adjust.execute_step;
BIT_CLR(ts, BIT7);
switch (ts)
{
default:
minor_adjust_stop();
break;
}
}
/*********************************** 停止任务 ***********************************/
static void mode_minor_stop(void)
{
minor_adjust_stop();
}
/*********************************** 模式管理 ***********************************/
// 设置任务
void minor_process_state_set(mode_minor_process_state_e state)
{
if (mode_minor->process_state == state)
{
return;
}
// 如果当前正在整定,切换任务前要求停止整定
if (mode_minor->process_state == MINOR_PROCESS_ADJUST)
{
minor_adjust_stop();
}
// 切换任务
mode_minor->process_state = state;
}
// 模式进程
void mode_minor_process(void)
{
switch (mode_minor->process_state)
{
case MINOR_PROCESS_CONTROL:
mode_minor_control();
break;
case MINOR_PROCESS_ADJUST:
mode_minor_adjust();
break;
case MINOR_PROCESS_STOP:
mode_minor_stop();
break;
case MINOR_PROCESS_TEST:
{
pdctrl_out(mode_minor->test.output);
mode_minor->test.travel_adc = adc_result_median(ADCS_1, ADC_PSB_CHANNEL);
mode_minor->test.minor_adc = adc_result_median(ADCS_1, ADC_IPSB_CHANNEL);
mode_minor->test.drive_current = ip2current();
break;
}
default:
break;
}
}
// 模式初始化
void mode_minor_init(uint16_t positioner_model, mode_pwmp_hd_params_u *params, void (*params_save_cb)(void))
{
DBG_ASSERT(params != NULL __DBG_LINE);
DBG_ASSERT(params_save_cb != NULL __DBG_LINE);
// 使能大电流
VIP_H_EN_ENABLE();
// 分配空间
if (mode_minor == NULL)
{
mode_minor = (mode_minor_t *)osel_mem_alloc(sizeof(mode_minor_t));
}
osel_memset((uint8_t *)mode_minor, 0, sizeof(mode_minor_t));
// 初始化滤波器
mode_minor->target_lpf.handle = lpf_window_init(20);
mode_minor->actual_lpf.handle = lpf_window_init(20);
// 初始化控制器
minor_pid_init(EXECUTE_PLAN);
// 绑定存储参数
mode_minor->save = params;
mode_minor->params_save_cb = params_save_cb;
// 保存模式参数
mode_minor->params_save_cb();
// 更新公共参数
minor_public_params_update();
// 初始化任务
minor_process_state_set(MINOR_PROCESS_CONTROL);
}
// 模式反初始化
void mode_minor_dinit(void)
{
if (mode_minor != NULL)
{
minor_process_state_set(MINOR_PROCESS_STOP);
osel_mem_free(mode_minor);
mode_minor = NULL;
}
}