1
- // Copyright 2019-2021 Josh Pieper, jjp@pobox .com.
1
+ // Copyright 2023 mjbots Robotic Systems, LLC. info@mjbots .com
2
2
//
3
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
4
// you may not use this file except in compliance with the License.
@@ -454,12 +454,6 @@ void ConfigureADC(ADC_TypeDef* adc, int channel_sqr, fw::MillisecondTimer* timer
454
454
adc->SMPR2 = make_cycles (2 );
455
455
}
456
456
457
- uint16_t SampleAdc (ADC_TypeDef* adc) {
458
- adc->CR |= ADC_CR_ADSTART;
459
- while ((adc->ISR & ADC_ISR_EOC) == 0 );
460
- return adc->DR ;
461
- }
462
-
463
457
const int kShutdownTimeoutMs = 5000 ;
464
458
const int kMinOffTimeMs = 500 ;
465
459
@@ -487,6 +481,10 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
487
481
float fet_temp_C = 0 .0f ;
488
482
int32_t energy_uW_hr = 0 ;
489
483
484
+ int16_t int_temp_raw = 0 ;
485
+ float int_temp_C = 0 .0f ;
486
+
487
+
490
488
int32_t precharge_timeout_ms = 0 ;
491
489
int32_t shutdown_timeout_ms = 0 ;
492
490
@@ -511,6 +509,9 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
511
509
a->Visit (MJ_NVP (fet_temp_C));
512
510
a->Visit (MJ_NVP (energy_uW_hr));
513
511
512
+ a->Visit (MJ_NVP (int_temp_raw));
513
+ a->Visit (MJ_NVP (int_temp_C));
514
+
514
515
a->Visit (MJ_NVP (precharge_timeout_ms));
515
516
a->Visit (MJ_NVP (shutdown_timeout_ms));
516
517
@@ -660,6 +661,7 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
660
661
// DAC1 -> PA4 -> ISAMP_BIAS -> PA1 -> ADC12_IN2
661
662
// DAC3 -> internal
662
663
// DAC4 -> internal -> OPAMP5/VINP
664
+ // Internal_TEMP -> ADC5/IN4
663
665
664
666
ConfigureDAC1 (&timer_);
665
667
ConfigureDAC3 (&timer_);
@@ -669,6 +671,8 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
669
671
ConfigureADC (ADC2, 16 , &timer_);
670
672
ConfigureADC (ADC3, 1 , &timer_);
671
673
ConfigureADC (ADC5, 1 , &timer_);
674
+
675
+ ADC345_COMMON->CCR |= ADC_CCR_VSENSESEL;
672
676
}
673
677
674
678
void Setup () {
@@ -815,6 +819,9 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
815
819
ADC2->SQR1 =
816
820
(0 << ADC_SQR1_L_Pos) | // length 1
817
821
(16 << ADC_SQR1_SQ1_Pos);
822
+ ADC5->SQR1 =
823
+ (0 << ADC_SQR1_L_Pos) | // length 1
824
+ (1 << ADC_SQR1_SQ1_Pos);
818
825
819
826
// Sample the ADCs.
820
827
ADC1->CR |= ADC_CR_ADSTART;
@@ -845,12 +852,26 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
845
852
ADC2->SQR1 =
846
853
(0 << ADC_SQR1_L_Pos) | // length 1
847
854
(5 << ADC_SQR1_SQ1_Pos);
848
- const auto fet_temp_raw = SampleAdc (ADC2);
855
+ ADC5->SQR1 =
856
+ (0 << ADC_SQR1_L_Pos) | // length 1
857
+ (4 << ADC_SQR1_SQ1_Pos);
858
+
859
+ ADC2->CR |= ADC_CR_ADSTART;
860
+ ADC5->CR |= ADC_CR_ADSTART;
861
+
862
+ while (((ADC2->ISR & ADC_ISR_EOC) == 0 ) ||
863
+ ((ADC5->ISR & ADC_ISR_EOC) == 0 ));
864
+
865
+ const auto fet_temp_raw = ADC2->DR ;
866
+ const auto int_temp_raw = ADC5->DR ;
849
867
850
868
const float fet_temp_C =
851
869
((static_cast <float >(fet_temp_raw) / 4096 .0f * 3 .3f ) - 1 .8663f ) /
852
870
-0 .01169f ;
853
871
872
+ const float int_temp_C =
873
+ (static_cast <float >(int_temp_raw) - ts_cal1_) / static_cast <float >(ts_cal2_ - ts_cal1_) * 100 .0f + 30 .0f ;
874
+
854
875
if (vsamp_out > 4 .0f ) {
855
876
const float delta_energy_uW_hr = vsamp_in * isamp * 0 .001f / 3600 .0f * 1e6f;
856
877
status_.energy_uW_hr += static_cast <int32_t >(delta_energy_uW_hr);
@@ -860,6 +881,9 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
860
881
status_.output_voltage_V = vsamp_out;
861
882
status_.output_current_A = isamp;
862
883
status_.fet_temp_C = fet_temp_C;
884
+ status_.int_temp_raw = int_temp_raw;
885
+ status_.int_temp_C = int_temp_C;
886
+
863
887
864
888
isamp_sample_window_[isamp_sample_offset_] = isamp_in;
865
889
isamp_sample_offset_ = (isamp_sample_offset_ + 1 ) % isamp_sample_window_.size ();
@@ -1038,6 +1062,11 @@ class PowerDist : public mjlib::multiplex::MicroServer::Server {
1038
1062
(fw::g_measured_hw_rev <= 2 ? (200 .0f / (200 .0f + 3000 .0f )) :
1039
1063
(fw::g_measured_hw_rev == 3 ? (200 .0f / (200 .0f + 4700 .0f )) :
1040
1064
1 .0f ));
1065
+
1066
+ const uint16_t * ts_cal1_addr_ = reinterpret_cast <const uint16_t *>(0x1fff75a8 );
1067
+ const uint16_t * ts_cal2_addr_ = reinterpret_cast <const uint16_t *>(0x1fff75ca );
1068
+ const uint16_t ts_cal1_ = *ts_cal1_addr_;
1069
+ const uint16_t ts_cal2_ = *ts_cal2_addr_;
1041
1070
};
1042
1071
1043
1072
void RunRev2 () {
0 commit comments