Browse Source

adc不支持非MC10x系列, mc100的I信号修改未timer3 ch2接入

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 2 years ago
parent
commit
60a8222510
2 changed files with 46 additions and 182 deletions
  1. 35 181
      Applications/bsp/gd32/adc.c
  2. 11 1
      Applications/bsp/gd32/board_mc100_v1.h

+ 35 - 181
Applications/bsp/gd32/adc.c

@@ -6,23 +6,21 @@
 
 
 #if (CONFIG_MC105_HW_VERSION==2)
-#define ADC01_NUM (8)
-#define ADC2_NUM 4
+#define ADC01_NUM 6
 
 #define MOS_TEMP_BUFF_IDX 0
-#define VREF5v_BUFF_IDX 1  //需要跳线修改mos的第二路温感采集模拟5v
-#define VBUS_I_BUFF_IDX 2
-#define U_VOL_BUFF_IDX 3
-#define V_VOL_BUFF_IDX 4
-#define W_VOL_BUFF_IDX 5
-#define VREF_BUFF_IDX 7
-
-#define VBUS_V_BUFF_IDX 8
-#define ACC_V_BUFF_IDX 9
-#define THROTTLE_BUFF_IDX 10
+#define VBUS_V_BUFF_IDX 1
+#define VREF5v_BUFF_IDX 2  //需要跳线修改mos的第二路温感采集模拟5v
+#define ACC_V_BUFF_IDX 3
+#define U_VOL_BUFF_IDX 4
+#define VBUS_I_BUFF_IDX 5
+#define V_VOL_BUFF_IDX 6
+#define THROTTLE_BUFF_IDX 7
+#define W_VOL_BUFF_IDX 8
+#define VREF_BUFF_IDX 10
 #define MOTOR_TEMP_BUFF_IDX 11
-#define REG_CHAN_NUM (ADC01_NUM + ADC2_NUM)
-#define ADC_DUAL_MODE ADC_DAUL_INSERTED_PARALLEL
+#define REG_CHAN_NUM (ADC01_NUM + ADC01_NUM)
+#define ADC_DUAL_MODE ADC_DAUL_REGULAL_PARALLEL_INSERTED_PARALLEL
 #elif (CONFIG_MC105_HW_VERSION==3)
 #define ADC01_NUM (9)
 
@@ -63,7 +61,7 @@ float vref_5v_adc = 2047.0f;
 
 #define VREF_ADC_DATA 1509.0F //1498, 1.21/3.3*4095
 
-#if (CONFIG_MC105_HW_VERSION==3)
+
 static void adc01_dma_init(void)
 {
     dma_parameter_struct dma_init_struct;
@@ -85,31 +83,8 @@ static void adc01_dma_init(void)
 
     dma_channel_enable(DMA0, DMA_CH0);
 }
-#else
-static void adc01_dma_init(void)
-{
-    dma_parameter_struct dma_init_struct;
-    rcu_periph_clock_enable(RCU_DMA0);
-
-    dma_deinit(DMA0, DMA_CH0);
-    dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
-    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       = 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;
-    dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;
-    dma_init(DMA0, DMA_CH0, &dma_init_struct);
-    dma_circulation_enable(DMA0, DMA_CH0);
-    dma_memory_to_memory_disable(DMA0, DMA_CH0);
 
-    dma_channel_enable(DMA0, DMA_CH0);
-}
-#endif
 
-#if (CONFIG_MC105_HW_VERSION==3)
 static void adc01_init(void) {
     /* config ADC clock */
     rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
@@ -129,6 +104,26 @@ static void adc01_init(void) {
 	adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
 
 	/* configure ADC regular channel */
+	
+#if (CONFIG_MC105_HW_VERSION==2)
+	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, ADC01_NUM);
+	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC0, 1, MOS_TEMP1_ADC_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);
+	adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_17, ADC_REGCHAN_SAMPLE_TIME);//3.3vref
+
+	adc_tempsensor_vrefint_enable();
+
+	adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, ADC01_NUM);
+	adc_regular_channel_config(ADC1, 0, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC1, 1, ACC_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC1, 2, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC1, 3, THROTTLE_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC1, 4, ADC_CHANNEL_10, ADC_REGCHAN_SAMPLE_TIME); //dumy
+	adc_regular_channel_config(ADC1, 5, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+#else
 	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, ADC01_NUM);
 	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 	adc_regular_channel_config(ADC0, 1, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
@@ -139,6 +134,7 @@ static void adc01_init(void) {
 	adc_regular_channel_config(ADC0, 6, THROTTLE2_5V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 	adc_regular_channel_config(ADC0, 7, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 	adc_regular_channel_config(ADC0, 8, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
+
 	adc_tempsensor_vrefint_enable();
 
 	adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, ADC01_NUM);
@@ -151,6 +147,7 @@ static void adc01_init(void) {
 	adc_regular_channel_config(ADC1, 6, THROTTLE_5V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 	adc_regular_channel_config(ADC1, 7, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
 	adc_regular_channel_config(ADC1, 8, DC5V_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+#endif
 	adc_buffer[VREF_BUFF_IDX] = VREF_ADC_DATA; //1.21/3.3*4095
 
     /* configure ADC regular channel trigger */
@@ -204,129 +201,7 @@ static void adc01_init(void) {
 	//start regular channels
 	adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
 }
-#else
-static void adc0_init(void){
-    /* config ADC clock */
-    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
-
-	rcu_periph_clock_enable(RCU_ADC0);
-
-	adc_deinit(ADC0);
-
-	adc_mode_config(ADC_DUAL_MODE);
-
-    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);
-	
-    /* configure ADC inserted channel length */
-    adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
-
-    //adc_inserted_channel_config(ADC0, 0, U_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#ifdef U_PHASE_I_CHAN
-	adc_update_insert_sample_time(ADC0, U_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#endif
-#ifdef V_PHASE_I_CHAN	
-	adc_update_insert_sample_time(ADC0, V_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#endif
-#ifdef W_PHASE_I_CHAN	
-	adc_update_insert_sample_time(ADC0, W_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#endif
-
-#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 */
-    adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE);
-
-    /* ADC external trigger enable */
-    adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-
-    /* configure ADC regular channel */
-    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, ADC01_NUM);
-#ifndef CONFIG_BOARD_MCXXX
-    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);
-	adc_regular_channel_config(ADC0, 5, MOS_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 6, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-#elif (CONFIG_MC105_HW_VERSION==2)
-	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 1, MOS_TEMP1_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 2, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 3, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 4, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 5, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 6, ADC_CHANNEL_10, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_17, ADC_REGCHAN_SAMPLE_TIME);
-	adc_tempsensor_vrefint_enable();
-	adc_buffer[VREF_BUFF_IDX] = VREF_ADC_DATA; //1.21/3.3*4095
-#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);
-
-	adc_dma_mode_enable(ADC0);
-
-    /* enable ADC interface */
-    adc_enable(ADC0);
-
-	delay_ms(1);
-    /* ADC calibration and reset calibration */
-    adc_calibration_enable(ADC0);
-
-	nvic_irq_enable(ADC0_1_IRQn, ADC_IRQ_PRIORITY, 0);
-
-	adc_disable_ext_trigger();
-}
-
-static void adc1_init(void){
 
-	rcu_periph_clock_enable(RCU_ADC1);
-	adc_deinit(ADC1);
-
-	adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE);
-	adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
-
-    /* configure ADC data alignment */
-    adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
-	
-    /* configure ADC inserted channel length */
-    adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
-
-    /* configure ADC inserted channel */
-#ifdef U_PHASE_I_CHAN
-	adc_update_insert_sample_time(ADC1, U_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#endif
-#ifdef V_PHASE_I_CHAN	
-	adc_update_insert_sample_time(ADC1, V_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#endif
-#ifdef W_PHASE_I_CHAN	
-	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_INSERT_SAMPLE_TIME);
-#endif
-
-#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);
-
-    /* enable ADC interface */
-    adc_enable(ADC1);
-	delay_ms(1);
-    /* ADC calibration and reset calibration */
-    adc_calibration_enable(ADC1);	
-}
-
-#endif
 
 static void adc_gpio_init(void) {
 
@@ -425,12 +300,7 @@ static void adc_gpio_init(void) {
 void adc_init(void) {
 	adc_gpio_init();
 	adc01_dma_init();
-#if (CONFIG_MC105_HW_VERSION==3)
 	adc01_init();
-#else
-	adc0_init();
-	adc1_init();
-#endif
 	adc_current_sample_config(0);
 }
 
@@ -475,19 +345,11 @@ u16 adc_get_vbus(void) {
 }
 
 u16 adc_get_acc(void) {
-#ifdef CONFIG_BOARD_MCXXX
 	return (float)adc_buffer[ACC_V_BUFF_IDX] * VREF_3V3_COMPESTION();
-#else
-	return adc_get_vbus();
-#endif
 }
 
 u16 adc_get_ibus(void) {
-#ifdef CONFIG_BOARD_MCXXX
 	return (float)adc_buffer[VBUS_I_BUFF_IDX] * VREF_5V_COMPESTION();
-#else
-	return 0;
-#endif
 }
 
 u16 adc_get_throttle(void) {
@@ -549,19 +411,11 @@ u16 adc_get_motor_temp(void) {
 }
 
 u16 adc_get_vref(void) {
-#ifdef CONFIG_BOARD_MCXXX
 	return adc_buffer[VREF_BUFF_IDX];
-#else
-	return 0;
-#endif
 }
 
 u16 adc_get_5v_ref(void) {
-#ifdef CONFIG_BOARD_MCXXX
 	return adc_buffer[VREF5v_BUFF_IDX];
-#else
-	return 0;
-#endif
 }
 
 void adc_start_convert(void) {

+ 11 - 1
Applications/bsp/gd32/board_mc100_v1.h

@@ -319,12 +319,22 @@
 #define ENC_I_GROUP GPIOB     /*测量编码器的ABI的I信号,360度同步一次*/
 #define ENC_I_PIN GPIO_PIN_8
 #define ENC_I_RCU RCU_GPIOB
+#if 0
 #define ENC_I_MODE GPIO_MODE_IPU
 #define ENC_I_IRQ  EXTI5_9_IRQn
 #define ENC_I_EXTI EXTI_8
 #define ENC_I_EXIT_SRC_GROUP GPIO_PORT_SOURCE_GPIOB
 #define ENC_I_EXIT_SRC_PIN GPIO_PIN_SOURCE_8
-
+#else
+#define ENC_I_MODE GPIO_MODE_IN_FLOATING
+#define ENC_I_TIMER TIMER3    /* 测量绝对编码器PWM输出的占空比,获取转子angle*/
+#define ENC_I_TIMER_RCU RCU_TIMER3
+#define ENC_I_TIMER_IRQ TIMER3_IRQn
+#define ENC_I_TIMER_CHAN  TIMER_CH_2
+#define ENC_I_TIMER_IRQ_CH TIMER_INT_CH2
+#define ENC_I_TIMER_INT_FLG TIMER_INT_FLAG_CH2
+#define ENC_I_IRQHandler TIMER3_IRQHandler
+#endif
 #define ENC_TIMER TIMER2  /* 测量编码器的ABI信号的AB信号 */
 #define ENC_TIMER_RCU RCU_TIMER2
 #define ENC_TIMER_IRQ TIMER2_IRQn