Freeze
This commit is contained in:
parent
70798b6bf7
commit
3e77d34ccc
10 changed files with 669 additions and 146 deletions
|
|
@ -23,13 +23,15 @@
|
|||
#include "iodefs.h"
|
||||
#include "rsense.h"
|
||||
#include "utils.h"
|
||||
#include "adc.h"
|
||||
|
||||
static volatile union __attribute__((packed)) {
|
||||
uint16_t channels_16[DETECTOR_CHANNEL_COUNT];
|
||||
uint32_t channels_32[DETECTOR_CHANNEL_32_COUNT];
|
||||
uint16_t channels_16[RSENSE_CHANNEL_COUNT];
|
||||
uint32_t channels_32[RSENSE_CHANNEL_32_COUNT];
|
||||
} g_detector_counts = {0};
|
||||
|
||||
static uint8_t g_spectrum_mode = 0; // 0 = 16-bit, 1 = 32-bit
|
||||
static uint8_t g_oversampling_bits = config.flags.adc_oversample_bits;
|
||||
|
||||
static uint16_t g_read_pointer = 0;
|
||||
static uint32_t g_total_counts = 0;
|
||||
|
|
@ -44,8 +46,6 @@ static potentiometer_settings_t g_current_pot_settings;
|
|||
|
||||
static void apply_potentiometer_settings(const potentiometer_settings_t *settings);
|
||||
static void initialize_event_system(void);
|
||||
static void enable_fast_adc(void);
|
||||
static void restore_default_adc(void);
|
||||
static inline void handle_analog_read_interrupt(void);
|
||||
static void clear_detector_counters(void);
|
||||
static void clear_channel_data(void);
|
||||
|
|
@ -110,61 +110,6 @@ static void initialize_event_system(void)
|
|||
Event2.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enable ADC for fast radiation detection
|
||||
*/
|
||||
static void enable_fast_adc(void)
|
||||
{
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
|
||||
{
|
||||
ADC0.CTRLA |= ADC_ENABLE_bm;
|
||||
|
||||
// Enable oversampling x16 for 12-bit result
|
||||
#if ADC_OVERSAMPLING_BITS == 1
|
||||
ADC0.CTRLB |= ADC_SAMPNUM_ACC4_gc;
|
||||
#elif ADC_OVERSAMPLING_BITS == 2
|
||||
ADC0.CTRLB |= ADC_SAMPNUM_ACC16_gc;
|
||||
#elif ADC_OVERSAMPLING_BITS == 3
|
||||
ADC0.CTRLB |= ADC_SAMPNUM_ACC64_gc;
|
||||
#else
|
||||
#error "Unsupported ADC oversampling setting"
|
||||
#endif
|
||||
|
||||
ADC0.CTRLC = 0; // reset
|
||||
ADC0.CTRLC |= ADC_PRESC_DIV32_gc | ADC_REFSEL_VDDREF_gc; // CLK_PER/32, VDD as reference
|
||||
|
||||
// Enable interrupt on conversion complete
|
||||
ADC0.EVCTRL |= ADC_STARTEI_bm; // Start event input
|
||||
ADC0.INTCTRL |= ADC_RESRDY_bm;
|
||||
|
||||
// Configure VREF, Microchip DS40002015B page 424
|
||||
VREF.CTRLA |= VREF_ADC0REFSEL_4V34_gc;
|
||||
|
||||
// Select ADC channel
|
||||
ADC0.MUXPOS = ADC_MUXPOS_AIN3_gc; // DET_SIG_PIN
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Restore ADC to default settings
|
||||
*/
|
||||
static void restore_default_adc(void)
|
||||
{
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
|
||||
{
|
||||
// Disable oversampling
|
||||
ADC0.CTRLB &= ~ADC_SAMPNUM_gm;
|
||||
|
||||
// Set reference back to VREFA
|
||||
ADC0.CTRLC &= ~ADC_REFSEL_gm;
|
||||
ADC0.CTRLC |= ADC_REFSEL_VREFA_gc; // VREFA as reference
|
||||
|
||||
// Disable interrupt on conversion complete
|
||||
ADC0.EVCTRL &= ~ADC_STARTEI_bm; // Start event input
|
||||
ADC0.INTCTRL &= ~ADC_RESRDY_bm;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle ADC conversion results for radiation detection
|
||||
*/
|
||||
|
|
@ -188,7 +133,7 @@ static inline void handle_analog_read_interrupt(void)
|
|||
#error "Unsupported ADC oversampling setting"
|
||||
#endif
|
||||
|
||||
g_detector_counts.channels_16[channel & ADC_CHANNEL_16_MASK]++;
|
||||
g_detector_counts.channels_16[channel & RSENSE_CHANNEL_16_MASK]++;
|
||||
} else {
|
||||
// 32-bit spectrum mode
|
||||
// 2 extra bits from oversampling + averaging x2
|
||||
|
|
@ -203,7 +148,7 @@ static inline void handle_analog_read_interrupt(void)
|
|||
#error "Unsupported ADC oversampling setting"
|
||||
#endif
|
||||
|
||||
g_detector_counts.channels_32[channel & ADC_CHANNEL_32_MASK]++;
|
||||
g_detector_counts.channels_32[channel & RSENSE_CHANNEL_32_MASK]++;
|
||||
}
|
||||
|
||||
g_total_counts++;
|
||||
|
|
@ -231,7 +176,7 @@ static void clear_detector_counters(void)
|
|||
*/
|
||||
static void clear_channel_data(void)
|
||||
{
|
||||
for (int i = 0; i < DETECTOR_CHANNEL_COUNT; i++) {
|
||||
for (int i = 0; i < RSENSE_CHANNEL_COUNT; i++) {
|
||||
g_detector_counts.channels_16[i] = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -294,7 +239,7 @@ static void set_potentiometer_values(uint8_t hv, uint8_t amp, uint8_t det)
|
|||
|
||||
void rsense_cmd_telemetry(void)
|
||||
{
|
||||
restore_default_adc();
|
||||
adc_restore_default();
|
||||
|
||||
// Send total counts as 4 bytes
|
||||
Serial.write(g_total_counts & 0xFF);
|
||||
|
|
@ -303,7 +248,7 @@ void rsense_cmd_telemetry(void)
|
|||
Serial.write((g_total_counts >> 24) & 0xFF);
|
||||
|
||||
// 2 bytes of voltage in mV
|
||||
uint16_t voltage_raw = read_adc_oversampled(V28V0_FB_PIN, 16);
|
||||
uint16_t voltage_raw = adc_read_oversampled(V28V0_FB_PIN, 16);
|
||||
uint16_t voltage_mv = adc_to_voltage_mv(voltage_raw);
|
||||
Serial.write(voltage_mv & 0xFF);
|
||||
Serial.write(voltage_mv >> 8);
|
||||
|
|
@ -318,7 +263,7 @@ void rsense_cmd_telemetry(void)
|
|||
|
||||
Serial.flush();
|
||||
SERIAL_BUFFER_CLEAR();
|
||||
enable_fast_adc();
|
||||
adc_enable_fast();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -326,9 +271,9 @@ void rsense_cmd_telemetry(void)
|
|||
*/
|
||||
static void send_temperature_data(void)
|
||||
{
|
||||
int16_t hv_temp_c = adc_to_temperature_c(read_adc_oversampled(HV_TEMP_PIN, 16));
|
||||
int16_t amp_temp_c = adc_to_temperature_c(read_adc_oversampled(AMP_TEMP_PIN, 16));
|
||||
int16_t det_temp_c = adc_to_temperature_c(read_adc_oversampled(DET_TEMP_PIN, 16));
|
||||
int16_t hv_temp_c = adc_to_temperature_c(adc_read_oversampled(HV_TEMP_PIN, 16));
|
||||
int16_t amp_temp_c = adc_to_temperature_c(adc_read_oversampled(AMP_TEMP_PIN, 16));
|
||||
int16_t det_temp_c = adc_to_temperature_c(adc_read_oversampled(DET_TEMP_PIN, 16));
|
||||
|
||||
Serial.write(hv_temp_c & 0xFF);
|
||||
Serial.write(hv_temp_c >> 8);
|
||||
|
|
@ -359,7 +304,7 @@ void rsense_cmd_enable(void)
|
|||
digitalWrite(HV_EN, HIGH);
|
||||
digitalWrite(DET_EN, HIGH);
|
||||
|
||||
enable_fast_adc();
|
||||
adc_enable_fast();
|
||||
|
||||
SERIAL_SEND_OK();
|
||||
}
|
||||
|
|
@ -369,7 +314,7 @@ void rsense_cmd_disable(void)
|
|||
digitalWrite(DET_EN, LOW);
|
||||
digitalWrite(HV_EN, LOW);
|
||||
|
||||
restore_default_adc();
|
||||
adc_restore_default();
|
||||
|
||||
SERIAL_SEND_OK();
|
||||
}
|
||||
|
|
@ -383,7 +328,7 @@ void rsense_cmd_flush(void)
|
|||
|
||||
void rsense_cmd_dump_channels(void)
|
||||
{
|
||||
restore_default_adc();
|
||||
adc_restore_default();
|
||||
|
||||
uint16_t read_from = 0;
|
||||
|
||||
|
|
@ -398,8 +343,8 @@ void rsense_cmd_dump_channels(void)
|
|||
Serial.write(g_read_pointer >> 8);
|
||||
|
||||
g_read_pointer = read_from;
|
||||
if (g_read_pointer >= (DETECTOR_CHANNEL_32_COUNT - 32)) {
|
||||
g_read_pointer = DETECTOR_CHANNEL_32_COUNT - 32;
|
||||
if (g_read_pointer >= (RSENSE_CHANNEL_32_COUNT - 32)) {
|
||||
g_read_pointer = RSENSE_CHANNEL_32_COUNT - 32;
|
||||
}
|
||||
|
||||
// Send 2 bytes of CRC16 checksum for the 32 channels
|
||||
|
|
@ -408,7 +353,7 @@ void rsense_cmd_dump_channels(void)
|
|||
Serial.write(crc16 >> 8);
|
||||
|
||||
// Send 32 channel values (128 bytes total)
|
||||
for (uint16_t i = 0; i < 32 && g_read_pointer < DETECTOR_CHANNEL_32_COUNT; i++, g_read_pointer++) {
|
||||
for (uint16_t i = 0; i < 32 && g_read_pointer < RSENSE_CHANNEL_32_COUNT; i++, g_read_pointer++) {
|
||||
uint32_t channel_value = g_detector_counts.channels_32[g_read_pointer];
|
||||
Serial.write(channel_value & 0xFF);
|
||||
Serial.write((channel_value >> 8) & 0xFF);
|
||||
|
|
@ -422,7 +367,7 @@ void rsense_cmd_dump_channels(void)
|
|||
|
||||
Serial.flush();
|
||||
SERIAL_BUFFER_CLEAR();
|
||||
enable_fast_adc();
|
||||
adc_enable_fast();
|
||||
}
|
||||
|
||||
void rsense_cmd_get_cpm(void)
|
||||
|
|
@ -433,10 +378,10 @@ void rsense_cmd_get_cpm(void)
|
|||
SERIAL_BUFFER_CLEAR();
|
||||
}
|
||||
|
||||
void rsense_cmd_set_mode(void)
|
||||
void rsense_cmd_set_configuration(void)
|
||||
{
|
||||
// Wait for 1 byte specifying mode
|
||||
while (Serial.available() < 1)
|
||||
while (Serial.available() < 8)
|
||||
;
|
||||
uint8_t mode = Serial.read();
|
||||
|
||||
|
|
@ -446,6 +391,8 @@ void rsense_cmd_set_mode(void)
|
|||
SERIAL_SEND_OK();
|
||||
}
|
||||
|
||||
// 7 bytes reserved for future use
|
||||
|
||||
Serial.flush();
|
||||
SERIAL_BUFFER_CLEAR();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue