|
|
@@ -3,6 +3,7 @@
|
|
|
#include "libs/utils.h"
|
|
|
#include "os/os_task.h"
|
|
|
#include "libs/logger.h"
|
|
|
+#include "math/fast_math.h"
|
|
|
|
|
|
#define REG_CHAN_DMA 1
|
|
|
|
|
|
@@ -11,11 +12,15 @@
|
|
|
#define ADC01_NUM 7
|
|
|
#define ADC2_NUM 0
|
|
|
#else
|
|
|
-#define ADC01_NUM (6)
|
|
|
+#define ADC01_NUM (8)
|
|
|
#define ADC2_NUM 4
|
|
|
#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
|
|
|
|
|
|
static void adc01_dma_init(void)
|
|
|
{
|
|
|
@@ -123,6 +128,10 @@ static void adc0_init(void){
|
|
|
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[7] = VREF_ADC_DATA; //1.21/3.3*4095
|
|
|
#endif
|
|
|
#endif
|
|
|
/* configure ADC regular channel trigger */
|
|
|
@@ -326,9 +335,44 @@ void adc_init(void) {
|
|
|
adc_current_sample_config(0);
|
|
|
}
|
|
|
|
|
|
+void adc_set_vref_calc(float v) {
|
|
|
+ vref_adc = v;
|
|
|
+}
|
|
|
+
|
|
|
+void adc_set_5vref_calc(float v) {
|
|
|
+ vref_5v_adc = v;
|
|
|
+}
|
|
|
+
|
|
|
+static float vref_compestion_filter = 1.0f;
|
|
|
+#define VREF_COMPESTION() (vref_adc/(float)adc_buffer[7])
|
|
|
+void adc_3v3ref_filter(void) {
|
|
|
+ float value = VREF_COMPESTION();
|
|
|
+ LowPass_Filter(vref_compestion_filter, value, 0.01f);
|
|
|
+}
|
|
|
+
|
|
|
+float adc_vref_compesion(void) {
|
|
|
+ return vref_compestion_filter;
|
|
|
+}
|
|
|
+
|
|
|
+static float vref_5v_compestion_filter = 1.0f;
|
|
|
+#define VREF_5V_COMPESTION() (vref_5v_adc/(float)adc_buffer[1])
|
|
|
+void adc_5vref_filter(void) {
|
|
|
+ float value = VREF_5V_COMPESTION();
|
|
|
+ LowPass_Filter(vref_5v_compestion_filter, value, 0.01f);
|
|
|
+}
|
|
|
+
|
|
|
+float adc_5vref_compesion(void) {
|
|
|
+ return vref_5v_compestion_filter;
|
|
|
+}
|
|
|
+
|
|
|
+void adc_vref_filter(void) {
|
|
|
+ adc_3v3ref_filter();
|
|
|
+ adc_5vref_filter();
|
|
|
+}
|
|
|
+
|
|
|
u16 adc_get_vbus(void) {
|
|
|
#ifdef MC100_HW_V1
|
|
|
- return adc_buffer[ADC01_NUM + 0];
|
|
|
+ return (float)adc_buffer[ADC01_NUM + 0] * VREF_COMPESTION();
|
|
|
#else
|
|
|
return adc_buffer[0];
|
|
|
#endif
|
|
|
@@ -336,7 +380,7 @@ u16 adc_get_vbus(void) {
|
|
|
|
|
|
u16 adc_get_acc(void) {
|
|
|
#ifdef MC100_HW_V1
|
|
|
- return adc_buffer[ADC01_NUM + 1];
|
|
|
+ return (float)adc_buffer[ADC01_NUM + 1] * VREF_COMPESTION();
|
|
|
#else
|
|
|
return adc_get_vbus();
|
|
|
#endif
|
|
|
@@ -344,7 +388,7 @@ u16 adc_get_acc(void) {
|
|
|
|
|
|
u16 adc_get_ibus(void) {
|
|
|
#ifdef MC100_HW_V1
|
|
|
- return adc_buffer[2];
|
|
|
+ return (float)adc_buffer[2] * VREF_5V_COMPESTION();
|
|
|
#else
|
|
|
return 0;
|
|
|
#endif
|
|
|
@@ -352,7 +396,7 @@ u16 adc_get_ibus(void) {
|
|
|
|
|
|
u16 adc_get_throttle(void) {
|
|
|
#ifdef MC100_HW_V1
|
|
|
- return adc_buffer[ADC01_NUM + 2];
|
|
|
+ return adc_buffer[ADC01_NUM + 2] * VREF_COMPESTION();
|
|
|
#else
|
|
|
return adc_buffer[1];
|
|
|
#endif
|
|
|
@@ -393,6 +437,14 @@ u16 adc_get_motor_temp(void) {
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+u16 adc_get_vref(void) {
|
|
|
+ return adc_buffer[7];
|
|
|
+}
|
|
|
+
|
|
|
+u16 adc_get_5v_ref(void) {
|
|
|
+ return adc_buffer[1];
|
|
|
+}
|
|
|
+
|
|
|
void adc_start_convert(void) {
|
|
|
int drop = 2;
|
|
|
/* clear the ADC flag */
|