1 /*
2 * Copyright (c) 2023 HPMicro
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #include "hpm_qeiv2_drv.h"
9 #include "hpm_enc_pos_drv.h"
10
qeiv2_config_phcnt_cmp_match_condition(QEIV2_Type * qeiv2_x,qeiv2_phcnt_cmp_match_config_t * config)11 hpm_stat_t qeiv2_config_phcnt_cmp_match_condition(QEIV2_Type *qeiv2_x, qeiv2_phcnt_cmp_match_config_t *config)
12 {
13 if (qeiv2_check_spd_tmr_as_pos_angle(qeiv2_x)) {
14 return status_fail;
15 }
16 qeiv2_set_phcnt_cmp_value(qeiv2_x, config->phcnt_cmp_value);
17 qeiv2_set_spd_pos_cmp_value(qeiv2_x, 0);
18 qeiv2_set_z_cmp_value(qeiv2_x, config->zcmp_value);
19 qeiv2_set_cmp_match_option(qeiv2_x, config->ignore_zcmp, false, false, config->ignore_rotate_dir, config->rotate_dir, true, qeiv2_pos_dir_decrease);
20 return status_success;
21 }
22
qeiv2_config_position_cmp_match_condition(QEIV2_Type * qeiv2_x,qeiv2_pos_cmp_match_config_t * config)23 hpm_stat_t qeiv2_config_position_cmp_match_condition(QEIV2_Type *qeiv2_x, qeiv2_pos_cmp_match_config_t *config)
24 {
25 if (!qeiv2_check_spd_tmr_as_pos_angle(qeiv2_x)) {
26 return status_fail;
27 }
28 qeiv2_set_spd_pos_cmp_value(qeiv2_x, config->pos_cmp_value);
29 qeiv2_set_cmp_match_option(qeiv2_x, true, true, false, true, qeiv2_rotate_dir_forward, config->ignore_pos_dir, config->pos_dir);
30 return status_success;
31 }
32
qeiv2_config_phcnt_cmp2_match_condition(QEIV2_Type * qeiv2_x,qeiv2_phcnt_cmp_match_config_t * config)33 hpm_stat_t qeiv2_config_phcnt_cmp2_match_condition(QEIV2_Type *qeiv2_x, qeiv2_phcnt_cmp_match_config_t *config)
34 {
35 if (qeiv2_check_spd_tmr_as_pos_angle(qeiv2_x)) {
36 return status_fail;
37 }
38 qeiv2_set_phcnt_cmp2_value(qeiv2_x, config->phcnt_cmp_value);
39 qeiv2_set_spd_pos_cmp2_value(qeiv2_x, 0);
40 qeiv2_set_z_cmp2_value(qeiv2_x, config->zcmp_value);
41 qeiv2_set_cmp2_match_option(qeiv2_x, config->ignore_zcmp, false, false, config->ignore_rotate_dir, config->rotate_dir, true, qeiv2_pos_dir_decrease);
42 return status_success;
43 }
44
qeiv2_config_position_cmp2_match_condition(QEIV2_Type * qeiv2_x,qeiv2_pos_cmp_match_config_t * config)45 hpm_stat_t qeiv2_config_position_cmp2_match_condition(QEIV2_Type *qeiv2_x, qeiv2_pos_cmp_match_config_t *config)
46 {
47 if (!qeiv2_check_spd_tmr_as_pos_angle(qeiv2_x)) {
48 return status_fail;
49 }
50 qeiv2_set_spd_pos_cmp2_value(qeiv2_x, config->pos_cmp_value);
51 qeiv2_set_cmp2_match_option(qeiv2_x, true, true, false, true, qeiv2_rotate_dir_forward, config->ignore_pos_dir, config->pos_dir);
52 return status_success;
53 }
54
qeiv2_get_uvw_position_defconfig(qeiv2_uvw_config_t * config)55 void qeiv2_get_uvw_position_defconfig(qeiv2_uvw_config_t *config)
56 {
57 config->pos_opt = qeiv2_uvw_pos_opt_current;
58
59 config->u_pos_sel[0] = qeiv2_uvw_pos_sel_high;
60 config->v_pos_sel[0] = qeiv2_uvw_pos_sel_low;
61 config->w_pos_sel[0] = qeiv2_uvw_pos_sel_high;
62
63 config->u_pos_sel[1] = qeiv2_uvw_pos_sel_high;
64 config->v_pos_sel[1] = qeiv2_uvw_pos_sel_low;
65 config->w_pos_sel[1] = qeiv2_uvw_pos_sel_low;
66
67 config->u_pos_sel[2] = qeiv2_uvw_pos_sel_high;
68 config->v_pos_sel[2] = qeiv2_uvw_pos_sel_high;
69 config->w_pos_sel[2] = qeiv2_uvw_pos_sel_low;
70
71 config->u_pos_sel[3] = qeiv2_uvw_pos_sel_low;
72 config->v_pos_sel[3] = qeiv2_uvw_pos_sel_high;
73 config->w_pos_sel[3] = qeiv2_uvw_pos_sel_low;
74
75 config->u_pos_sel[4] = qeiv2_uvw_pos_sel_low;
76 config->v_pos_sel[4] = qeiv2_uvw_pos_sel_high;
77 config->w_pos_sel[4] = qeiv2_uvw_pos_sel_high;
78
79 config->u_pos_sel[5] = qeiv2_uvw_pos_sel_low;
80 config->v_pos_sel[5] = qeiv2_uvw_pos_sel_low;
81 config->w_pos_sel[5] = qeiv2_uvw_pos_sel_high;
82
83 config->pos_cfg[0] = encoder_deg_to_position(30);
84 config->pos_cfg[1] = encoder_deg_to_position(90);
85 config->pos_cfg[2] = encoder_deg_to_position(150);
86 config->pos_cfg[3] = encoder_deg_to_position(210);
87 config->pos_cfg[4] = encoder_deg_to_position(270);
88 config->pos_cfg[5] = encoder_deg_to_position(330);
89 }
90
qeiv2_config_uvw_position(QEIV2_Type * qeiv2_x,qeiv2_uvw_config_t * config)91 hpm_stat_t qeiv2_config_uvw_position(QEIV2_Type *qeiv2_x, qeiv2_uvw_config_t *config)
92 {
93 qeiv2_set_uvw_position_opt(qeiv2_x, config->pos_opt);
94 for (uint8_t i = 0; i < 6; i++) {
95 if (config->pos_opt == qeiv2_uvw_pos_opt_next) {
96 if ((config->u_pos_sel[i] == qeiv2_uvw_pos_sel_edge)
97 || (config->v_pos_sel[i] == qeiv2_uvw_pos_sel_edge)
98 || (config->w_pos_sel[i] == qeiv2_uvw_pos_sel_edge)) {
99 return status_invalid_argument;
100 }
101 }
102 }
103
104 for (uint8_t i = 0; i < 6; i++) {
105 if (config->pos_opt == qeiv2_uvw_pos_opt_next) {
106 qeiv2_set_uvw_position_sel(qeiv2_x, i,
107 (config->u_pos_sel[i] == qeiv2_uvw_pos_sel_high) ? QEIV2_UVW_POS_OPT_NEX_SEL_HIGH : QEIV2_UVW_POS_OPT_NEX_SEL_LOW,
108 (config->v_pos_sel[i] == qeiv2_uvw_pos_sel_high) ? QEIV2_UVW_POS_OPT_NEX_SEL_HIGH : QEIV2_UVW_POS_OPT_NEX_SEL_LOW,
109 (config->w_pos_sel[i] == qeiv2_uvw_pos_sel_high) ? QEIV2_UVW_POS_OPT_NEX_SEL_HIGH : QEIV2_UVW_POS_OPT_NEX_SEL_LOW,
110 true);
111 } else {
112 qeiv2_set_uvw_position_sel(qeiv2_x, i, config->u_pos_sel[i], config->v_pos_sel[i], config->w_pos_sel[i], true);
113 }
114 qeiv2_set_uvw_position(qeiv2_x, i, config->pos_cfg[i]);
115 }
116
117 return status_success;
118 }
119