Read out the stm32 temperature sensor
The value is output using 1. the LCD 2. the UART The CPU load calculation has been removed/commented out, as it is no longer used.
This commit is contained in:
parent
978337d0a7
commit
4df43a99ee
69
src/main.c
69
src/main.c
|
@ -38,7 +38,7 @@ enum OperState {
|
||||||
|
|
||||||
volatile int wait_frame = 1;
|
volatile int wait_frame = 1;
|
||||||
|
|
||||||
#define ADC_NUM_CHANNELS 3
|
#define ADC_NUM_CHANNELS 4
|
||||||
volatile int16_t adc_values[ADC_NUM_CHANNELS];
|
volatile int16_t adc_values[ADC_NUM_CHANNELS];
|
||||||
|
|
||||||
static void unlock_rtc_access(void)
|
static void unlock_rtc_access(void)
|
||||||
|
@ -198,11 +198,15 @@ static void init_adc(void)
|
||||||
uint8_t channels[ADC_NUM_CHANNELS] = {
|
uint8_t channels[ADC_NUM_CHANNELS] = {
|
||||||
0, // VInSense
|
0, // VInSense
|
||||||
1, // VOutSense
|
1, // VOutSense
|
||||||
2 // CurrentSense
|
2, // CurrentSense
|
||||||
|
16 // Temperature sensor
|
||||||
};
|
};
|
||||||
|
|
||||||
adc_power_off(ADC1);
|
adc_power_off(ADC1);
|
||||||
|
|
||||||
|
// enable the temperature sensor
|
||||||
|
adc_enable_temperature_sensor();
|
||||||
|
|
||||||
// configure ADC
|
// configure ADC
|
||||||
//adc_enable_scan_mode(ADC1);
|
//adc_enable_scan_mode(ADC1);
|
||||||
adc_set_single_conversion_mode(ADC1);
|
adc_set_single_conversion_mode(ADC1);
|
||||||
|
@ -325,11 +329,32 @@ static void init_systick(int freq)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Temperature sensor calibration value address */
|
||||||
|
#define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2))
|
||||||
|
#define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7B8))
|
||||||
|
#define VDD_CALIB ((uint16_t) (330)) /* calibration voltage = 3,30V - DO NOT CHANGE */
|
||||||
|
#define VDD_APPLI ((uint16_t) (330)) /* actual supply voltage */
|
||||||
|
|
||||||
|
/* function for temperature conversion */
|
||||||
|
static fxp_t calc_temperature(uint16_t adc_val)
|
||||||
|
{
|
||||||
|
fxp_t temperature = fxp_from_int(
|
||||||
|
((int32_t)adc_val * VDD_APPLI / VDD_CALIB) -
|
||||||
|
(int32_t)*TEMP30_CAL_ADDR);
|
||||||
|
|
||||||
|
temperature = fxp_mult(temperature, fxp_from_int(110 - 30));
|
||||||
|
temperature = fxp_div(temperature, fxp_from_int(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR));
|
||||||
|
|
||||||
|
return fxp_add(temperature, fxp_from_int(30));
|
||||||
|
}
|
||||||
|
|
||||||
struct PowerState {
|
struct PowerState {
|
||||||
fxp_t vin, vin_avg;
|
fxp_t vin, vin_avg;
|
||||||
fxp_t vout, vout_avg;
|
fxp_t vout, vout_avg;
|
||||||
fxp_t current, current_avg;
|
fxp_t current, current_avg;
|
||||||
|
|
||||||
|
fxp_t temp, temp_avg; // junction temperature
|
||||||
|
|
||||||
fxp_t power_avg;
|
fxp_t power_avg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -358,6 +383,10 @@ static void report_status(struct PowerState *power_state,
|
||||||
|
|
||||||
fxp_format_int((int32_t)operState, number);
|
fxp_format_int((int32_t)operState, number);
|
||||||
debug_send_string(number);
|
debug_send_string(number);
|
||||||
|
debug_send_string(":");
|
||||||
|
|
||||||
|
fxp_format(power_state->temp_avg, number, 1);
|
||||||
|
debug_send_string(number);
|
||||||
debug_send_string("\r\n");
|
debug_send_string("\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -505,7 +534,7 @@ static void load_off(void)
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
uint32_t cpuload = 0;
|
//uint32_t cpuload = 0;
|
||||||
uint64_t timebase_ms = 0;
|
uint64_t timebase_ms = 0;
|
||||||
uint32_t time_in_state = 0;
|
uint32_t time_in_state = 0;
|
||||||
char msg[128];
|
char msg[128];
|
||||||
|
@ -577,6 +606,7 @@ int main(void)
|
||||||
power_state.vin_avg = 0;
|
power_state.vin_avg = 0;
|
||||||
power_state.vout_avg = 0;
|
power_state.vout_avg = 0;
|
||||||
power_state.current_avg = 0;
|
power_state.current_avg = 0;
|
||||||
|
power_state.temp_avg = fxp_from_int(-999);
|
||||||
|
|
||||||
mpp_state.mppMaxPWM = CONV_PWM_MAX;
|
mpp_state.mppMaxPWM = CONV_PWM_MAX;
|
||||||
|
|
||||||
|
@ -624,6 +654,13 @@ int main(void)
|
||||||
lcd_send_string(msg);
|
lcd_send_string(msg);
|
||||||
lcd_send_string("V ");
|
lcd_send_string("V ");
|
||||||
|
|
||||||
|
lcd_set_cursor_pos(0, 0);
|
||||||
|
|
||||||
|
fxp_format(power_state.temp_avg, number, 1);
|
||||||
|
fxp_right_align(number, msg, 4, ' ');
|
||||||
|
lcd_send_string(msg);
|
||||||
|
lcd_send_string("C");
|
||||||
|
|
||||||
lcd_set_cursor_pos(0, 10);
|
lcd_set_cursor_pos(0, 10);
|
||||||
|
|
||||||
fxp_format(power_state.power_avg, number, 2);
|
fxp_format(power_state.power_avg, number, 2);
|
||||||
|
@ -633,19 +670,6 @@ int main(void)
|
||||||
|
|
||||||
force_display_update_time += 500;
|
force_display_update_time += 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((timebase_ms % 1000) == 10) {
|
|
||||||
cpuload /= 1000;
|
|
||||||
|
|
||||||
lcd_set_cursor_pos(0, 0);
|
|
||||||
|
|
||||||
fxp_format_int((int32_t)cpuload, number);
|
|
||||||
fxp_right_align(number, msg, 3, '0');
|
|
||||||
lcd_send_string("L:");
|
|
||||||
lcd_send_string(msg);
|
|
||||||
|
|
||||||
cpuload = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -674,9 +698,12 @@ int main(void)
|
||||||
power_state.current = fxp_add(fxp_mult(fxp_from_int(adc_values[2]), ADC2CURRENT_M), ADC2CURRENT_T);
|
power_state.current = fxp_add(fxp_mult(fxp_from_int(adc_values[2]), ADC2CURRENT_M), ADC2CURRENT_T);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
power_state.temp = calc_temperature(adc_values[3]);
|
||||||
|
|
||||||
power_state.vin_avg = fxp_add(fxp_mult(power_state.vin, AVG_FACT), fxp_mult(power_state.vin_avg, AVG_FACT_INV));
|
power_state.vin_avg = fxp_add(fxp_mult(power_state.vin, AVG_FACT), fxp_mult(power_state.vin_avg, AVG_FACT_INV));
|
||||||
power_state.vout_avg = fxp_add(fxp_mult(power_state.vout, AVG_FACT), fxp_mult(power_state.vout_avg, AVG_FACT_INV));
|
power_state.vout_avg = fxp_add(fxp_mult(power_state.vout, AVG_FACT), fxp_mult(power_state.vout_avg, AVG_FACT_INV));
|
||||||
power_state.current_avg = fxp_add(fxp_mult(power_state.current, AVG_FACT), fxp_mult(power_state.current_avg, AVG_FACT_INV));
|
power_state.current_avg = fxp_add(fxp_mult(power_state.current, AVG_FACT), fxp_mult(power_state.current_avg, AVG_FACT_INV));
|
||||||
|
power_state.temp_avg = fxp_add(fxp_mult(power_state.temp, AVG_FACT), fxp_mult(power_state.temp_avg, AVG_FACT_INV));
|
||||||
|
|
||||||
power_state.power_avg = fxp_mult(power_state.vout_avg, power_state.current_avg);
|
power_state.power_avg = fxp_mult(power_state.vout_avg, power_state.current_avg);
|
||||||
|
|
||||||
|
@ -972,8 +999,18 @@ int main(void)
|
||||||
report_status(&power_state, pwm, operState);
|
report_status(&power_state, pwm, operState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if((timebase_ms % 1000) == 10) {
|
||||||
|
cpuload /= 1000;
|
||||||
|
|
||||||
|
// use CPU load values here
|
||||||
|
|
||||||
|
cpuload = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// cpu load = timer1 value after main loop operations
|
// cpu load = timer1 value after main loop operations
|
||||||
cpuload += timer_get_counter(TIM3);
|
cpuload += timer_get_counter(TIM3);
|
||||||
|
*/
|
||||||
|
|
||||||
timebase_ms++;
|
timebase_ms++;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue