|
|
@@ -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();
|