Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery chibiOS - ADC


von Marcel H. (selvos)


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
}

von Alex E. (tecnologic) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.