STM32F4 Discovery chibiOS - ADC

OP #3432527
Lesenswert?

Hallo,
ich habe noch eine Frage zum STM32F4 zusammen mit dem chibiOS.
Wie lese ich den Buffer der ADC-Wandlung aus?
Z.B. wollte ich eine LED anschalten wenn der Wert größer als 100 ist.

Sozusagen:
1
if ( Digitalwert >100 )
2
   palSetPad(GPIOD, GPIOD_LED3);

Hier mein Code:
1
/*........*/
2

3
/* Total number of channels to be sampled by a single ADC operation.*/
4
#define ADC_GRP1_NUM_CHANNELS   1
5
 
6
/* Depth of the conversion buffer, channels are sampled eight times each.*/
7
#define ADC_GRP1_BUF_DEPTH     8
8

9
/*
10
 * ADC samples buffer.
11
 */
12
static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
13
 
14
/*
15
 * ADC conversion group.
16
 * Mode:        Linear buffer, 4 samples of 2 channels, SW triggered.
17
 * Channels:    IN11   (48 cycles sample time)
18
 *              Sensor (192 cycles sample time)
19
 */
20
static const ADCConversionGroup adcgrpcfg1 = {
21
  FALSE,
22
  ADC_GRP1_NUM_CHANNELS,
23
  NULL,
24
  NULL,
25
  0,                        /* CR1 */
26
  ADC_CR2_SWSTART,          /* CR2 */
27
  ADC_SMPR1_SMP_AN11(ADC_SAMPLE_3),
28
  0,                        /* SMPR2 */
29
  ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS),
30
  0,                        /* SQR2 */
31
  ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11)
32
};
33

34
/* ...... */
35

36
adcStart(&ADCD1, NULL);
37

38
while(1)
39
{
40
 adcStartConversion(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH);
41
 chThdSleepMilliseconds(100);
42

43
}
Persönliche Seite #3439871
Lesenswert?

Marcel H. schrieb:

> /*
>  * ADC samples buffer.
>  */
> static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
>
Hi Marcel,

samples1 ist dein buffer da stehen die samples drin, darüber kannste n 
Mittelwert bilden oder die Werte wie auch immer auswerten.

Bei deinen Einstellungen hast du also die letzten 8 Werte in dem Puffer 
stehen. Oder du reduzierst ADC_GRP1_BUF_DEPTH auf 1 und wertest einfach 
diesen einen Wert zyklisch aus.

Wenn es ganz schön machen willst machst das in der Callback des ADC 
Treibers.
1
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
2
   if ( buffer[0] >100 )
3
      palSetPad(GPIOD, GPIOD_LED3);  
4

5
}
6

7
/*
8
 * ADC conversion group.
9
 * Mode:        Linear buffer, 4 samples of 2 channels, SW triggered.
10
 * Channels:    IN11   (48 cycles sample time)
11
 *              Sensor (192 cycles sample time)
12
 */
13
static const ADCConversionGroup adcgrpcfg1 = {
14
  FALSE,
15
  ADC_GRP1_NUM_CHANNELS,
16
  adccallback,
17
  NULL,
18
  0,                        /* CR1 */
19
  ADC_CR2_SWSTART,          /* CR2 */
20
  ADC_SMPR1_SMP_AN11(ADC_SAMPLE_3),
21
  0,                        /* SMPR2 */
22
  ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS),
23
  0,                        /* SQR2 */
24
  ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11)
25
};

Mit der Callback und den Settings des Kanals sollte das gehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren