|
|
@@ -28,6 +28,7 @@ inserted ADC 由timer0 ch3触发,
|
|
|
|
|
|
#define ADC_RANK_CHANNEL(c) ((c)<<ISQ3_OFFSET | (0)<<IL_OFFSET)
|
|
|
#define ADC_INS_RANK_4_CHANS(c1,c2,c3,c4) (((c1)<<ISQ0_OFFSET) | ((c2)<<ISQ1_OFFSET) | ((c3)<<ISQ2_OFFSET) | ((c4)<<ISQ3_OFFSET) | ((3)<<IL_OFFSET))
|
|
|
+#define INJ_CHAN_NUM 1
|
|
|
|
|
|
#ifndef HIGH_SIDE_CURRENT_SENSOR
|
|
|
static u32 adc0_rank_channels[3] = {
|
|
|
@@ -54,55 +55,62 @@ static u32 volatile * adc_phase_reg2[3] = {
|
|
|
&ADC_IDATA0(ADC1),//2, C
|
|
|
};
|
|
|
#endif
|
|
|
-#ifdef CONFIG_SW_MUTISAMPLE
|
|
|
-static s32 __inline _adc_avg(s32 *v) {
|
|
|
- s32 max_v = 0;
|
|
|
- s32 min_v = 4096*32;
|
|
|
- s32 total_v = 0;
|
|
|
- for (int i = 0; i < 4; i++) {
|
|
|
- if (v[i] > max_v) {
|
|
|
- max_v = v[i];
|
|
|
- }else if (v[i] < min_v) {
|
|
|
- min_v = v[i];
|
|
|
- }
|
|
|
- total_v += v[i];
|
|
|
- }
|
|
|
- total_v -= (max_v + min_v);
|
|
|
- return (total_v>>1);
|
|
|
-
|
|
|
-}
|
|
|
-#endif
|
|
|
-static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
|
|
|
+
|
|
|
+#define v_calc(sum, v, min, max) \
|
|
|
+ do { \
|
|
|
+ if (v > max) { \
|
|
|
+ max = v; \
|
|
|
+ } \
|
|
|
+ if (v < min) { \
|
|
|
+ min = v; \
|
|
|
+ }\
|
|
|
+ sum += v; \
|
|
|
+ }while(0);
|
|
|
+
|
|
|
+static void __inline adc_phase_current_read(u8 phases, s32 *pv1, s32 *pv2) {
|
|
|
#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
-#ifdef CONFIG_SW_MUTISAMPLE
|
|
|
- s32 v[4];
|
|
|
- v[0] = ADC_IDATA0(ADC0);
|
|
|
- v[1] = ADC_IDATA1(ADC1);
|
|
|
- v[2] = ADC_IDATA2(ADC0);
|
|
|
- v[3] = ADC_IDATA3(ADC1);
|
|
|
- *v1 = (s32)((float)_adc_avg(v) * adc_5vref_compesion());
|
|
|
-
|
|
|
- v[0] = ADC_IDATA0(ADC1);
|
|
|
- v[1] = ADC_IDATA1(ADC0);
|
|
|
- v[2] = ADC_IDATA2(ADC1);
|
|
|
- v[3] = ADC_IDATA3(ADC0);
|
|
|
- *v2 = (s32)((float)_adc_avg(v) * adc_5vref_compesion());
|
|
|
+#if (INJ_CHAN_NUM==4)
|
|
|
+ u16 min, max;
|
|
|
+ u16 sum = 0;
|
|
|
+ u16 v1 = ADC_IDATA0(ADC0);
|
|
|
+ u16 v2 = ADC_IDATA1(ADC1);
|
|
|
+ u16 v3 = ADC_IDATA2(ADC0);
|
|
|
+ u16 v4 = ADC_IDATA3(ADC1);
|
|
|
+ min = max = v1;
|
|
|
+ sum += v1;
|
|
|
+ v_calc(sum, v2, min, max);
|
|
|
+ v_calc(sum, v3, min, max);
|
|
|
+ v_calc(sum, v4, min, max);
|
|
|
+ *pv1 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
|
|
|
+
|
|
|
+ sum = 0;
|
|
|
+ v1 = ADC_IDATA0(ADC1);
|
|
|
+ v2 = ADC_IDATA1(ADC0);
|
|
|
+ v3 = ADC_IDATA2(ADC1);
|
|
|
+ v4 = ADC_IDATA3(ADC0);
|
|
|
+ min = max = v1;
|
|
|
+ sum += v1;
|
|
|
+ v_calc(sum, v2, min, max);
|
|
|
+ v_calc(sum, v3, min, max);
|
|
|
+ v_calc(sum, v4, min, max);
|
|
|
+ *pv2 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
|
|
|
+
|
|
|
#else
|
|
|
- *v1 = (s32)((float)ADC_IDATA0(ADC0) * adc_5vref_compesion());
|
|
|
- *v2 = (s32)((float)ADC_IDATA0(ADC1) * adc_5vref_compesion());
|
|
|
+ *pv1 = (s32)((float)ADC_IDATA0(ADC0) * adc_5vref_compesion());
|
|
|
+ *pv2 = (s32)((float)ADC_IDATA0(ADC1) * adc_5vref_compesion());
|
|
|
#endif
|
|
|
#else
|
|
|
- *v1 = (s32)(*adc_phase_reg1[phases]) ;
|
|
|
- *v2 = (s32)(*adc_phase_reg2[phases]) ;
|
|
|
+ *pv1 = (s32)(*adc_phase_reg1[phases]) ;
|
|
|
+ *pv2 = (s32)(*adc_phase_reg2[phases]) ;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
static void __inline adc_current_sample_config(u8 phases) {
|
|
|
#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
-#ifdef CONFIG_SW_MUTISAMPLE
|
|
|
- ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN);
|
|
|
- ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN);
|
|
|
+#if (INJ_CHAN_NUM==4)
|
|
|
+ //ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN);
|
|
|
+ //ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN);
|
|
|
#else
|
|
|
ADC_ISQ(ADC0) = ADC_RANK_CHANNEL(V_PHASE_I_CHAN);
|
|
|
ADC_ISQ(ADC1) = ADC_RANK_CHANNEL(W_PHASE_I_CHAN);
|