• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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