|
|
@@ -1,30 +1,55 @@
|
|
|
#include "bsp/adc.h"
|
|
|
#include "libs/utils.h"
|
|
|
#include "os/co_task.h"
|
|
|
+
|
|
|
static void _gpio_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();
|
|
|
/* config ADC clock */
|
|
|
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
|
|
|
|
|
|
- _adc0_init();
|
|
|
+ rcu_periph_clock_enable(RCU_ADC0);
|
|
|
+ rcu_periph_clock_enable(RCU_ADC1);
|
|
|
|
|
|
- _adc1_init();
|
|
|
+ adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
|
|
|
+ /* ADC scan mode function enable */
|
|
|
+ adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
|
|
|
+ adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
|
|
|
|
|
|
- adc_config_trigger(ADC_TRIGGER_PHASE);
|
|
|
+ /* configure ADC data alignment */
|
|
|
+ adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
|
|
|
+ adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
|
|
|
+
|
|
|
+ /* configure ADC inserted channel trigger */
|
|
|
+ adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE);
|
|
|
+ /* configure ADC inserted channel length */
|
|
|
+ adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
|
|
|
+ /* configure ADC inserted channel trigger */
|
|
|
+ adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC0_1_2_EXTTRIG_INSERTED_NONE);
|
|
|
+ /* configure ADC inserted channel length */
|
|
|
+ adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
|
|
|
+ /* configure ADC inserted channel */
|
|
|
+ adc_inserted_channel_config(ADC0, 0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
+ adc_inserted_channel_config(ADC1, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
+
|
|
|
+ /* ADC external trigger enable */
|
|
|
+ adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
|
|
|
+ adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
|
|
|
+ adc_interrupt_enable(ADC0, ADC_INT_EOIC);
|
|
|
+
|
|
|
+ /* 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);
|
|
|
+
|
|
|
+ /* enable ADC interface */
|
|
|
+ adc_enable(ADC0);
|
|
|
+ adc_enable(ADC1);
|
|
|
+
|
|
|
+ /* ADC calibration and reset calibration */
|
|
|
+ adc_calibration_enable(ADC0);
|
|
|
+ adc_calibration_enable(ADC1);
|
|
|
|
|
|
nvic_irq_enable(ADC0_1_IRQn, ADC_IRQ_PRIORITY, 0);
|
|
|
|
|
|
@@ -38,109 +63,6 @@ static void _gpio_init(void) {
|
|
|
gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1);
|
|
|
}
|
|
|
|
|
|
-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, ENABLE);
|
|
|
- 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();
|
|
|
- adc_interrupt_disable(adc_dev, ADC_INT_EOIC);
|
|
|
- adc_interrupt_disable(adc_dev, ADC_INT_EOC);
|
|
|
- adc_interrupt_disable(adc_dev, ADC_INT_WDE);
|
|
|
- /* 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 special function config */
|
|
|
- adc_special_function_config(adc_dev, ADC_SCAN_MODE, ENABLE);
|
|
|
- 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*/
|
|
|
- _adc1_insert_chan_init();
|
|
|
- /* init regular chans*/
|
|
|
- _adc1_regular_chan_init();
|
|
|
- adc_interrupt_disable(adc_dev, ADC_INT_EOIC);
|
|
|
- adc_interrupt_disable(adc_dev, ADC_INT_EOC);
|
|
|
- adc_interrupt_disable(adc_dev, ADC_INT_WDE);
|
|
|
- /* enable ADC interface */
|
|
|
- adc_enable(adc_dev);
|
|
|
- delay_ms(1);
|
|
|
- /* ADC calibration and reset calibration */
|
|
|
- adc_calibration_enable(adc_dev);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-/* ADC0 insert chan sample phase I(use two chan, selected by foc) */
|
|
|
-static void _adc0_insert_chan_init(void) {
|
|
|
- u32 adc_dev = ADC0;
|
|
|
- //adc_discontinuous_mode_config(adc_dev, ADC_CHANNEL_DISCON_DISABLE, 0);
|
|
|
- /* ADC channel length config */
|
|
|
- adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 1);
|
|
|
- /* ADC inserted channel ran config, use ISQ2,ISQ3 */
|
|
|
- adc_update_insert_sample_rank(adc_dev, U_PHASE_I_CHAN);
|
|
|
- /* config inserted channel sample time */
|
|
|
- adc_update_insert_sample_time(adc_dev, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
- adc_update_insert_sample_time(adc_dev, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
- adc_update_insert_sample_time(adc_dev, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
- /* ADC trigger config */
|
|
|
- adc_external_trigger_source_config(adc_dev, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T0_CH3);
|
|
|
- /* ADC external trigger enable */
|
|
|
- adc_external_trigger_config(adc_dev, ADC_INSERTED_CHANNEL, DISABLE);
|
|
|
-}
|
|
|
-
|
|
|
-/* ADC1 insert chan sample vbus I */
|
|
|
-static void _adc1_insert_chan_init(void) {
|
|
|
- u32 adc_dev = ADC1;
|
|
|
- //adc_discontinuous_mode_config(adc_dev, ADC_CHANNEL_DISCON_DISABLE, 0);
|
|
|
- /* ADC channel length config */
|
|
|
- adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 1);
|
|
|
- /* ADC inserted channel config */
|
|
|
- adc_update_insert_sample_rank(adc_dev, V_PHASE_I_CHAN);
|
|
|
- /* config inserted channel sample time */
|
|
|
- adc_update_insert_sample_time(adc_dev, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
- adc_update_insert_sample_time(adc_dev, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
- adc_update_insert_sample_time(adc_dev, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
|
|
|
-
|
|
|
- /* ADC trigger config, slave must config to software trigger */
|
|
|
- adc_external_trigger_source_config(adc_dev, ADC_INSERTED_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
|
|
|
- /* ADC external trigger enable */
|
|
|
- adc_external_trigger_config(adc_dev, ADC_INSERTED_CHANNEL, DISABLE);
|
|
|
-}
|
|
|
-
|
|
|
-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);
|
|
|
- adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
|
|
|
- adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
|
|
|
- adc_regular_channel_config(ADC0, 0, MOTOR_TEMP_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
-}
|
|
|
-
|
|
|
-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, ENABLE);
|
|
|
- adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
|
|
|
- adc_regular_channel_config(ADC1, 0, W_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
|
|
|
-}
|
|
|
|
|
|
void adc_start_insert_convert(void) {
|
|
|
/* clear the ADC flag */
|
|
|
@@ -153,14 +75,12 @@ void adc_start_insert_convert(void) {
|
|
|
|
|
|
/* enable ADC interrupt */
|
|
|
adc_interrupt_enable(ADC0, ADC_INT_EOIC);
|
|
|
- //adc_interrupt_enable(ADC1, ADC_INT_EOIC);
|
|
|
}
|
|
|
|
|
|
void adc_stop_insert_convert(void) {
|
|
|
adc_disable_ext_trigger();
|
|
|
/* enable ADC interrupt */
|
|
|
adc_interrupt_disable(ADC0, ADC_INT_EOIC);
|
|
|
- //adc_interrupt_disable(ADC1, ADC_INT_EOIC);
|
|
|
|
|
|
/* clear the ADC flag */
|
|
|
adc_flag_clear(ADC0, ADC_FLAG_EOIC);
|
|
|
@@ -169,16 +89,13 @@ void adc_stop_insert_convert(void) {
|
|
|
|
|
|
|
|
|
s32 adc_sample_regular_channel(int channel, int times) {
|
|
|
-#if 0
|
|
|
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;
|
|
|
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_55POINT5);
|
|
|
while(count < times){
|
|
|
restart:
|
|
|
@@ -204,8 +121,5 @@ restart:
|
|
|
return value/times;
|
|
|
}
|
|
|
return (value - min - max)/(times-2);
|
|
|
-#else
|
|
|
- return 0;
|
|
|
-#endif
|
|
|
}
|
|
|
|