infineon4engi@twitter infineon4engineers infineon@linkedin infineon@youtube
twitter Facebook Linkedin Youtube

+ Reply to Thread
Results 1 to 3 of 3

Thread: XMC 4700 ADC Boundary Check used to trigger Counter APP

  1. #1
    Beginner Beginner rephlex303 is on a distinguished road
    Join Date
    Feb 2017

    XMC 4700 ADC Boundary Check used to trigger Counter APP

    I have an XMC 4700.
    I have a 6kHz sine wave connected to P14.1.
    I am using the ADC_MEASUREMENT_ADV app and the COUNTER_APP.

    I would like to count the number of times the sine wave crosses zero. The zero offset is 2056U.

    I have enabled the "generate boundary flag" in the app, set the lower and upper boundary to Group Boundary 0 and 1 respectively.

    I have connected the "bound_fl_channel_A" to "counter_input".

    I can not get the counter to detect a zero crossing. It appears that the ADC signal is continuously outside the boundary, regardless of where I set the boundary.
    This is based on my investigation - the channel event is triggered every ADC conversion "If result outside band" is selected, regardless of boundary level.

    I set the boundary with this command:
    XMC_VADC_GROUP_SetBoundaries(GLOBAL_ADC_0.group_ptrs_array[ADC_MEASUREMENT_ADV_0.group_index]->group_handle, 0U, 2056U);
    Does anyone have any ideas as to what I'm doing wrong?

    I also have tried using the Event_Generator and Event_Detector apps and using an interrupt to increase a counter instead of the Counter APP but nothing has worked.

    My configuration is as follows:

    /********************************* Channel_A ADC Channel configuration structure ********************************/
    static const XMC_VADC_CHANNEL_CONFIG_t  ADC_MEASUREMENT_ADV_0_Channel_A_ch_config =
      .input_class                = (uint32_t) XMC_VADC_CHANNEL_CONV_GROUP_CLASS0,
      .lower_boundary_select      = (uint32_t) XMC_VADC_CHANNEL_BOUNDARY_GROUP_BOUND0,
      .upper_boundary_select      = (uint32_t) XMC_VADC_CHANNEL_BOUNDARY_GROUP_BOUND1,
      .event_gen_criteria         = (uint32_t) XMC_VADC_CHANNEL_EVGEN_INBOUND,
      .sync_conversion            = (uint32_t) false,                            /* Sync feature disabled*/
      .alternate_reference        = (uint32_t) XMC_VADC_CHANNEL_REF_INTREF,  /* Internal reference selected */
      .result_reg_number          = (uint32_t) 0,                           /* GxRES[0] selected */
      .result_alignment           = (uint32_t) XMC_VADC_RESULT_ALIGN_RIGHT,  /* Result alignment - Right Aligned*/
      .broken_wire_detect_channel = (uint32_t) XMC_VADC_CHANNEL_BWDCH_VAGND, /* No Broken wire mode select*/
      .broken_wire_detect         = (uint32_t) false,                     /* No Broken wire detection*/
      .invert_boundary_flag_ch0   = (uint32_t) false,
      .invert_boundary_flag_ch1   = (uint32_t) false,
      .invert_boundary_flag_ch2   = (uint32_t) false,
      .invert_boundary_flag_ch3   = (uint32_t) false,
      .flag_output_condition_ch0  = (uint32_t) false,
      .flag_output_condition_ch1  = (uint32_t) false,
      .flag_output_condition_ch2  = (uint32_t) false,
      .flag_output_condition_ch3  = (uint32_t) false,
      .boundary_flag_mode_ch0     = (uint32_t) 1,
      .boundary_flag_mode_ch1     = (uint32_t) 0,
      .boundary_flag_mode_ch2     = (uint32_t) 0,
      .boundary_flag_mode_ch3     = (uint32_t) 0,
      .channel_priority           = (uint32_t) true,                      /* Highest Priority: 1 selected*/
      .alias_channel              = (int8_t) XMC_VADC_CHANNEL_ALIAS_CH1  /* Channel is Aliased*/
    /*Channel_A Result configuration structure*/
    static const XMC_VADC_RESULT_CONFIG_t ADC_MEASUREMENT_ADV_0_Channel_A_res_config =
      .data_reduction_control  = (uint32_t) 0,
      .post_processing_mode    = (uint32_t) XMC_VADC_DMM_REDUCTION_MODE,
      .wait_for_read_mode      = (uint32_t) false,
      .part_of_fifo            = (uint32_t) false , /* No FIFO */
      .event_gen_enable        = (uint32_t) false   /* Disable Result event */
    /* Channel_A ADC channel Handle */
      .ch_num        = (uint8_t) 0,
      .group_index   = (uint8_t) 0,
      .ch_handle     = (XMC_VADC_CHANNEL_CONFIG_t*) &ADC_MEASUREMENT_ADV_0_Channel_A_ch_config,
      .res_handle[0] = (XMC_VADC_RESULT_CONFIG_t*) &ADC_MEASUREMENT_ADV_0_Channel_A_res_config,   
    and for the Counter APP:
    /************************************** PULSE_CNT *********************************************/
    /* Event configuration for counter instance PULSE_CNT */
    XMC_CCU4_SLICE_EVENT_CONFIG_t PULSE_CNT_event0_config = 
      .mapped_input = XMC_CCU4_SLICE_INPUT_H,
    /*Configuration structure for CCU4 Counter for PULSE_CNT */
    COUNTER_CCU4_CONFIG_t  PULSE_CNT_ccu4_config =
      .global_handle          = (GLOBAL_CCU4_t*) &GLOBAL_CCU4_0,
      .kernel_ptr             = (XMC_CCU4_MODULE_t*) (void*) CCU43_BASE,
      .slice_ptr              = (XMC_CCU4_SLICE_t*) (void*) CCU43_CC40,
      .event0_config          = (XMC_CCU4_SLICE_EVENT_CONFIG_t*) &PULSE_CNT_event0_config,
      .count_dir_event_config = NULL,
      .gating_event_config    = NULL,
      .shadow_mask            = (uint32_t)XMC_CCU4_SHADOW_TRANSFER_SLICE_0,
      .count_match_value      = (uint16_t) 11840,
      .countdir_event         = XMC_CCU4_SLICE_EVENT_NONE,
      .gating_event           = XMC_CCU4_SLICE_EVENT_NONE,
      .count_match_node_id    = XMC_CCU4_SLICE_SR_ID_0,
      .count_rollover_node_id = XMC_CCU4_SLICE_SR_ID_0,
      .event_edge_det_node_id = XMC_CCU4_SLICE_SR_ID_0,
      .event1_node_id         = XMC_CCU4_SLICE_SR_ID_0,
      .event2_node_id         = XMC_CCU4_SLICE_SR_ID_0,
      .state                  = COUNTER_STATUS_UNINITIALIZED,
      .kernel_number          = (uint8_t) 3,
      .slice_number           = (uint8_t) 0,
      .intr_count_match       = (bool) false,
      .intr_count_rollover    = (bool) false,
      .intr_evt_edge_detect   = (bool) false,
      .intr_event1_detect     = (bool) false,
       .intr_event2_detect    = (bool) false,
      .init_start             = (bool) true

  2. #2
    Beginner Beginner rephlex303 is on a distinguished road
    Join Date
    Feb 2017
    I have managed to get something working that will be good enough for my applicacation. However I still can't get the Boundary Check to work correctly.

    The working setup uses an autoscan low priority background request to continuously trigger an aliased ADC channel 0 in fast compare mode. Once a cycle, at a zero crossing an event is generated and is connected to the Counter APP via the Event Generator App.


  3. #3
    Beginner Beginner rephlex303 is on a distinguished road
    Join Date
    Feb 2017
    One thing I am still having an issue with is getting the hysteresis band to work. Does anyone know how you would go about doing this? Does the XMC 4700 have hysteresis automatically or does it have to be defined in software?

    In the reference manual on page 215 it says:
    "In Fast Compare Mode, a boundary flag reflects the result of the comparisons, i.e. it will be set/cleared when the compared signal level is above the compare value, and will be cleared/set when the signal level is below the compare value. The delta values define ahysteresis band around the compare value."
    However in "Infineon-VADC-XMC4000-AP32305-AN-v01_02-EN" it says:
    "For the XMC4500 microcontroller, the hysteresis in Fast Compare Mode has to be defined by software. An application example is depicted below. Here, the DMA switches the comparison value from Result Register 0 (RES0) to Result Register 1 (RES1) and vice-versa. Each DMA switch is triggered by the channel event generated if the conversion result changes to either level, above or below the compare value."
    No mention is given to the XMC4700 in that paper.

+ Reply to Thread

Tags for this Thread


All content and materials on this site are provided “as is“. Infineon makes no warranties or representations with regard to this content and these materials of any kind, whether express or implied, including without limitation, warranties or representations of merchantability, fitness for a particular purpose, title and non-infringement of any third party intellectual property right. No license, whether express or implied, is granted by Infineon. Use of the information on this site may require a license from a third party, or a license from Infineon.

Infineon accepts no liability for the content and materials on this site being accurate, complete or up- to-date or for the contents of external links. Infineon distances itself expressly from the contents of the linked pages, over the structure of which Infineon has no control.

Content on this site may contain or be subject to specific guidelines or limitations on use. All postings and use of the content on this site are subject to the Usage Terms of the site; third parties using this content agree to abide by any limitations or guidelines and to comply with the Usage Terms of this site. Infineon reserves the right to make corrections, deletions, modifications, enhancements, improvements and other changes to the content and materials, its products, programs and services at any time or to move or discontinue any content, products, programs, or services without notice.