Ver código fonte

1. pwm 模式改为PWM0,高有效
2. PWM主输出关闭的时候,默认开底边
3. 使用DMA模式采集转把,母线, UVW端电压

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 3 anos atrás
pai
commit
3b651ceb43

+ 37 - 17
Applications/bsp/adc.c

@@ -4,10 +4,11 @@
 #include "os/os_task.h"
 #include "libs/logger.h"
 
-//#define REG_CHAN_DMA 1
+#define REG_CHAN_DMA 1
 
 #ifdef REG_CHAN_DMA
-uint16_t adc_buffer[2] = {0};
+#define REG_CHAN_NUM 5
+s16 adc_buffer[REG_CHAN_NUM] = {0, 0, 0, 0, 0};
 
 static void adc_dma_init(void)
 {
@@ -19,7 +20,7 @@ static void adc_dma_init(void)
     dma_init_struct.memory_addr  = (uint32_t)adc_buffer;
     dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
-    dma_init_struct.number       = 2;
+    dma_init_struct.number       = REG_CHAN_NUM;
     dma_init_struct.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
     dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
@@ -46,8 +47,8 @@ static void adc0_init(void){
 	
 	adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
 
-	adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
-	adc_discontinuous_mode_config(ADC0, ADC_CHANNEL_DISCON_DISABLE, 0);
+    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
+    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
 
     /* configure ADC data alignment */
     adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
@@ -77,14 +78,19 @@ static void adc0_init(void){
 
 #ifdef REG_CHAN_DMA
     /* configure ADC regular channel */
-    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
-    adc_regular_channel_config(ADC0, 0, VBUS_V_CHAN, ADC_SAMPLETIME_7POINT5);
-    adc_regular_channel_config(ADC0, 1, THROTTLE_CHAN, ADC_SAMPLETIME_7POINT5);
+    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, REG_CHAN_NUM);
+    adc_regular_channel_config(ADC0, 0, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+    adc_regular_channel_config(ADC0, 1, THROTTLE_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC0, 2, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC0, 3, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC0, 4, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 #endif
     /* configure ADC regular channel trigger */
     adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
     adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
-
+#ifdef REG_CHAN_DMA
+	adc_dma_mode_enable(ADC0);
+#endif
     /* enable ADC interface */
     adc_enable(ADC0);
 
@@ -95,16 +101,16 @@ static void adc0_init(void){
 	nvic_irq_enable(ADC0_1_IRQn, ADC_IRQ_PRIORITY, 0);
 
 	adc_disable_ext_trigger();
+#ifdef REG_CHAN_DMA
+	adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
+#endif
 }
 
-
 static void adc1_init(void){
 
 	rcu_periph_clock_enable(RCU_ADC1);
 	adc_deinit(ADC1);
 
-	adc_special_function_config(ADC1, ADC_SCAN_MODE, DISABLE);
-	adc_discontinuous_mode_config(ADC1, ADC_CHANNEL_DISCON_DISABLE, 0);
     /* configure ADC data alignment */
     adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
 	
@@ -180,12 +186,26 @@ static void adc_gpio_init(void) {
 
 void adc_init(void) {
 	adc_gpio_init();
-	adc0_init();
-	adc1_init();
-	adc_current_sample_config(0);
 #ifdef REG_CHAN_DMA	
 	adc_dma_init();
 #endif
+	adc0_init();
+	adc1_init();
+	adc_current_sample_config(0);
+}
+
+u16 adc_get_vbus(void) {
+	return adc_buffer[0];
+}
+
+u16 adc_get_throttle(void) {
+	return adc_buffer[1];
+}
+
+void adc_get_uvw_phases(u16 *u, u16 *v, u16 *w) {
+	*u = adc_buffer[2];
+	*v = adc_buffer[3];
+	*w = adc_buffer[4];
 }
 
 void adc_start_convert(void) {
@@ -219,7 +239,7 @@ void adc_stop_convert(void) {
 
 
 s32 adc_sample_regular_channel(int channel, int times) {
-#if 1
+#ifndef REG_CHAN_DMA
 	u32 adc_device = ADC0;
 	int value = 0;
 	int count = 0;
@@ -227,7 +247,7 @@ s32 adc_sample_regular_channel(int channel, int times) {
 	int max = -0xFFFFF;
 	u64 start_time;
 	adc_channel_length_config(adc_device, ADC_REGULAR_CHANNEL, 1);
-	adc_regular_channel_config(adc_device, 0, channel, ADC_SAMPLETIME_7POINT5);
+	adc_regular_channel_config(adc_device, 0, channel, ADC_REGCHAN_SAMPLE_TIME);
 	while(count < times){
 restart:		
 		start_time = shark_get_mseconds();

+ 4 - 0
Applications/bsp/adc.h

@@ -18,6 +18,7 @@ inserted ADC 由timer0 ch3触发,
 #define ADC_TRIGGER_NONE  ADC0_1_2_EXTTRIG_INSERTED_NONE
 #define ADC_TRIGGER_VBUS ADC0_1_EXTTRIG_INSERTED_T1_CH0
 
+#define ADC_REGCHAN_SAMPLE_TIME ADC_SAMPLETIME_7POINT5
 
 #define PHASE_AB 0
 #define PHASE_AC 1
@@ -124,5 +125,8 @@ void adc_init(void);
 s32 adc_sample_regular_channel(int chan, int times);
 void adc_start_convert(void);
 void adc_stop_convert(void);
+u16 adc_get_vbus(void);
+u16 adc_get_throttle(void);
+void adc_get_uvw_phases(u16 *u, u16 *v, u16 *w);
 
 #endif /* _ADC_H__ */

+ 1 - 1
Applications/bsp/board_mc_v1.h

@@ -27,7 +27,7 @@
 #define ADC_FULL_MAX          (4096.0F)
 /* MOS驱动 */
 #define pwm_timer TIMER0
-#define PWM_MODE TIMER_OC_MODE_PWM1
+#define PWM_MODE TIMER_OC_MODE_PWM0
 #define PWM_U_P_GROUP 	GPIOA
 #define PWM_U_P_PIN 	GPIO_PIN_8
 #define PWM_U_P_RCU 	RCU_GPIOA

+ 20 - 6
Applications/bsp/pwm.c

@@ -25,8 +25,8 @@ static void _gpio_brakein_irq_enable(void);
 u16 timer_update_buffer[6] = {0};
 
 void pwm_3phase_init(void){
-    _init_pwm_timer();
 	_pwm_gpio_config();
+    _init_pwm_timer();
 }
 
 static rcu_periph_enum _rcu_clk(u32 timer) {
@@ -70,6 +70,20 @@ static void _pwm_gpio_config(void)
 #endif
 }
 
+static u8 _dead_time(u16 t) {
+	if (t < 128) {
+		return (u8 )t;
+	}else if (t < (64 + 63) * 2) { //11 1111
+		return (((u8)2<<6 + (t-64)/2));
+	}else if (t < (32 + 31) * 8) {
+		return ((u8)3 << 3 + (t - 32)/8);
+	}else {
+		if ((t-32)/16 > 63) {
+			return 0xFF;
+		}
+		return ((u8)7<<3 + (t - 32)/16);
+	}
+}
 
 static void _init_pwm_timer(void) {
 	timer_oc_parameter_struct timer_ocintpara;
@@ -97,10 +111,10 @@ static void _init_pwm_timer(void) {
     /* CH1,CH2 and CH3 configuration in PWM mode */
     timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
     timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
-    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_LOW;
-    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_LOW;
-    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;
-    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
+    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
+    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
+    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
+    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;
 
     timer_channel_output_config(timer,TIMER_CH_0,&timer_ocintpara);
     timer_channel_output_pulse_value_config(timer,TIMER_CH_0,half_period/2);
@@ -135,7 +149,7 @@ static void _init_pwm_timer(void) {
     timer_breakpara.runoffstate        = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.ideloffstate       = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.protectmode        = TIMER_CCHP_PROT_OFF; 
-    timer_breakpara.deadtime           = NS_2_TCLK(PWM_DEAD_TIME_NS);
+    timer_breakpara.deadtime           = _dead_time(NS_2_TCLK(PWM_DEAD_TIME_NS));
     timer_breakpara.breakstate         = TIMER_BREAK_DISABLE;
     timer_breakpara.breakpolarity      = TIMER_BREAK_POLARITY_LOW;
     timer_breakpara.outputautostate    = TIMER_OUTAUTO_DISABLE;

+ 2 - 1
Applications/foc/core/PMSM_FOC_Core.c

@@ -219,7 +219,8 @@ static __INLINE void PMSM_FOC_Plot_Debug(void) {
 			//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
 			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_iABC[1]), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
 			//plot_2data16(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABCFilter[0]);
-			plot_3data16(_gFOC_Ctrl.in.s_motRPM, _gFOC_Ctrl.idq_ctl[1].s_Cp * 10, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
+			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, _gFOC_Ctrl.idq_ctl[1].s_Cp * 10, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
+			plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_vDC), FtoS16x10(get_throttle_float()));
 		}
 		//plot_1data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle));
 		//plot_1data16(_gFOC_Ctrl.in.s_motRPM);

+ 1 - 1
Applications/foc/motor/motor.c

@@ -303,7 +303,7 @@ void Sched_MC_mTask(void) {
 		float f_throttle = get_throttle_float();
 		if (f_throttle != motor.throttle) {
 			motor.throttle = f_throttle;
-			torque_speed_target(runMode, f_throttle);
+			//torque_speed_target(runMode, f_throttle);
 		}
 		PMSM_FOC_idqCalc();
 	}

+ 4 - 4
Applications/foc/samples.c

@@ -24,12 +24,12 @@ static samples_t _throttle;
 void samples_init(void){
 	_vbus.filted_value = (MAX_vDC);
 	_vbus.value = (MAX_vDC);
-	_vbus.lowpass = (0.2f); 
+	_vbus.lowpass = (0.01f); 
 
 #ifdef THROTTLE_CHAN
 	_throttle.filted_value = (0);
 	_throttle.value = (0);
-	_throttle.lowpass = (0.2f); 
+	_throttle.lowpass = (0.01f); 
 
 	sample_throttle();
 #endif
@@ -64,7 +64,7 @@ static u32 sample_task(void *param) {
 u32 sapmple_delta;
 static void sample_vbus(void){
 	u32 ticks = task_ticks_abs();
-	s16 vadc = adc_sample_regular_channel(VBUS_V_CHAN, 3);
+	s16 vadc = adc_get_vbus();
 	_vbus.value = (float)vadc * VBUS_VOL_CEOF;
 	LowPass_Filter(_vbus.filted_value, _vbus.value, _vbus.lowpass);
 	sapmple_delta = task_ticks_rel(ticks);
@@ -72,7 +72,7 @@ static void sample_vbus(void){
 
 static void sample_throttle(void){
 #ifdef THROTTLE_CHAN
-	s16 vadc = adc_sample_regular_channel(THROTTLE_CHAN, 16);
+	s16 vadc = adc_get_throttle();
 	_throttle.value = (float)vadc * THROTTLE_VOL_CEOF;
 	LowPass_Filter(_throttle.filted_value, _throttle.value, _throttle.lowpass);
 #endif

+ 13 - 40
Project/MC100.uvoptx

@@ -120,7 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>7</Name>
+          <Name>8蘌
0</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -140,7 +140,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
-          <Name>-U81480416 -O78 -S2 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST1 -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 -FL080000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM)</Name>
+          <Name>-U81480416 -O1102 -S2 -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 -FL080000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -183,47 +183,12 @@
         <Ww>
           <count>6</count>
           <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_count</ItemText>
+          <ItemText>debug_dref</ItemText>
         </Ww>
         <Ww>
           <count>7</count>
           <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_map,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>8</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_cnt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>9</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_finished</ItemText>
-        </Ww>
-        <Ww>
-          <count>10</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_comp,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>11</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_mul</ItemText>
-        </Ww>
-        <Ww>
-          <count>12</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_add,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>13</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_cn_add,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>14</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>encoder_off_angle_add</ItemText>
+          <ItemText>adc_buffer,0x0A</ItemText>
         </Ww>
       </WatchWindow1>
       <Tracepoint>
@@ -231,7 +196,7 @@
       </Tracepoint>
       <DebugFlag>
         <trace>0</trace>
-        <periodic>0</periodic>
+        <periodic>1</periodic>
         <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
@@ -269,6 +234,14 @@
       <pSingCmdsp></pSingCmdsp>
       <pMultCmdsp></pMultCmdsp>
       <SystemViewers>
+        <Entry>
+          <Name>System Viewer\ADC0</Name>
+          <WinId>35901</WinId>
+        </Entry>
+        <Entry>
+          <Name>System Viewer\RCU</Name>
+          <WinId>35900</WinId>
+        </Entry>
         <Entry>
           <Name>System Viewer\TIMER0</Name>
           <WinId>35903</WinId>

+ 1 - 1
Project/MC100.uvprojx

@@ -313,7 +313,7 @@
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
-            <Optim>4</Optim>
+            <Optim>1</Optim>
             <oTime>1</oTime>
             <SplitLS>0</SplitLS>
             <OneElfS>1</OneElfS>