Configurando ADC en STM32F3

0

Estoy intentando habilitar un convertidor ADC. Estoy usando STM32F3 Discovery with SPL Library. Mido voltaje en el pin PA1. No sé por qué no funciona. ¿Qué me he perdido? El valor de la variable 'valor' no cambia y es igual a 0.

#include "stm32f30x.h"
#include "stm32f30x_rcc.h"
#include "stm32f30x_adc.h"
#include <stm32f30x_gpio.h>


uint16_t Read_ADC()
{
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_4Cycles5);
    ADC_StartConversion(ADC1);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
    return ADC_GetConversionValue(ADC1);
}

void delay_ms (int time)
{
    int i;
    for (i = 0; i < time * 4000; i++) {}
}

int main()
{

  uint16_t value = 0;

  GPIO_InitTypeDef GPIO_InitStructure;
  ADC_InitTypeDef ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;

  RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //PA1 ADC1_IN2
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);

  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Pin  = LED;
  GPIO_Init( GPIOE, &GPIO_InitStructure);
  uint32_t led = 0;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_Init(ADC1, &ADC_InitStructure);
  ADC_Cmd(ADC1, ENABLE);


  while(1)
      {
          value = Read_ADC();
      }
}
    
pregunta marek.m371

2 respuestas

0

No has habilitado el reloj ADC. Intenta

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);

Si eso no funciona, usa tu IDE para encontrar la declaración de RCC_AHBPeriphClockCmd y lee la fuente para ver si me he equivocado con el nombre del reloj.

El Los documentos de la biblioteca STM30xx probablemente sean de ayuda. Habilitar el reloj ADC es el paso 2 en la Sección 3.2.1, y no puedo ver nada más que haya perdido. De ese doc:

  

3.2.1 Cómo usar este controlador

     
  1. seleccione el reloj ADC mediante la función RCC_ADCCLKConfig ()

  2.   
  3. Habilite el reloj de la interfaz ADC utilizando RCC_AHBPeriphClockCmd ();

  4.   
  5. Configuración de pines ADC  Habilite el reloj para los GPIOs de ADC usando la siguiente función: RCC_AHBPeriphClockCmd (RCC_AHBPeriph_GPIOx,   HABILITAR);  Configure estos pines ADC en modo analógico usando GPIO_Init ();

  6.   
  7. Configure la resolución de conversión ADC, la alineación de datos, el desencadenante externo y el borde, la longitud del secuenciador y la activación / desactivación de la continua   modo mediante la función ADC_Init ().

  8.   
  9. Active el periférico ADC usando la función ADC_Cmd ().   FWIW, cuando tengo problemas, normalmente entro en las declaraciones de la biblioteca, ya que estas funciones tienden a estar muy bien documentadas.

  10.   

FWIW, mi SOP para problemas de biblioteca es encontrar la declaración en la biblioteca, ya que las bibliotecas suelen estar bastante bien autodocumentadas.

    
respondido por el Scott Seidman
0

Tengo algo como esto

#include "stm32f30x.h"
#include "stm32f30x_rcc.h"
#include "stm32f30x_adc.h"
#include <stm32f30x_gpio.h>

#define LED (GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)

uint16_t convertedValue= 0;

void delay_ms (int time)
{
    int i;
    for (i = 0; i < time * 4000; i++) {}
}

void Configure_ADC(void)
{
    RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    ADC_DeInit(ADC1);
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_10b;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;
    ADC_InitStructure.ADC_NbrOfRegChannel = 1;
    ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
    ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
    ADC_Init(ADC1,&ADC_InitStructure);
    ADC_Cmd(ADC1, ENABLE);
}

uint16_t Read_ADC()
{
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 1,    ADC_SampleTime_1Cycles5);
    ADC_StartConversion(ADC1);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
    return ADC_GetConversionValue(ADC1);
}

int main()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Pin  = LED;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    uint32_t led = 0;


    while(1)
      {

          convertedValue = Read_ADC();//Read the ADC converted value
          GPIO_SetBits(GPIOE, 1 << led); //turn on a diode
          delay_ms(150); // wait
          GPIO_ResetBits(GPIOE, 1 << led); //turn off a diode
          if (++led >= 16)
              {
                  led = 8;
              }
      }
}

He configurado de acuerdo con el manual. El programa se detiene en la función Read_ADC.

    
respondido por el marek.m371

Lea otras preguntas en las etiquetas