00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00029
00030
00031
00032 #ifndef SENSORLESS_H
00033 #define SENSORLESS_H
00034
00035
00036
00037
00038 #include "DSP2833x_Device.h"
00039 #include "Constants.h"
00040 #include "QDOperations.h"
00041 #include "DataStorage.h"
00042 #include "FilterAndRotations.h"
00043 #include "Utils.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 extern void FillCarrierTable(_iq* carrierTable,
00061 const Uint16 carrierPoints, const Uint16 synchoCycles);
00062 extern void InitPLL(_iq dTDiv2, _iq saliencyOrder, _iq BO_LPF, _iq A1_LPF);
00063 extern void InitPulsatingCarrierDemodulator(_iq dTDiv2, _iq BO_LPF, _iq A1_LPF,
00064 _iq BO_HPF, _iq A1_HPF);
00065 static inline _iq CarrierAngle(void);
00066 static inline void RotatingCarrierVoltage(volatile _iq* Vhf,
00067 volatile struct sqddata* vs_s_c, volatile _iq* theta_c);
00068 static inline void PulsatingCarrierVoltage(volatile _iq* Vhf,
00069 volatile struct sqddata* vs_s_c, volatile _iq* theta_c, volatile _iq* erp);
00070 static inline void PLL(struct qddata iqds_n, volatile data* erp);
00071 static inline void DemodulatePulsatingCarrier(volatile struct qddata* iqds_s,volatile data* erp,
00072 volatile _iq* theta_hat, volatile _iq theta_c);
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 struct SensorlessConfiguration{
00083 _iq* carrierDataTable;
00084 Uint16 carrierPoints;
00085 Uint16 carrierIndx;
00086 Uint16 carrierSynchro;
00087 _iq dTDiv2;
00088 _iq saliencyOrder;
00089 _iq BO_LPF,A1_LPF;
00090 _iq BO_HPF,A1_HPF;
00091 };
00092
00093 extern volatile struct SensorlessConfiguration sensorlessConf;
00094
00095
00096
00097
00098
00099 extern volatile data h_erp;
00100 extern volatile data delta_erp;
00101 extern volatile data error_erp;
00102 extern volatile data erp;
00103
00104
00105
00106
00107
00108
00109 extern volatile struct sqddata vs_e_c;
00110 extern volatile struct qddata iqds_e_puls;
00111 extern volatile struct qddata iqds_s_hpf_puls;
00112 extern volatile struct qddata iqds_s_hpf_hpf_puls;
00113 extern volatile struct qddata iqds_ce;
00114 extern volatile struct qddata iqds_ce_lpf;
00115 extern volatile struct qddata iqds_e_lpf_hb;
00116 extern volatile struct qddata iqds_nce;
00117 extern volatile struct qddata iqds_nce_lpf;
00118 extern volatile struct qddata iqds_e_lpf_lb;
00119 extern volatile struct qddata iqds_e_lpf;
00120 extern volatile struct qddata iqds_e_lpf_ca;
00121 extern volatile struct qddata iqds_e_lpf_ca_lpf;
00122 extern volatile data theta_hat_error;
00123 extern volatile data wr_hat_pulsC;
00124 extern _iq Kp_Puls,Ki_Puls;
00125 extern volatile _iq iqds_e_lpf_q;
00126
00127
00128
00129
00130
00132
00133 static inline _iq CarrierAngle(void)
00134 {
00135 _iq theta_c=sensorlessConf.carrierDataTable[
00136 sensorlessConf.carrierIndx%sensorlessConf.carrierPoints];
00137 if(++sensorlessConf.carrierIndx==sensorlessConf.carrierSynchro)
00138 sensorlessConf.carrierIndx=0;
00139 return theta_c;
00140 }
00141
00142
00143
00144
00145
00147
00148 static inline void RotatingCarrierVoltage(volatile _iq* Vhf,
00149 volatile struct sqddata* vs_s_c, volatile _iq* theta_c)
00150 {
00151 *theta_c = CarrierAngle();
00152 SSCALAR2SYNCVEC(*Vhf,(*vs_s_c),(*theta_c));
00153 }
00154
00155
00156
00157
00158
00160
00161 static inline void PulsatingCarrierVoltage(volatile _iq* Vhf,
00162 volatile struct sqddata* vs_s_c, volatile _iq* theta_c, volatile _iq* erp)
00163 {
00164 struct sqddata vs_e_c;
00165 *theta_c = CarrierAngle();
00166 SSCALAR2PULSATING(*Vhf,vs_e_c,(*theta_c));
00167 SROTATE_NEG(vs_e_c,(*vs_s_c),(*erp));
00168 }
00169
00170
00171
00172
00173
00176
00177 static inline void PLL(struct qddata iqds_n, volatile data* erp)
00178 {
00179
00180
00181 h_erp[N]=h_erp[N1]+_IQmpy(sensorlessConf.saliencyOrder,delta_erp[N1]);
00182
00183 WRAP2PI(h_erp[N]);
00184
00185
00186
00187
00188 CROSS_QDDATA(iqds_n,h_erp[N],error_erp[N]);
00189
00190 WRAP2PI(error_erp[N]);
00191
00192
00193 FILTER_LPF(error_erp,(*erp),sensorlessConf.BO_LPF,sensorlessConf.A1_LPF);
00194
00195
00196
00197 WRAP2PI((*erp)[N]);
00198
00199 delta_erp[N]=*erp[N]-*erp[N1];
00200
00201 WRAP2PI(delta_erp[N]);
00202
00203 UPDATE_STATE(h_erp);
00204 UPDATE_STATE(delta_erp);
00205 UPDATE_STATE(error_erp);
00206
00207
00208
00209 }
00210
00211
00212
00213
00214
00217
00218 static inline void DemodulatePulsatingCarrier(volatile struct qddata* iqds_s,
00219 volatile data* erp, volatile _iq* theta_hat, volatile _iq theta_c)
00220 {
00221
00222
00223
00224 FILTER_QD_HPF((*iqds_s),iqds_s_hpf_puls,sensorlessConf.BO_HPF,sensorlessConf.A1_HPF);
00225 FILTER_QD_HPF(iqds_s_hpf_puls,iqds_s_hpf_hpf_puls,sensorlessConf.BO_HPF,sensorlessConf.A1_HPF);
00226 ROTATE_POS(iqds_s_hpf_hpf_puls,iqds_e_puls, (*theta_hat));
00227
00228 ROTATE_POS(iqds_e_puls,iqds_ce,theta_c);
00229
00230 FILTER_QD_LPF(iqds_ce,iqds_ce_lpf,sensorlessConf.BO_LPF,sensorlessConf.A1_LPF);
00231 ROTATE_NEG(iqds_ce_lpf,iqds_e_lpf_hb,theta_c);
00232
00233
00234 ROTATE_NEG(iqds_e_puls,iqds_nce,theta_c);
00235
00236 FILTER_QD_LPF(iqds_nce,iqds_nce_lpf,sensorlessConf.BO_LPF,sensorlessConf.A1_LPF);
00237 ROTATE_POS(iqds_nce_lpf,iqds_e_lpf_lb,theta_c);
00238
00239
00240
00241
00242 SUM_QD_DATA(iqds_e_lpf_hb,iqds_e_lpf_lb,iqds_e_lpf);
00243
00244
00245 iqds_e_lpf_q=iqds_e_lpf.q[N];
00246
00247 ROTATE_NEG_ESC(iqds_e_lpf.q[N],iqds_e_lpf_ca,theta_c);
00248
00249 FILTER_QD_LPF(iqds_e_lpf_ca,iqds_e_lpf_ca_lpf,sensorlessConf.BO_LPF,sensorlessConf.A1_LPF);
00250
00251
00252
00253 theta_hat_error[N]=iqds_e_lpf_ca_lpf.q[N];
00254
00255
00256
00257 PI_REG_DT(theta_hat_error,wr_hat_pulsC,Kp_Puls,Ki_Puls,sensorlessConf.dTDiv2);
00258 INT_DT(wr_hat_pulsC,(*erp),sensorlessConf.dTDiv2);
00259
00260 WRAP2PI((*erp)[N]);
00261
00262 UPDATEQD_STATE(iqds_s_hpf_puls);
00263 UPDATEQD_STATE(iqds_s_hpf_hpf_puls);
00264 UPDATEQD_STATE(iqds_e_puls);
00265 UPDATEQD_STATE(iqds_ce);
00266 UPDATEQD_STATE(iqds_ce_lpf);
00267 UPDATEQD_STATE(iqds_e_lpf_hb);
00268 UPDATEQD_STATE(iqds_nce);
00269 UPDATEQD_STATE(iqds_nce_lpf);
00270 UPDATEQD_STATE(iqds_e_lpf_lb);
00271 UPDATEQD_STATE(iqds_e_lpf);
00272 UPDATEQD_STATE(iqds_e_lpf_ca);
00273 UPDATEQD_STATE(iqds_e_lpf_ca_lpf);
00274 UPDATE_STATE(theta_hat_error);
00275 UPDATE_STATE(wr_hat_pulsC);
00276
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 #endif
00295
00296
00297
00298
00299