auto-range
This commit is contained in:
parent
13e51f3943
commit
ccf7ebf5e9
@ -7,4 +7,5 @@ typedef struct {
|
|||||||
uint32_t* offsets;
|
uint32_t* offsets;
|
||||||
uint16_t zero_cali_nsamp;
|
uint16_t zero_cali_nsamp;
|
||||||
int range;
|
int range;
|
||||||
|
int auto_range;
|
||||||
} configuration;
|
} configuration;
|
||||||
|
@ -24,6 +24,13 @@
|
|||||||
|
|
||||||
#define TAG "main"
|
#define TAG "main"
|
||||||
|
|
||||||
|
// mV value that we consider the threshold for activating the next higher resistance
|
||||||
|
#define UNDERRANGE_MV 10
|
||||||
|
// source for the comparison used for the range switching
|
||||||
|
#define UNDERRANGE_SRC X10
|
||||||
|
// number of consecutive times the input has to be below the threshold before switching
|
||||||
|
#define UNDERRANGE_NUM 3
|
||||||
|
|
||||||
resistor_range ranges[] = {
|
resistor_range ranges[] = {
|
||||||
[R1] = {
|
[R1] = {
|
||||||
.pin = GPIO_NUM_6,
|
.pin = GPIO_NUM_6,
|
||||||
@ -81,11 +88,17 @@ static bool IRAM_ATTR on_conv_done(adc_continuous_handle_t handle, const adc_con
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char overrange_flag = 0;
|
configuration main_conf = {
|
||||||
|
.refresh_delay = 1000,
|
||||||
|
.range = R100,
|
||||||
|
.zero_cali_nsamp = 10000,
|
||||||
|
.auto_range = 1,
|
||||||
|
};
|
||||||
|
|
||||||
static void IRAM_ATTR overrange_handler(void* arg)
|
static void IRAM_ATTR overrange_handler(void* arg)
|
||||||
{
|
{
|
||||||
overrange_flag = 1;
|
activate_range(ranges, 0, R_NUM - 1);
|
||||||
|
main_conf.range = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_main(void){
|
void app_main(void){
|
||||||
@ -122,12 +135,8 @@ void app_main(void){
|
|||||||
ESP_ERROR_CHECK(nvs_flash_init());
|
ESP_ERROR_CHECK(nvs_flash_init());
|
||||||
|
|
||||||
uint32_t offsets[INPUTS_NUM] = {0};
|
uint32_t offsets[INPUTS_NUM] = {0};
|
||||||
configuration main_conf = {
|
|
||||||
.refresh_delay = 1000,
|
main_conf.offsets = offsets;
|
||||||
.offsets = offsets,
|
|
||||||
.range = R100,
|
|
||||||
.zero_cali_nsamp = 10000,
|
|
||||||
};
|
|
||||||
|
|
||||||
uint32_t meas_volts[INPUTS_NUM];
|
uint32_t meas_volts[INPUTS_NUM];
|
||||||
uint32_t meas_amp[INPUTS_NUM];
|
uint32_t meas_amp[INPUTS_NUM];
|
||||||
@ -144,6 +153,8 @@ void app_main(void){
|
|||||||
|
|
||||||
initBLE(&main_conf, &meas, &meas_ctxt);
|
initBLE(&main_conf, &meas, &meas_ctxt);
|
||||||
|
|
||||||
|
int underrange_counter = 0;
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
uint32_t meas_res_buff[INPUTS_NUM];
|
uint32_t meas_res_buff[INPUTS_NUM];
|
||||||
uint32_t meas_nb_buff[INPUTS_NUM];
|
uint32_t meas_nb_buff[INPUTS_NUM];
|
||||||
@ -168,10 +179,18 @@ void app_main(void){
|
|||||||
meas_amp[i] = mv * 1000000 / ranges[main_conf.range].resistance;
|
meas_amp[i] = mv * 1000000 / ranges[main_conf.range].resistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
notify_update(&meas);
|
if(meas_volts[UNDERRANGE_SRC] < UNDERRANGE_MV){
|
||||||
|
underrange_counter++;
|
||||||
|
if(underrange_counter > UNDERRANGE_NUM){
|
||||||
|
main_conf.range--;
|
||||||
|
activate_range(ranges, main_conf.range, R_NUM - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
underrange_counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ESP_LOGI(TAG, "overrange %d", overrange_flag);
|
notify_update(&meas);
|
||||||
overrange_flag = 0;
|
|
||||||
|
|
||||||
vTaskDelay(main_conf.refresh_delay / portTICK_PERIOD_MS);
|
vTaskDelay(main_conf.refresh_delay / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user