mirror of
https://github.com/espressif/esp-idf.git
synced 2025-10-06 05:10:36 +00:00
esp_adc: added adc digital filter feature
This commit is contained in:

committed by
Armando (Dou Yiwen)

parent
648b1a41c6
commit
3afa671069
@@ -362,58 +362,77 @@ static inline void adc_ll_digi_controller_clk_disable(void)
|
||||
/**
|
||||
* Reset adc digital controller filter.
|
||||
*
|
||||
* @param idx Filter index
|
||||
* @param adc_n ADC unit.
|
||||
*/
|
||||
static inline void adc_ll_digi_filter_reset(adc_unit_t adc_n)
|
||||
static inline void adc_ll_digi_filter_reset(adc_digi_iir_filter_t idx, adc_unit_t adc_n)
|
||||
{
|
||||
abort();
|
||||
(void)adc_n;
|
||||
APB_SARADC.filter_ctrl0.filter_reset = 1;
|
||||
APB_SARADC.filter_ctrl0.filter_reset = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set adc digital controller filter factor.
|
||||
* Set adc digital controller filter coeff.
|
||||
*
|
||||
* @param adc_n ADC unit.
|
||||
* @param factor Expression: filter_data = (k-1)/k * last_data + new_data / k. Set values: (2, 4, 8, 16, 64).
|
||||
* @param idx filter index
|
||||
* @param adc_n adc unit
|
||||
* @param channel adc channel
|
||||
* @param coeff filter coeff
|
||||
*/
|
||||
static inline void adc_ll_digi_filter_set_factor(adc_unit_t adc_n, adc_digi_filter_mode_t factor)
|
||||
static inline void adc_ll_digi_filter_set_factor(adc_digi_iir_filter_t idx, adc_unit_t adc_n, adc_channel_t channel, adc_digi_iir_filter_coeff_t coeff)
|
||||
{
|
||||
abort();
|
||||
uint32_t factor_reg_val = 0;
|
||||
switch (coeff) {
|
||||
case ADC_DIGI_IIR_FILTER_COEFF_2:
|
||||
factor_reg_val = 1;
|
||||
break;
|
||||
case ADC_DIGI_IIR_FILTER_COEFF_4:
|
||||
factor_reg_val = 2;
|
||||
break;
|
||||
case ADC_DIGI_IIR_FILTER_COEFF_8:
|
||||
factor_reg_val = 3;
|
||||
break;
|
||||
case ADC_DIGI_IIR_FILTER_COEFF_16:
|
||||
factor_reg_val = 4;
|
||||
break;
|
||||
case ADC_DIGI_IIR_FILTER_COEFF_64:
|
||||
factor_reg_val = 6;
|
||||
break;
|
||||
default:
|
||||
HAL_ASSERT(false);
|
||||
}
|
||||
|
||||
if (idx == ADC_DIGI_IIR_FILTER_0) {
|
||||
APB_SARADC.filter_ctrl0.filter_channel0 = ((adc_n + 1) << 3) | (channel & 0x7);
|
||||
APB_SARADC.filter_ctrl1.filter_factor0 = factor_reg_val;
|
||||
} else if (idx == ADC_DIGI_IIR_FILTER_1) {
|
||||
APB_SARADC.filter_ctrl0.filter_channel1 = ((adc_n + 1) << 3) | (channel & 0x7);
|
||||
APB_SARADC.filter_ctrl1.filter_factor1 = factor_reg_val;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get adc digital controller filter factor.
|
||||
*
|
||||
* @param adc_n ADC unit.
|
||||
* @param factor Expression: filter_data = (k-1)/k * last_data + new_data / k. Set values: (2, 4, 8, 16, 64).
|
||||
*/
|
||||
static inline void adc_ll_digi_filter_get_factor(adc_unit_t adc_n, adc_digi_filter_mode_t *factor)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable adc digital controller filter.
|
||||
* Enable adc digital controller filter.
|
||||
* Filtering the ADC data to obtain smooth data at higher sampling rates.
|
||||
*
|
||||
* @note The filter will filter all the enabled channel data of the each ADC unit at the same time.
|
||||
* @param adc_n ADC unit.
|
||||
* @param idx filter index
|
||||
* @param adc_n ADC unit
|
||||
* @param enable Enable / Disable
|
||||
*/
|
||||
static inline void adc_ll_digi_filter_enable(adc_unit_t adc_n, bool enable)
|
||||
static inline void adc_ll_digi_filter_enable(adc_digi_iir_filter_t idx, adc_unit_t adc_n, bool enable)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filtered data of adc digital controller filter.
|
||||
* The data after each measurement and filtering is updated to the DMA by the digital controller. But it can also be obtained manually through this API.
|
||||
*
|
||||
* @note The filter will filter all the enabled channel data of the each ADC unit at the same time.
|
||||
* @param adc_n ADC unit.
|
||||
* @return Filtered data.
|
||||
*/
|
||||
static inline uint32_t adc_ll_digi_filter_read_data(adc_unit_t adc_n)
|
||||
{
|
||||
abort();
|
||||
(void)adc_n;
|
||||
if (!enable) {
|
||||
if (idx == ADC_DIGI_IIR_FILTER_0) {
|
||||
APB_SARADC.filter_ctrl0.filter_channel0 = 0xF;
|
||||
APB_SARADC.filter_ctrl1.filter_factor0 = 0;
|
||||
} else if (idx == ADC_DIGI_IIR_FILTER_1) {
|
||||
APB_SARADC.filter_ctrl0.filter_channel1 = 0xF;
|
||||
APB_SARADC.filter_ctrl1.filter_factor1 = 0;
|
||||
}
|
||||
}
|
||||
//nothing to do to enable, after adc_ll_digi_filter_set_factor, it's enabled.
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user