Skip to content

Commit

Permalink
Merge branch 'feature/zero_detection_signal_lost_param' into 'master'
Browse files Browse the repository at this point in the history
Feature:add zero_cross_detection signal_time parameter

See merge request ae_group/esp-iot-solution!936
  • Loading branch information
Yuan Ming Fu committed Jan 23, 2024
2 parents cd96f4b + 761cd10 commit 65a9380
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 36 deletions.
7 changes: 7 additions & 0 deletions components/zero_detection/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# ChangeLog

## v0.0.4 - 2023-01-10

### Enhancements:

- add signal_lost_time parameter detecting signal loss
- fixed the issue of losing collection interrupts when Ccache is turned off

## v0.0.3 - 2023-01-03

### Bug Fix:
Expand Down
4 changes: 4 additions & 0 deletions components/zero_detection/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ The program returns results in the form of events, meeting the user's need for t

After creating a new zero detection object by calling function `zero_detect_create()`, the zero detection object can create many events.

Afterward, users can register the interrupt by calling function `zero_detect_register_cb()`,

Note: The prefix `IRAM_ATTR` should be added before registering the user-written interrupt function.

List of supported events:
* SIGNAL_FREQ_OUT_OF_RANGE
* SIGNAL_VALID
Expand Down
2 changes: 1 addition & 1 deletion components/zero_detection/idf_component.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: "0.0.3"
version: "0.0.4"
description: Zero Cross Detection Driver
url: https://github.com/espressif/esp-iot-solution/tree/master/components/zero_detection
repository: https://github.com/espressif/esp-iot-solution.git
Expand Down
15 changes: 9 additions & 6 deletions components/zero_detection/include/zero_detection.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
/*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -29,8 +30,9 @@ extern "C" {
#endif

#define ZERO_DETECTION_INIT_CONFIG_DEFAULT() { \
.valid_time = 6, \
.invalid_time = 5, \
.valid_times = 6, \
.invalid_times = 5, \
.signal_lost_time_us = 100000, \
.freq_range_min_hz = 45,\
.freq_range_max_hz = 65,\
.capture_pin = 2,\
Expand Down Expand Up @@ -126,9 +128,10 @@ typedef void (*zero_cross_cb_t)(zero_detect_event_t zero_detect_event, zero_dete
* @brief User config data type
*/
typedef struct {
int32_t capture_pin; /*!< GPIO number for zero cross detect capture */
uint16_t valid_time; /*!< Comparison value for determining signal validity */
uint16_t invalid_time; /*!< Comparison value for determining signal invalidity */
int32_t capture_pin; /*!< GPIO number for zero cross detect capture */
uint16_t valid_times; /*!< Minimum required number of times for detecting signal validity */
uint16_t invalid_times; /*!< Minimum required number of times for detecting signal invalidity */
uint64_t signal_lost_time_us; /*!< Minimum required duration for detecting signal loss */
zero_signal_type_t zero_signal_type; /*!< Zero Crossing Signal type */
zero_driver_type_t zero_driver_type; /*!< Zero crossing driver type */
double freq_range_max_hz; /*!< Maximum value of the frequency range when determining a valid signal */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
/*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -102,7 +103,7 @@ TEST_CASE("custom_zero_cross_detection_test", "[zero_cross_detecion][iot][pulse]
config.capture_pin = 2;
config.freq_range_max_hz = 65; //Hz
config.freq_range_min_hz = 45; //Hz
config.valid_time = 6;
config.valid_times = 6;
config.zero_signal_type = PULSE_WAVE;
#if defined(SOC_MCPWM_SUPPORTED)
config.zero_driver_type = MCPWM_TYPE;
Expand Down Expand Up @@ -147,7 +148,7 @@ TEST_CASE("custom_zero_cross_detection_test", "[zero_cross_detecion][iot][square
config.capture_pin = 2;
config.freq_range_max_hz = 65; //Hz
config.freq_range_min_hz = 45; //Hz
config.valid_time = 6;
config.valid_times = 6;
config.zero_signal_type = SQUARE_WAVE;
config.zero_driver_type = GPIO_TYPE;

Expand Down
29 changes: 16 additions & 13 deletions components/zero_detection/zero_detection.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand All @@ -19,10 +19,12 @@ typedef struct zero_cross {
uint32_t full_cycle_us; //Tick value after half a cycle, becomes the entire cycle after multiplying by two

uint16_t valid_count; //Count value of valid signals,switching during half a cycle
uint16_t valid_time; //Number of valid signal verifications
uint16_t valid_times; //Minimum required number of times for detecting signal validity

uint16_t invalid_count; //Count value of invalid signals,switching during half a cycle
uint16_t invalid_time; //Number of invalid signal verifications
uint16_t invalid_times; //Minimum required number of times for detecting signal invalidity

int64_t signal_lost_time_us; //Minimum required duration for detecting signal loss

bool zero_source_power_invalid; //Power loss flag when signal source is lost
bool zero_singal_invaild; //Signal is in an invalid range
Expand Down Expand Up @@ -51,7 +53,7 @@ typedef struct zero_cross {
/**
* @brief Zero cross detecion driver core function
*/
void zero_cross_handle_interrupt(void *user_data, const mcpwm_capture_event_data_t *edata)
void IRAM_ATTR zero_cross_handle_interrupt(void *user_data, const mcpwm_capture_event_data_t *edata)
{
zero_cross_dev_t *zero_cross_dev = user_data;
int gpio_status = 0;
Expand All @@ -68,7 +70,7 @@ void zero_cross_handle_interrupt(void *user_data, const mcpwm_capture_event_data
#if defined(CONFIG_USE_GPTIMER)
gptimer_set_raw_count(zero_cross_dev->gptimer, 0);
#else
esp_timer_restart(zero_cross_dev->esp_timer, 100000);
esp_timer_restart(zero_cross_dev->esp_timer, zero_cross_dev->signal_lost_time_us);
#endif
if (edge_status) {
if (zero_cross_dev->zero_signal_type == PULSE_WAVE) { //The methods for calculating the periods of pulse signals and square wave signals are different
Expand All @@ -82,7 +84,7 @@ void zero_cross_handle_interrupt(void *user_data, const mcpwm_capture_event_data
if (zero_cross_dev->full_cycle_us >= zero_cross_dev->freq_range_min_us && zero_cross_dev->full_cycle_us <= zero_cross_dev->freq_range_max_us) {
zero_cross_dev->valid_count++; //Reset to zero, increment and evaluate the counting value
zero_cross_dev->invalid_count = 0;
if (zero_cross_dev->valid_count >= zero_cross_dev->valid_time) {
if (zero_cross_dev->valid_count >= zero_cross_dev->valid_times) {
zero_cross_dev->zero_singal_invaild = false;
zero_cross_dev->zero_source_power_invalid = false;
//Enter the user callback function and return detection data and avoid judging upon receiving the first triggering edge
Expand Down Expand Up @@ -110,7 +112,7 @@ void zero_cross_handle_interrupt(void *user_data, const mcpwm_capture_event_data
if (zero_cross_dev->full_cycle_us >= zero_cross_dev->freq_range_min_us && zero_cross_dev->full_cycle_us <= zero_cross_dev->freq_range_max_us) { //Determine whether it is within the frequency range
zero_cross_dev->valid_count++;
zero_cross_dev->invalid_count = 0;
if (zero_cross_dev->valid_count >= zero_cross_dev->valid_time) {
if (zero_cross_dev->valid_count >= zero_cross_dev->valid_times) {
zero_cross_dev->zero_singal_invaild = false;
zero_cross_dev->zero_source_power_invalid = false;
//Enter the user callback function and return detection data and avoid judging upon receiving the first triggering edge
Expand Down Expand Up @@ -138,7 +140,7 @@ void zero_cross_handle_interrupt(void *user_data, const mcpwm_capture_event_data
zero_cross_dev->zero_singal_invaild = true;
zero_cross_dev->valid_count = 0;
zero_cross_dev->invalid_count++;
if (zero_cross_dev->invalid_count >= zero_cross_dev->invalid_time) {
if (zero_cross_dev->invalid_count >= zero_cross_dev->invalid_times) {
if (zero_cross_dev->event_callback && (zero_cross_dev->cap_val_end_of_sample != 0) && (zero_cross_dev->cap_val_begin_of_sample != 0)) {
zero_detect_cb_param_t param = {0};
param.signal_invalid_event_data.invalid_count = zero_cross_dev->invalid_count;
Expand Down Expand Up @@ -275,7 +277,7 @@ esp_err_t zero_detect_gpio_init(zero_detect_handle_t zcd_handle)
io_conf.pull_up_en = 1;
ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "GPIO config failed");
//Change gpio interrupt type for one pin
ESP_GOTO_ON_ERROR(gpio_install_isr_service(0), err, TAG, "GPIO install isr failed");
ESP_GOTO_ON_ERROR(gpio_install_isr_service(ESP_INTR_FLAG_IRAM), err, TAG, "GPIO install isr failed");

return ESP_OK;

Expand All @@ -302,7 +304,7 @@ esp_err_t zero_detect_gptime_init(zero_detect_handle_t zcd_handle)

ESP_LOGI(TAG, "Install gptimer alarm");
gptimer_alarm_config_t gptimer_alarm = {
.alarm_count = 100000, //100ms
.alarm_count = zcd->signal_lost_time_us,
.reload_count = 0,
.flags.auto_reload_on_alarm = true,
};
Expand Down Expand Up @@ -369,8 +371,9 @@ zero_detect_handle_t zero_detect_create(zero_detect_config_t *config)
config->capture_pin = 2;
}

zcd->valid_time = config->valid_time;
zcd->invalid_time = config->invalid_time;
zcd->valid_times = config->valid_times;
zcd->invalid_times = config->invalid_times;
zcd->signal_lost_time_us = config->signal_lost_time_us;
zcd->freq_range_max_us = 1000000 / config->freq_range_min_hz;
zcd->freq_range_min_us = 1000000 / config->freq_range_max_hz;
zcd->capture_pin = config->capture_pin;
Expand Down Expand Up @@ -412,7 +415,7 @@ zero_detect_handle_t zero_detect_create(zero_detect_config_t *config)
ESP_LOGE(TAG, "Gptimer start failed");
}
#else
if (esp_timer_start_periodic(zcd->esp_timer, 100000) != ESP_OK) {
if (esp_timer_start_periodic(zcd->esp_timer, zcd->signal_lost_time_us) != ESP_OK) {
ESP_LOGE(TAG, "Esptimer start failed");
}
#endif
Expand Down
10 changes: 5 additions & 5 deletions docs/en/others/zero_detection.rst
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ Create a zero detection
^^^^^^^^^^^^^^^^^^^^^^^
.. code:: c
int zero_detection_event_cb(zero_detect_event_t zero_detect_event, zero_detect_cb_param_t *param) {//User's callback API
void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, zero_detect_cb_param_t *param, void *usr_data) //User's callback API
{
switch (zero_detect_event) {
case SIGNAL_FREQ_OUT_OF_RANGE:
ESP_LOGE(TAG, "SIGNAL_FREQ_OUT_OF_RANGE");
Expand All @@ -71,24 +72,23 @@ Create a zero detection
default:
break;
}
return zero_detect_event;
}
// Create a zero detection and register call-back
zero_detect_config_t config = {
.capture_pin = 2,
.freq_range_max_hz = 65,
.freq_range_min_hz = 45, //Hz
.valid_time = 6,
.invalid_time = 5,
.event_callback = zero_detection_event_cb, //Create callback
.valid_times = 6,
.invalid_times = 5,
.zero_signal_type = SQUARE_WAVE,
.zero_driver_type = MCPWM_TYPE,
};
zero_detect_handle_t *g_zcds = zero_detect_create(&config);
if(NULL == g_zcds) {
ESP_LOGE(TAG, "Zero Detection create failed");
}
zero_detect_register_cb(g_zcds, zero_detection_event_cb, NULL);
API Reference
-------------
Expand Down
10 changes: 5 additions & 5 deletions docs/zh_CN/others/zero_detection.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@
^^^^^^^^^^^^
.. code:: c
int zero_detection_event_cb(zero_detect_event_t zero_detect_event, zero_detect_cb_param_t *param) {//User's callback API
void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, zero_detect_cb_param_t *param, void *usr_data) //User's callback API
{
switch (zero_detect_event) {
case SIGNAL_FREQ_OUT_OF_RANGE:
ESP_LOGE(TAG, "SIGNAL_FREQ_OUT_OF_RANGE");
Expand All @@ -66,24 +67,23 @@
default:
break;
}
return zero_detect_event;
}
// Create a zero detection and register call-back
zero_detect_config_t config = {
.capture_pin = 2,
.freq_range_max_hz = 65,
.freq_range_min_hz = 45, //Hz
.valid_time = 6,
.invalid_time = 5,
.event_callback = zero_detection_event_cb, //Create callback
.valid_times = 6,
.invalid_times = 5,
.zero_signal_type = SQUARE_WAVE,
.zero_driver_type = MCPWM_TYPE,
};
zero_detect_handle_t *g_zcds = zero_detect_create(&config);
if(NULL == g_zcds) {
ESP_LOGE(TAG, "Zero Detection create failed");
}
zero_detect_register_cb(g_zcds, zero_detection_event_cb, NULL);
API Reference
-------------
Expand Down
8 changes: 5 additions & 3 deletions examples/zero_cross_detection/main/zero_detect_example_main.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
/*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -39,7 +40,7 @@ static zero_cross_relay_t zcd = ZERO_DETECTION_RELAY_CONFIG_DEFAULT(); //Default
static zero_detect_handle_t *g_zcds;
zero_detect_config_t config = ZERO_DETECTION_INIT_CONFIG_DEFAULT(); //Default parameter

void zero_detection_event_cb(zero_detect_event_t zero_detect_event, zero_detect_cb_param_t *param, void *usr_data) //User's callback API
void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, zero_detect_cb_param_t *param, void *usr_data) //User's callback API
{
switch (zero_detect_event) {
case SIGNAL_FREQ_OUT_OF_RANGE:
Expand Down Expand Up @@ -135,7 +136,8 @@ void app_main(void)
config.capture_pin = CONFIG_ZERO_DETECT_INPUT_GPIO;
config.freq_range_max_hz = 65; //Hz
config.freq_range_min_hz = 45; //Hz
config.valid_time = 6;
config.signal_lost_time_us = 100000; //Us
config.valid_times = 6;
config.zero_signal_type = CONFIG_ZERO_DETECT_SIGNAL_TYPE;
#if defined(SOC_MCPWM_SUPPORTED)
config.zero_driver_type = MCPWM_TYPE;
Expand Down

0 comments on commit 65a9380

Please sign in to comment.