|
|
@@ -4,8 +4,7 @@
|
|
|
#include "libs/logger.h"
|
|
|
#include "math/fast_math.h"
|
|
|
|
|
|
-#define REG_CHAN_DMA 1
|
|
|
-#ifdef REG_CHAN_DMA
|
|
|
+
|
|
|
#ifndef CONFIG_BOARD_MCXXX
|
|
|
#define ADC01_NUM 7
|
|
|
#define ADC2_NUM 0
|
|
|
@@ -17,7 +16,8 @@
|
|
|
#define W_VOL_BUFF_IDX 4
|
|
|
#define MOS_TEMP_BUFF_IDX 5
|
|
|
#define MOTOR_TEMP_BUFF_IDX 6
|
|
|
-
|
|
|
+#define REG_CHAN_NUM (ADC01_NUM + ADC2_NUM)
|
|
|
+#define ADC_DUAL_MODE ADC_DAUL_INSERTED_PARALLEL
|
|
|
#elif (CONFIG_HW_VERSION==2)
|
|
|
#define ADC01_NUM (8)
|
|
|
#define ADC2_NUM 4
|
|
|
@@ -34,34 +34,49 @@
|
|
|
#define ACC_V_BUFF_IDX 9
|
|
|
#define THROTTLE_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
|
|
|
#elif (CONFIG_HW_VERSION==3)
|
|
|
-#define ADC01_NUM (16)
|
|
|
-#define ADC2_NUM 0
|
|
|
+#define ADC01_NUM (9)
|
|
|
|
|
|
#define MOS_TEMP_BUFF_IDX 0
|
|
|
-#define MOTOR_TEMP_BUFF_IDX 1
|
|
|
-#define THROTTLE_BUFF_IDX 2
|
|
|
-#define THROTTLE2_BUFF_IDX 3
|
|
|
-#define THROTTLE_5V_BUFF_IDX 4
|
|
|
-#define THROTTLE2_5V_BUFF_IDX 5
|
|
|
-#define U_VOL_BUFF_IDX 6
|
|
|
-#define VREF_BUFF_IDX 8
|
|
|
-#define VREF5v_BUFF_IDX 10
|
|
|
-
|
|
|
-#define VBUS_V_BUFF_IDX 11
|
|
|
-#define ACC_V_BUFF_IDX 12
|
|
|
-#define VBUS_I_BUFF_IDX 13
|
|
|
-#define V_VOL_BUFF_IDX 14
|
|
|
-#define W_VOL_BUFF_IDX 15
|
|
|
+#define VBUS_V_BUFF_IDX 1
|
|
|
+
|
|
|
+#define MOTOR_TEMP_BUFF_IDX 2
|
|
|
+#define ACC_V_BUFF_IDX 3
|
|
|
+
|
|
|
+#define THROTTLE_BUFF_IDX 4
|
|
|
+#define VBUS_I_BUFF_IDX 5
|
|
|
+
|
|
|
+#define THROTTLE2_BUFF_IDX 6
|
|
|
+#define V_VOL_BUFF_IDX 7
|
|
|
+
|
|
|
+//zero chan 8
|
|
|
+#define W_VOL_BUFF_IDX 9
|
|
|
+
|
|
|
+#define VREF_BUFF_IDX 10
|
|
|
+//zero chan 11
|
|
|
+
|
|
|
+#define THROTTLE2_5V_BUFF_IDX 12
|
|
|
+#define THROTTLE_5V_BUFF_IDX 13
|
|
|
+
|
|
|
+#define U_VOL_BUFF_IDX 14
|
|
|
+//zero chan 15
|
|
|
+
|
|
|
+//zero chan 16
|
|
|
+#define VREF5v_BUFF_IDX 17
|
|
|
+#define REG_CHAN_NUM (ADC01_NUM + ADC01_NUM)
|
|
|
+#define ADC_DUAL_MODE ADC_DAUL_REGULAL_PARALLEL_INSERTED_PARALLEL
|
|
|
+
|
|
|
#endif
|
|
|
-#define REG_CHAN_NUM (ADC01_NUM + ADC2_NUM)
|
|
|
+
|
|
|
s16 adc_buffer[REG_CHAN_NUM];
|
|
|
float vref_adc = 1408.0f;
|
|
|
float vref_5v_adc = 2047.0f;
|
|
|
|
|
|
#define VREF_ADC_DATA 1509.0F //1498, 1.21/3.3*4095
|
|
|
|
|
|
+#if (CONFIG_HW_VERSION==3)
|
|
|
static void adc01_dma_init(void)
|
|
|
{
|
|
|
dma_parameter_struct dma_init_struct;
|
|
|
@@ -71,11 +86,11 @@ static void adc01_dma_init(void)
|
|
|
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 = ADC01_NUM;
|
|
|
+ dma_init_struct.memory_width = DMA_MEMORY_WIDTH_32BIT;
|
|
|
+ dma_init_struct.number = REG_CHAN_NUM/2;
|
|
|
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.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;
|
|
|
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
|
|
|
dma_init(DMA0, DMA_CH0, &dma_init_struct);
|
|
|
dma_circulation_enable(DMA0, DMA_CH0);
|
|
|
@@ -83,33 +98,30 @@ static void adc01_dma_init(void)
|
|
|
|
|
|
dma_channel_enable(DMA0, DMA_CH0);
|
|
|
}
|
|
|
-
|
|
|
-#if (CONFIG_HW_VERSION==2)
|
|
|
-static void adc2_dma_init(void)
|
|
|
+#else
|
|
|
+static void adc01_dma_init(void)
|
|
|
{
|
|
|
dma_parameter_struct dma_init_struct;
|
|
|
- rcu_periph_clock_enable(RCU_DMA1);
|
|
|
+ rcu_periph_clock_enable(RCU_DMA0);
|
|
|
|
|
|
- dma_deinit(DMA1, DMA_CH4);
|
|
|
+ dma_deinit(DMA0, DMA_CH0);
|
|
|
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
|
|
|
- dma_init_struct.memory_addr = (uint32_t)(adc_buffer + ADC01_NUM);
|
|
|
+ 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 = ADC2_NUM;
|
|
|
- dma_init_struct.periph_addr = (uint32_t)(&ADC_RDATA(ADC2));
|
|
|
+ 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(DMA1, DMA_CH4, &dma_init_struct);
|
|
|
- dma_circulation_enable(DMA1, DMA_CH4);
|
|
|
- dma_memory_to_memory_disable(DMA1, DMA_CH4);
|
|
|
+ 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(DMA1, DMA_CH4);
|
|
|
+ dma_channel_enable(DMA0, DMA_CH0);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-#endif
|
|
|
-
|
|
|
static void adc0_init(void){
|
|
|
/* config ADC clock */
|
|
|
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
|
|
|
@@ -117,8 +129,8 @@ static void adc0_init(void){
|
|
|
rcu_periph_clock_enable(RCU_ADC0);
|
|
|
|
|
|
adc_deinit(ADC0);
|
|
|
-
|
|
|
- adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
|
|
|
+
|
|
|
+ adc_mode_config(ADC_DUAL_MODE);
|
|
|
|
|
|
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
|
|
|
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
|
|
|
@@ -150,7 +162,6 @@ static void adc0_init(void){
|
|
|
/* ADC external trigger enable */
|
|
|
adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
|
|
|
|
|
|
-#ifdef REG_CHAN_DMA
|
|
|
/* configure ADC regular channel */
|
|
|
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, ADC01_NUM);
|
|
|
#ifndef CONFIG_BOARD_MCXXX
|
|
|
@@ -177,29 +188,21 @@ static void adc0_init(void){
|
|
|
adc_regular_channel_config(ADC0, 1, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
adc_regular_channel_config(ADC0, 2, THROTTLE_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
adc_regular_channel_config(ADC0, 3, THROTTLE2_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 4, THROTTLE_5V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 5, THROTTLE2_5V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 6, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 7, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
|
|
|
- adc_regular_channel_config(ADC0, 8, ADC_CHANNEL_17, ADC_SAMPLETIME_239POINT5); //mcu内部vref
|
|
|
- adc_regular_channel_config(ADC0, 9, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
|
|
|
- adc_regular_channel_config(ADC0, 10, DC5V_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 11, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 12, ACC_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 13, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 14, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC0, 15, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
+ adc_regular_channel_config(ADC0, 4, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
|
|
|
+ adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_17, ADC_REGCHAN_SAMPLE_TIME); //mcu内部vref
|
|
|
+ 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_buffer[VREF_BUFF_IDX] = VREF_ADC_DATA; //1.21/3.3*4095
|
|
|
-#endif
|
|
|
#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);
|
|
|
|
|
|
@@ -210,9 +213,6 @@ 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){
|
|
|
@@ -220,7 +220,7 @@ static void adc1_init(void){
|
|
|
rcu_periph_clock_enable(RCU_ADC1);
|
|
|
adc_deinit(ADC1);
|
|
|
|
|
|
- adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
|
|
|
+ adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE);
|
|
|
adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
|
|
|
|
|
|
/* configure ADC data alignment */
|
|
|
@@ -249,66 +249,31 @@ static void adc1_init(void){
|
|
|
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);
|
|
|
- /* ADC software trigger enable */
|
|
|
- adc_software_trigger_enable(ADC1, ADC_INSERTED_CHANNEL);
|
|
|
-}
|
|
|
-
|
|
|
-#if (CONFIG_HW_VERSION==2)
|
|
|
-static void adc2_init(void){
|
|
|
-
|
|
|
- rcu_periph_clock_enable(RCU_ADC2);
|
|
|
-
|
|
|
- adc_deinit(ADC2);
|
|
|
-
|
|
|
- adc_special_function_config(ADC2, ADC_CONTINUOUS_MODE, ENABLE);
|
|
|
- adc_special_function_config(ADC2, ADC_SCAN_MODE, ENABLE);
|
|
|
-
|
|
|
- /* configure ADC data alignment */
|
|
|
- adc_data_alignment_config(ADC2, ADC_DATAALIGN_RIGHT);
|
|
|
-#ifdef CONFIG_HW_MUTISAMPLE
|
|
|
- adc_oversample_mode_config(ADC2, ADC_OVERSAMPLING_ALL_CONVERT, CONFIG_HW_MUTISAMPLE_SHIFT, CONFIG_HW_MUTISAMPLE);
|
|
|
- adc_oversample_mode_enable(ADC2);
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef REG_CHAN_DMA
|
|
|
- /* configure ADC regular channel */
|
|
|
- adc_channel_length_config(ADC2, ADC_REGULAR_CHANNEL, ADC2_NUM);
|
|
|
-#if (CONFIG_HW_VERSION==2)
|
|
|
- adc_regular_channel_config(ADC2, 0, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 1, ACC_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 2, THROTTLE_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 3, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
-#elif (CONFIG_HW_VERSION==3)
|
|
|
- adc_regular_channel_config(ADC2, 0, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 1, ACC_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 2, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 3, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
- adc_regular_channel_config(ADC2, 4, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
-#endif
|
|
|
-#endif
|
|
|
+#if (CONFIG_HW_VERSION==3)
|
|
|
+ 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, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
+ adc_regular_channel_config(ADC1, 4, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
|
|
|
+ adc_regular_channel_config(ADC1, 5, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
|
|
|
+ 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);
|
|
|
/* configure ADC regular channel trigger */
|
|
|
- adc_external_trigger_source_config(ADC2, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
|
|
|
- adc_external_trigger_config(ADC2, ADC_REGULAR_CHANNEL, ENABLE);
|
|
|
-#ifdef REG_CHAN_DMA
|
|
|
- adc_dma_mode_enable(ADC2);
|
|
|
+ adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
|
|
|
+ adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);
|
|
|
+
|
|
|
+ adc_dma_mode_enable(ADC1);
|
|
|
#endif
|
|
|
/* enable ADC interface */
|
|
|
- adc_enable(ADC2);
|
|
|
-
|
|
|
+ adc_enable(ADC1);
|
|
|
delay_ms(1);
|
|
|
/* ADC calibration and reset calibration */
|
|
|
- adc_calibration_enable(ADC2);
|
|
|
-
|
|
|
-#ifdef REG_CHAN_DMA
|
|
|
- adc_software_trigger_enable(ADC2, ADC_REGULAR_CHANNEL);
|
|
|
-#endif
|
|
|
+ adc_calibration_enable(ADC1);
|
|
|
}
|
|
|
-#endif
|
|
|
+
|
|
|
|
|
|
static void adc_gpio_init(void) {
|
|
|
|
|
|
@@ -402,18 +367,11 @@ static void adc_gpio_init(void) {
|
|
|
|
|
|
void adc_init(void) {
|
|
|
adc_gpio_init();
|
|
|
-#ifdef REG_CHAN_DMA
|
|
|
adc01_dma_init();
|
|
|
-#if (CONFIG_HW_VERSION==2)
|
|
|
- adc2_dma_init();
|
|
|
-#endif
|
|
|
-#endif
|
|
|
adc0_init();
|
|
|
adc1_init();
|
|
|
-#if (CONFIG_HW_VERSION==2)
|
|
|
- adc2_init();
|
|
|
-#endif
|
|
|
adc_current_sample_config(0);
|
|
|
+ adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
|
|
|
}
|
|
|
|
|
|
void adc_set_vref_calc(float v) {
|
|
|
@@ -531,7 +489,7 @@ u16 adc_get_5v_ref(void) {
|
|
|
}
|
|
|
|
|
|
void adc_start_convert(void) {
|
|
|
- int drop = 2;
|
|
|
+ int drop = 16;
|
|
|
/* clear the ADC flag */
|
|
|
adc_flag_clear(ADC0, ADC_FLAG_EOIC);
|
|
|
adc_flag_clear(ADC1, ADC_FLAG_EOIC);
|