nRF52832 and NCS - using COMP to monitor incoming voltage signal

This is my environment

  • IDE: VSC
  • SDK: NCS v2.2.0
  • nRF52832 on custom hardware

This is what I am trying to do:

  1. Monitor the analog signal on one of my AIN pins using the COMP functionality
  2. Trigger an interrupt when that signal either goes above a reference level or below a reference level

The signal itself will normally sit at 1.0V, but when it gets a stimulus (its basically a Hall Effect sensor, so reacts to changing B-fields) I want to be able to capture that and see how far off set point it has gone (will do some fast ADC at this point).

This is how I have set up my COMP

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define COMP_LPCOMP_IRQn 19
nrfx_comp_config_t comp_config = {
.reference = COMP_REFSEL_REFSEL_Int2V4, /* Internal 2.4V reference */
//.ext_ref = NRF_COMP_EXT_REF_3, /* Analog reference connected to AIN3 */
.main_mode = NRF_COMP_MAIN_MODE_SE, /* Single ended mode. */
.threshold = {
.th_down = NRFX_VOLTAGE_THRESHOLD_TO_INT(1.5, 2.4),
.th_up = NRFX_VOLTAGE_THRESHOLD_TO_INT(2.0, 2.4),
}, /* THDOWN and THUP values needed by the COMP_TH register. */
.speed_mode = NRF_COMP_SP_MODE_High, /* Speed mode set to high. */
.hyst = NRF_COMP_HYST_50mV, /* Comparator hysteresis. */
.isource = NRF_COMP_ISOURCE_Off, /* Current source selected on analog input. */
.input = NRF_COMP_INPUT_2, /* AIN2 to be monitored. */
.interrupt_priority = NRFX_COMP_DEFAULT_CONFIG_IRQ_PRIORITY, /* Interrupt priority. */
};
void comparator_handler(nrf_comp_event_t event)
{
switch (event)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

This is my proj.conf:

Fullscreen
1
2
3
4
5
6
7
CONFIG_ADC=y
CONFIG_COUNTER=y
CONFIG_COUNTER_TIMER0=y
CONFIG_COUNTER_TIMER1=y
CONFIG_NRFX_COMP=y
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

And in my main.c, this is how I set things up:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nrfx_comp_event_handler_t comp_event_config = comparator_handler;
nrfx_err = nrfx_comp_init(&comp_config, comp_event_config);
if (nrfx_err != NRFX_SUCCESS)
{
printk("ERR comp init (err %d)\n", nrfx_err);
return ;
}
/* Connect COMP_IRQ to nrfx_comp_irq_handler */
IRQ_CONNECT(COMP_LPCOMP_IRQn,
comp_config.interrupt_priority,
nrfx_isr,
nrfx_comp_irq_handler,
0);
nrfx_comp_start(NRFX_COMP_EVT_EN_CROSS_MASK |
NRFX_COMP_EVT_EN_UP_MASK |
NRFX_COMP_EVT_EN_DOWN_MASK |
NRFX_COMP_EVT_EN_READY_MASK, 0);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I've been using this ticket as a guide as to how to get things working.

Problem I am having, is I am getting a bunch of build errors associated with the code that attempts to call IRQ_CONNECT():

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
C:\Nordic\v2.2.0\zephyr\include\zephyr\arch\arm\aarch32\irq.h:107:61: error: expression in static assertion is not constant
105 | BUILD_ASSERT(((flags_p & IRQ_ZERO_LATENCY) && \
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
106 | ((ZERO_LATENCY_LEVELS == 1) || \
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107 | (priority_p < ZERO_LATENCY_LEVELS))) || \
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
108 | (priority_p <= IRQ_PRIO_LOWEST), \
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Nordic\v2.2.0\zephyr\include\zephyr\toolchain\gcc.h:77:51: note: in definition of macro 'BUILD_ASSERT'
77 | #define BUILD_ASSERT(EXPR, MSG...) _Static_assert(EXPR, "" MSG)
| ^~~~
C:\Nordic\v2.2.0\zephyr\include\zephyr\arch\arm\aarch32\irq.h:128:9: note: in expansion of macro '_CHECK_PRIO'
128 | _CHECK_PRIO(priority_p, flags_p) \
| ^~~~~~~~~~~
C:\Nordic\v2.2.0\zephyr\include\zephyr\irq.h:49:9: note: in expansion of macro 'ARCH_IRQ_CONNECT'
49 | ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p)
| ^~~~~~~~~~~~~~~~
c:\Nordic\Development\adc\src\main.c:233:9: note: in expansion of macro 'IRQ_CONNECT'
233 | IRQ_CONNECT(COMP_LPCOMP_IRQn,
| ^~~~~~~~~~~
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

If I dive into the irq.h header, it looks like there is an issue with the check on ZERO_LATENCY_LEVELS.  So, I basically added this to my proj.conf

Fullscreen
1
2
CONFIG_ZERO_LATENCY_IRQS=y
CONFIG_ZERO_LATENCY_LEVELS=7
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

This seems to overcome the build errors.  Interestingly, if I set CONFIG_ZERO_LATENCY_LEVELS < 7, the build errors remain.

However, with those settings, my code isn't actually running!

So, clearly I've no idea what I'm doing, and could do with a bit of assistance in getting what, on the surface, seems like a pretty simple function working

Thanks and regards,

Mike