Prechádzať zdrojové kódy

加入软件多次采样,去掉最大,最小取平均

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 rokov pred
rodič
commit
d1a013acbe

+ 2 - 1
Applications/app/app.c

@@ -113,7 +113,8 @@ static u32 _app_plot_task(void * args) {
 	//can_report_plot_values(0x45);
 	//can_plot3(PMSM_FOC_Get()->out.n_Duty[0], PMSM_FOC_Get()->out.n_Duty[1], PMSM_FOC_Get()->out.n_Duty[2]);
 	//can_plot2(PMSM_FOC_Get()->rtLim.rpmLimRamp.interpolation, PMSM_FOC_GetSpeed());
-	can_plot2(PMSM_FOC_Get()->in.s_motAngle, PMSM_FOC_Get()->in.s_smoAngle + 360.0f);
+	//can_plot2(PMSM_FOC_Get()->in.s_motAngle, PMSM_FOC_Get()->in.s_smoAngle + 360.0f);
+	can_plot2(PMSM_FOC_Get()->in.s_iABC[1], PMSM_FOC_Get()->in.s_iABC[2]);
 #if 0
 	if (!_mc_start) {
 		_mc_start = true;

+ 7 - 4
Applications/bsp/adc.c

@@ -95,8 +95,8 @@ static void adc0_init(void){
 	adc_update_insert_sample_time(ADC0, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 #endif
 
-#ifdef HIGH_SIDE_CURRENT_SENSOR
-	adc_oversample_mode_config(ADC0, ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_1B, ADC_OVERSAMPLING_RATIO_MUL2);
+#ifdef CONFIG_HW_MUTISAMPLE
+	adc_oversample_mode_config(ADC0, ADC_OVERSAMPLING_ALL_CONVERT, CONFIG_HW_MUTISAMPLE_SHIFT, CONFIG_HW_MUTISAMPLE);
 	adc_oversample_mode_enable(ADC0);
 #endif
     /* configure ADC inserted channel trigger */
@@ -151,6 +151,8 @@ static void adc1_init(void){
 	rcu_periph_clock_enable(RCU_ADC1);
 	adc_deinit(ADC1);
 
+	adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
+
     /* configure ADC data alignment */
     adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
 	
@@ -168,10 +170,11 @@ static void adc1_init(void){
 	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 #endif
 
-#ifdef HIGH_SIDE_CURRENT_SENSOR
-	adc_oversample_mode_config(ADC1, ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_1B, ADC_OVERSAMPLING_RATIO_MUL2);
+#ifdef CONFIG_HW_MUTISAMPLE
+	adc_oversample_mode_config(ADC1, ADC_OVERSAMPLING_ALL_CONVERT, CONFIG_HW_MUTISAMPLE_SHIFT, CONFIG_HW_MUTISAMPLE);
 	adc_oversample_mode_enable(ADC1);
 #endif
+
     /* ADC external trigger enable */
 	adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC_TRIGGER_NONE);
     adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);

+ 41 - 7
Applications/bsp/adc.h

@@ -7,9 +7,10 @@
 inserted ADC 由timer0 ch3触发,
 注意:adc所有外部触发都是下降沿触发 
 */
-
+#define ISQ0_OFFSET 0
+#define ISQ1_OFFSET 5
 #define ISQ2_OFFSET 10
-#define ISO3_OFFSET 15
+#define ISQ3_OFFSET 15
 #define IL_OFFSET   20
 
 #define ADC_SAMPLE_TIME ADC_SAMPLETIME_7POINT5
@@ -22,9 +23,8 @@ inserted ADC 由timer0 ch3触发,
 #define PHASE_AC 1
 #define PHASE_BC 2
 
-//#define ADC_RANK_CHANNEL(c1, c2, l) ((c1)<<ISQ2_OFFSET | (c2)<<ISO3_OFFSET | (l)<<IL_OFFSET)
-#define ADC_RANK_CHANNEL(c)  ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET) 
-#define ADC_CALI_RANK_CHANEL(c)  ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET) 
+#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))
 
 #ifndef HIGH_SIDE_CURRENT_SENSOR
 static u32 adc0_rank_channels[3] = {
@@ -51,10 +51,41 @@ 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) {
-#ifdef HIGH_SIDE_CURRENT_SENSOR
+#ifdef CONFIG_HW_MUTISAMPLE
 	*v1 = ADC_IDATA0(ADC0);
 	*v2 = ADC_IDATA0(ADC1);
+#elif defined (CONFIG_SW_MUTISAMPLE)
+	s32 v[4];
+	v[0] = ADC_IDATA0(ADC0);
+	v[1] = ADC_IDATA1(ADC0);
+	v[2] = ADC_IDATA2(ADC0);
+	v[3] = ADC_IDATA3(ADC0);
+	*v1 = _adc_avg(v);
+
+	v[0] = ADC_IDATA0(ADC1);
+	v[1] = ADC_IDATA1(ADC1);
+	v[2] = ADC_IDATA2(ADC1);
+	v[3] = ADC_IDATA3(ADC1);
+	*v2 = _adc_avg(v);
 #else
 	*v1 = (s32)(*adc_phase_reg1[phases]) ;
 	*v2 = (s32)(*adc_phase_reg2[phases]) ;
@@ -63,9 +94,12 @@ static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
 
 
 static void __inline adc_current_sample_config(u8 phases) {
-#ifdef HIGH_SIDE_CURRENT_SENSOR
+#ifdef CONFIG_HW_MUTISAMPLE
 	ADC_ISQ(ADC0) = ADC_RANK_CHANNEL(V_PHASE_I_CHAN);
 	ADC_ISQ(ADC1) = ADC_RANK_CHANNEL(W_PHASE_I_CHAN);
+#elif defined (CONFIG_SW_MUTISAMPLE)
+	ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, V_PHASE_I_CHAN, V_PHASE_I_CHAN, V_PHASE_I_CHAN);
+	ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, W_PHASE_I_CHAN, W_PHASE_I_CHAN, W_PHASE_I_CHAN);
 #else
 	ADC_ISQ(ADC0) = adc0_rank_channels[phases];
 	ADC_ISQ(ADC1) = adc1_rank_channels[phases];

+ 4 - 0
Applications/bsp/board_mc100_v1.h

@@ -112,6 +112,10 @@
 
 #define CONFIG_PWM_UV_SWAP 1
 
+//#define CONFIG_HW_MUTISAMPLE ADC_OVERSAMPLING_RATIO_MUL2
+//#define CONFIG_HW_MUTISAMPLE_SHIFT ADC_OVERSAMPLING_SHIFT_1B
+#define CONFIG_SW_MUTISAMPLE 1
+
 /* 母线电压采集 */
 #define VBUS_V_CHAN 		ADC_CHANNEL_3  //adc012
 #define VBUS_V_ADC_GROUP 	GPIOA

+ 2 - 0
Applications/bsp/board_yuanqu.h

@@ -110,6 +110,8 @@
 #define ADC_TO_CURR_ceof1 (0.3362f)
 #define ADC_TO_CURR_ceof2 (0.3404f)
 
+#define CONFIG_HW_MUTISAMPLE ADC_OVERSAMPLING_RATIO_MUL2
+#define CONFIG_HW_MUTISAMPLE_SHIFT ADC_OVERSAMPLING_SHIFT_1B
 
 /* 母线电压采集 */
 #define VBUS_V_CHAN 		ADC_CHANNEL_4

+ 13 - 3
Project/MC100.uvoptx

@@ -135,12 +135,12 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>?</Name>
+          <Name>????</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
-          <Name>-U81480416 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0GD32F30x_HD.FLM -FS08000000 -FL010000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM)</Name>
+          <Name>-U81480416 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0GD32F30x_HD.FLM -FS08000000 -FL020000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -154,7 +154,7 @@
       </Tracepoint>
       <DebugFlag>
         <trace>0</trace>
-        <periodic>0</periodic>
+        <periodic>1</periodic>
         <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
@@ -191,6 +191,16 @@
       <pszMrulep></pszMrulep>
       <pSingCmdsp></pSingCmdsp>
       <pMultCmdsp></pMultCmdsp>
+      <SystemViewers>
+        <Entry>
+          <Name>System Viewer\ADC0</Name>
+          <WinId>35904</WinId>
+        </Entry>
+        <Entry>
+          <Name>System Viewer\ADC1</Name>
+          <WinId>35905</WinId>
+        </Entry>
+      </SystemViewers>
     </TargetOption>
   </Target>