|
|
@@ -1,32 +1,27 @@
|
|
|
#include "bsp/adc.h"
|
|
|
#include "libs/task.h"
|
|
|
static void _gpio_init(void);
|
|
|
-static void _adc_insert_chan_init(void);
|
|
|
-static void _adc_regular_chan_init(void);
|
|
|
-
|
|
|
+static void _adc0_init(void);
|
|
|
+static void _adc0_insert_chan_init(void);
|
|
|
+static void _adc0_regular_chan_init(void);
|
|
|
+static void _adc1_init(void);
|
|
|
+static void _adc1_insert_chan_init(void);
|
|
|
+static void _adc1_regular_chan_init(void);
|
|
|
+/*
|
|
|
+ADC0 inserted 采集母线电流
|
|
|
+ADC1 inserted 采集三相电流
|
|
|
+每次同时发送母线电流和响应的相电流,通过母线电流给相电流采集的MOS内阻校准
|
|
|
+可以理解为FOC工作在三电阻采样模式下,只是需要不停的校准MOS的内阻
|
|
|
+*/
|
|
|
void adc_init(void){
|
|
|
/* init adc input gpio */
|
|
|
_gpio_init();
|
|
|
- /* enable ADC1 clock */
|
|
|
- rcu_periph_clock_enable(RCU_ADC0);
|
|
|
/* config ADC clock */
|
|
|
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
|
|
|
- /* ADC mode config */
|
|
|
- adc_mode_config(ADC_MODE_FREE);
|
|
|
- /* ADC special function config */
|
|
|
- adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
|
|
|
- adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
|
|
|
- /* ADC data alignment config */
|
|
|
- adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
|
|
|
- /* init insert chans*/
|
|
|
- _adc_insert_chan_init();
|
|
|
- /* init regular chans*/
|
|
|
- _adc_regular_chan_init();
|
|
|
- /* enable ADC interface */
|
|
|
- adc_enable(ADC0);
|
|
|
- delay_ms(1);
|
|
|
- /* ADC calibration and reset calibration */
|
|
|
- adc_calibration_enable(ADC0);
|
|
|
+
|
|
|
+ _adc0_init();
|
|
|
+
|
|
|
+ _adc1_init();
|
|
|
|
|
|
nvic_irq_enable(ADC0_1_IRQn, 0, 0);
|
|
|
}
|
|
|
@@ -38,29 +33,84 @@ static void _gpio_init(void) {
|
|
|
gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1);
|
|
|
}
|
|
|
|
|
|
-static void _adc_insert_chan_init(void) {
|
|
|
+static void _adc0_init(void) {
|
|
|
+ u32 adc_dev = ADC0;
|
|
|
+ /* enable ADC1 clock */
|
|
|
+ rcu_periph_clock_enable(RCU_ADC0);
|
|
|
+
|
|
|
+ /* ADC mode config,adc0 master, adc1 slave */
|
|
|
+ adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
|
|
|
+ /* ADC special function config */
|
|
|
+ adc_special_function_config(adc_dev, ADC_SCAN_MODE, DISABLE);
|
|
|
+ adc_special_function_config(adc_dev, ADC_CONTINUOUS_MODE, DISABLE);
|
|
|
+ /* ADC data alignment config */
|
|
|
+ adc_data_alignment_config(adc_dev, ADC_DATAALIGN_RIGHT);
|
|
|
+ /* init insert chans*/
|
|
|
+ _adc0_insert_chan_init();
|
|
|
+ /* init regular chans*/
|
|
|
+ _adc0_regular_chan_init();
|
|
|
+ /* enable ADC interface */
|
|
|
+ adc_enable(adc_dev);
|
|
|
+ delay_ms(1);
|
|
|
+ /* ADC calibration and reset calibration */
|
|
|
+ adc_calibration_enable(adc_dev);
|
|
|
+}
|
|
|
+
|
|
|
+static void _adc1_init(void) {
|
|
|
+ u32 adc_dev = ADC1;
|
|
|
+ /* enable ADC1 clock */
|
|
|
+ rcu_periph_clock_enable(RCU_ADC1);
|
|
|
+
|
|
|
+ /* ADC mode config,adc0 master, adc1 slave */
|
|
|
+ adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
|
|
|
+ /* ADC special function config */
|
|
|
+ adc_special_function_config(adc_dev, ADC_SCAN_MODE, DISABLE);
|
|
|
+ adc_special_function_config(adc_dev, ADC_CONTINUOUS_MODE, ENABLE);
|
|
|
+ /* ADC data alignment config */
|
|
|
+ adc_data_alignment_config(adc_dev, ADC_DATAALIGN_RIGHT);
|
|
|
+ /* init insert chans*/
|
|
|
+ _adc1_insert_chan_init();
|
|
|
+ /* init regular chans*/
|
|
|
+ _adc1_regular_chan_init();
|
|
|
+ /* enable ADC interface */
|
|
|
+ adc_enable(adc_dev);
|
|
|
+ delay_ms(1);
|
|
|
+ /* ADC calibration and reset calibration */
|
|
|
+ adc_calibration_enable(adc_dev);
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
- adc_discontinuous_mode_config(ADC0, ADC_INSERTED_CHANNEL, 1); //每次转化一个
|
|
|
+/* ADC0 insert chan sample vbus I */
|
|
|
+static void _adc0_insert_chan_init(void) {
|
|
|
+ u32 adc_dev = ADC0;
|
|
|
+ adc_discontinuous_mode_config(adc_dev, ADC_INSERTED_CHANNEL, 1); //每次转化一个
|
|
|
/* ADC channel length config */
|
|
|
- adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 2);
|
|
|
+ adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 2);
|
|
|
/* ADC inserted channel config */
|
|
|
- adc_inserted_channel_config(ADC0, 0, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
- adc_inserted_channel_config(ADC0, 1, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
+ adc_inserted_channel_config(adc_dev, 0, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
+ adc_inserted_channel_config(adc_dev, 1, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
/* ADC trigger config */
|
|
|
- adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0);
|
|
|
-#if 0
|
|
|
- /* ADC external trigger enable */
|
|
|
- adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
|
|
|
-
|
|
|
- /* clear the ADC flag */
|
|
|
- adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
|
|
|
- adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
|
|
|
- /* enable ADC interrupt */
|
|
|
- adc_interrupt_enable(ADC0, ADC_INT_EOIC);
|
|
|
-#endif
|
|
|
+ adc_external_trigger_source_config(adc_dev, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0);
|
|
|
+}
|
|
|
+
|
|
|
+/* ADC1 insert chan sample phase I(use two chan, selected by foc) */
|
|
|
+static void _adc1_insert_chan_init(void) {
|
|
|
+ u32 adc_dev = ADC1;
|
|
|
+ adc_discontinuous_mode_config(adc_dev, ADC_INSERTED_CHANNEL, 1); //每次转化一个
|
|
|
+ /* ADC channel length config */
|
|
|
+ adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 2);
|
|
|
+ /* ADC inserted channel ran config, use ISQ2,ISQ3 */
|
|
|
+ adc1_update_insert_sample_rank(U_PHASE_I_CHAN, V_PHASE_I_CHAN);
|
|
|
+ /* config inserted channel sample time */
|
|
|
+ adc1_update_insert_sample_time(U_PHASE_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
+ adc1_update_insert_sample_time(V_PHASE_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
+ adc1_update_insert_sample_time(W_PHASE_I_CHAN, ADC_SAMPLETIME_7POINT5);
|
|
|
+ /* ADC trigger config */
|
|
|
+ adc_external_trigger_source_config(adc_dev, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0);
|
|
|
}
|
|
|
|
|
|
-static void _adc_regular_chan_init(void) {
|
|
|
+
|
|
|
+static void _adc0_regular_chan_init(void) {
|
|
|
adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 1); //每次转化一个
|
|
|
/* ADC channel length config */
|
|
|
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
|
|
|
@@ -68,34 +118,37 @@ static void _adc_regular_chan_init(void) {
|
|
|
adc_regular_channel_config(ADC0, 0, MOTOR_TEMP_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
adc_regular_channel_config(ADC0, 1, HANDLERBAR_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
adc_regular_channel_config(ADC0, 2, VBUS_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
- adc_regular_channel_config(ADC0, 3, W_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
- adc_regular_channel_config(ADC0, 4, V_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
- adc_regular_channel_config(ADC0, 5, U_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
- adc_regular_channel_config(ADC0, 6, W_PHASE_I_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
- adc_regular_channel_config(ADC0, 7, V_PHASE_I_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
- adc_regular_channel_config(ADC0, 8, U_PHASE_I_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
}
|
|
|
|
|
|
-s32 adc_sample_insert_chan(void) {
|
|
|
- adc_interrupt_disable(ADC0, ADC_INT_EOIC);
|
|
|
- adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, DISABLE);
|
|
|
- adc_software_trigger_enable(ADC0, 0);
|
|
|
- while(SET != adc_inserted_data_read(ADC0, 0));
|
|
|
- return adc_inserted_data_read(ADC0, 0);
|
|
|
+static void _adc1_regular_chan_init(void) {
|
|
|
+ adc_discontinuous_mode_config(ADC1, ADC_REGULAR_CHANNEL, 1); //每次转化一个
|
|
|
+ /* ADC channel length config */
|
|
|
+ adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 1);
|
|
|
+ adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, DISABLE);
|
|
|
+ adc_regular_channel_config(ADC1, 0, W_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
+ adc_regular_channel_config(ADC1, 1, V_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
+ adc_regular_channel_config(ADC1, 2, U_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
}
|
|
|
|
|
|
-void adc_start_insert_chan(void) {
|
|
|
+void adc_start_insert_convert(void) {
|
|
|
/* ADC external trigger enable */
|
|
|
adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
|
|
|
-
|
|
|
+ adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
|
|
|
/* clear the ADC flag */
|
|
|
adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
|
|
|
adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
|
|
|
+ adc_interrupt_flag_clear(ADC1, ADC_INT_FLAG_EOC);
|
|
|
+ adc_interrupt_flag_clear(ADC1, ADC_INT_FLAG_EOIC);
|
|
|
/* enable ADC interrupt */
|
|
|
adc_interrupt_enable(ADC0, ADC_INT_EOIC);
|
|
|
+ adc_interrupt_enable(ADC1, ADC_INT_EOIC);
|
|
|
}
|
|
|
|
|
|
-s32 adc_sample_regular_chan(int chan, int times) {
|
|
|
+s32 adc_sample_regular_channel(int channel, int times) {
|
|
|
+ u32 adc_device = ADC0;
|
|
|
+ if (channel >= W_PHASE_V_CHAN && channel <= U_PHASE_V_CHAN) {
|
|
|
+ adc_device = ADC1;
|
|
|
+ }
|
|
|
int value = 0;
|
|
|
int count = 0;
|
|
|
int min = 0xFFFFF;
|
|
|
@@ -104,14 +157,14 @@ s32 adc_sample_regular_chan(int chan, int times) {
|
|
|
while(count < times){
|
|
|
restart:
|
|
|
start_time = get_mseconds();
|
|
|
- adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
|
|
|
- while(SET != adc_flag_get(ADC0, ADC_FLAG_EOC)){
|
|
|
+ adc_software_trigger_enable(adc_device, ADC_REGULAR_CHANNEL);
|
|
|
+ while(SET != adc_flag_get(adc_device, ADC_FLAG_EOC)){
|
|
|
if (get_mseconds() - start_time >= 2){
|
|
|
goto restart;
|
|
|
}
|
|
|
};
|
|
|
- int one = adc_regular_data_read(ADC0);
|
|
|
- adc_flag_clear(ADC0, ADC_FLAG_EOC);
|
|
|
+ int one = adc_regular_data_read(adc_device);
|
|
|
+ adc_flag_clear(adc_device, ADC_FLAG_EOC);
|
|
|
value += (one & 0xFFF);
|
|
|
count ++;
|
|
|
if (one > max){
|
|
|
@@ -124,6 +177,6 @@ restart:
|
|
|
if (times <= 2) {
|
|
|
return value/times;
|
|
|
}
|
|
|
- return (value - min - max)/(times-2);
|
|
|
-
|
|
|
+ return (value - min - max)/(times-2);
|
|
|
}
|
|
|
+
|