Hello,
What I am trying to do is read two adc channels IN11 and IN15.
I want to read them separately.
Each one reads in its own thread and so far I am using ADCD1 and ADCD2.
My problem is when using the two ADCD's it appears to be resource hungry as my code stops when trying to read the two at the same time but when I only use one ADCD for both (While testing) my code works fine.
Can I read IN11 and IN12 both separately on ADCD1 and save resources?
Or should I not be using threads?
My board is a stm32f4 discovery.
Thank You.
I get this during debug
0x080018ae in chSysHalt (reason=0x8009700 <__func__.7418> "adcStartConversionI") at ../os/rt/src/chsys.c:164
164 ch.dbg.panic_msg = reason;
ADC Read Two Separate Channels
Moderators: RoccoMarco, lbednarz, utzig, tfAteba, barthess
- Giovanni
- Site Admin
- Posts: 14444
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1074 times
- Been thanked: 921 times
- Contact:
Re: ADC Read Two Separate Channels
You should be able to use both ADCs.
Please post the whole stack trace and the string pointed by ch.dbg.panic_msg, most likely you have a call violation (function called out of proper context).
Giovanni
Please post the whole stack trace and the string pointed by ch.dbg.panic_msg, most likely you have a call violation (function called out of proper context).
Giovanni
-
- Posts: 94
- Joined: Thu Apr 11, 2013 10:35 am
Re: ADC Read Two Separate Channels
Well I tried to simplify my code a bit and now i get this..
trace..
Thread [1] <main> (Suspended : Signal : SIGTRAP:Trace/breakpoint trap)
adc_lld_serve_rx_interrupt.lto_priv.102() at adc_lld.c:86 0x800229c
Vector128() at stm32_dma.c:315 0x8001d52
0xffffffec
and this..
The target endianness is set automatically (currently little endian)
Temporary breakpoint 1, main () at main.c:1098
1098 halInit();
No breakpoint number 2.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0800229c in adc_lld_serve_rx_interrupt.lto_priv.102 (adcp=0x20000ff8 <ADCD2>, flags=32) at ../os/hal/ports/STM32/STM32F4xx/adc_lld.c:86
86 if (adcp->grpp != NULL) {
trace..
Thread [1] <main> (Suspended : Signal : SIGTRAP:Trace/breakpoint trap)
adc_lld_serve_rx_interrupt.lto_priv.102() at adc_lld.c:86 0x800229c
Vector128() at stm32_dma.c:315 0x8001d52
0xffffffec
and this..
The target endianness is set automatically (currently little endian)
Temporary breakpoint 1, main () at main.c:1098
1098 halInit();
No breakpoint number 2.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0800229c in adc_lld_serve_rx_interrupt.lto_priv.102 (adcp=0x20000ff8 <ADCD2>, flags=32) at ../os/hal/ports/STM32/STM32F4xx/adc_lld.c:86
86 if (adcp->grpp != NULL) {
-
- Posts: 94
- Joined: Thu Apr 11, 2013 10:35 am
Re: ADC Read Two Separate Channels
This Is my code.
then starting the adc's
then I am using two threads to process each of the samples.
Code: Select all
//***********************************//
//ADC SETUP
//***********************************//
#define ADC_GRP1_NUM_CHANNELS 1
#define ADC_GRP1_BUF_DEPTH 10
#define ADC_GRP2_NUM_CHANNELS 1
#define ADC_GRP2_BUF_DEPTH 1
static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
/*
* ADC streaming callback.
*/
size_t nx = 0, ny = 0;
static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) {
(void)adcp;
(void)err;
}
/*
* ADC conversion group.
* Mode: Linear buffer, 10 samples of 1 channel, SW triggered.
* Channels: IN11.
*/
//Coil Sample ADC
static const ADCConversionGroup adcgrpcfg1 = {
TRUE,
ADC_GRP1_NUM_CHANNELS,
NULL,
NULL,
0, /* CR1 */
ADC_CR2_SWSTART, /* CR2 */
ADC_SMPR1_SMP_AN11(ADC_SAMPLE_112),
0, /* SMPR2 */
ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS),
0, /* SQR2 */
ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11)
};
/*
* ADC conversion group.
* Mode: Linear Buffer, 10 samples of 1 channel, SW triggered.
* Channels: IN11, IN12, IN11, IN12, IN11, IN12, Sensor, VRef.
*/
//Battery Level ADC
static const ADCConversionGroup adcgrpcfg2 = {
TRUE,
ADC_GRP2_NUM_CHANNELS,
NULL,
NULL,
0, /* CR1 */
ADC_CR2_SWSTART, /* CR2 */
ADC_SMPR1_SMP_AN15(ADC_SAMPLE_112),
0, /* SMPR2 */
ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS),
0,
ADC_SQR3_SQ1_N(ADC_CHANNEL_IN15)
};
then starting the adc's
Code: Select all
adcStart(&ADCD1, NULL);
adcStart(&ADCD2, NULL);
adcStartConversion(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH);
adcStartConversion(&ADCD2, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH);
then I am using two threads to process each of the samples.
- Giovanni
- Site Admin
- Posts: 14444
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1074 times
- Been thanked: 921 times
- Contact:
Re: ADC Read Two Separate Channels
Please proceed as follow:
1) Make sure that debug options are enabled in chconf.h: assertions, checks and state checker.
2) The application should halt if something is caught.
3) Retrieve the message pointed by ch.dbg.panic_msg in memory after the halt, it is a string terminated by zero.
4) Get the stack trace from the halted position.
The message will tell you the nature of the problem, the stack trace will tell you where the problem is.
Giovanni
1) Make sure that debug options are enabled in chconf.h: assertions, checks and state checker.
2) The application should halt if something is caught.
3) Retrieve the message pointed by ch.dbg.panic_msg in memory after the halt, it is a string terminated by zero.
4) Get the stack trace from the halted position.
The message will tell you the nature of the problem, the stack trace will tell you where the problem is.
Giovanni
-
- Posts: 94
- Joined: Thu Apr 11, 2013 10:35 am
Re: ADC Read Two Separate Channels
Well it turned out to not be the ADC's causing the problem.
I was using the GPT with polled delay as I need a 10us delay in one of the threads and this was causing the problem.
I did try the halPolledDelay but I get a "Undefined reference" error.
I am using chibios 3.0 has it been implemented yet?
I was using the GPT with polled delay as I need a 10us delay in one of the threads and this was causing the problem.
I did try the halPolledDelay but I get a "Undefined reference" error.
I am using chibios 3.0 has it been implemented yet?
- Giovanni
- Site Admin
- Posts: 14444
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1074 times
- Been thanked: 921 times
- Contact:
Re: ADC Read Two Separate Channels
Hi,
halPolledDelay () is no more part of 3.0, now the functionality is in the kernel and is called chSysPolledDelayX().
Giovanni
halPolledDelay () is no more part of 3.0, now the functionality is in the kernel and is called chSysPolledDelayX().
Giovanni
Who is online
Users browsing this forum: No registered users and 12 guests