Перейти к содержанию
    

привет, помогите с непонятной проблемой. Код стандартный

 

измеряю значение опорного напряжения, Vref подключено к питанию, измеряю его ADC_Channel_17, должно быть 0xfff. Получаю 0x03B2

В чем ошибка?

 

uint16_t   adcVal;

void RCC_Configuration(void)
{
   SystemInit();

   RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1|
                     RCC_APB2Periph_GPIOA |
                     RCC_APB2Periph_GPIOB |
                     RCC_APB2Periph_GPIOC |
                     RCC_APB2Periph_GPIOD |
                     RCC_APB2Periph_GPIOE |
                     RCC_APB2Periph_AFIO  |
                     RCC_APB2Periph_ADC1,
                     ENABLE);
}

void init_adc(void)
{
   ADC_InitTypeDef ADC_InitStructure;
   ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
   ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
   ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
   ADC_InitStructure.ADC_NbrOfChannel=1;
   ADC_InitStructure.ADC_ScanConvMode=DISABLE;
   ADC_Init(ADC1,&ADC_InitStructure);

   ADC_RegularChannelConfig(ADC1,ADC_Channel_17,1,ADC_SampleTime_1Cycles5);
   ADC_Cmd(ADC1,ENABLE);

   ADC_ResetCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));
   ADC_StartCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));
}

int main(void)
{
   RCC_Configuration();

   init_led();
   init_usart();
   init_adc();

   ADC_SoftwareStartConvCmd(ADC1,ENABLE);
   while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
   adcVal=ADC_GetConversionValue(ADC1);

   GPIO_SetBits(GPIOB,GPIO_Pin_5);

    while(1){
    }
}

 

Еще странность, когда изменяю коэффициент тактирования, изменяются и показания

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мошть вывод Vref нельзя соединять со входом? Если на вход подавать близкое к опорному напряжение, то правильно показывает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В описании сказано:

Note: The TSVREFE bit must be set to enable both internal channels: ADCx_IN16 (temperature sensor) and ADCx_IN17 (VREFINT) conversion.
Я не знаю как и когда включает библиотека этот бит. Проверьте, включает ли она его. В даташите указано типичное время выборки при оцифровке канала внутренней опоры - 5.1...171 мкс. В вашем коде не вижу ни настройки тактирования (не могу определить время выборки по умолчанию), ни настройки времени выборки. Настройку времени нашел - 5 циклов. Но настройку тактирования все равно не вижу. Если АЦП работает на максимальной частоте 12 МГц, то 5 циклов - это примерно 417 нс, что значительно меньше необходимого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настройку времени нашел - 5 циклов.

На самом деле там 1.5 цикла. Слово "Cycles" - это положение десятичной точки.

К этому времени нужно добавить 12.5 цикла.

 

#define ADC_SampleTime_1Cycles5                    ((uint8_t)0x00)
#define ADC_SampleTime_7Cycles5                    ((uint8_t)0x01)
#define ADC_SampleTime_13Cycles5                   ((uint8_t)0x02)
#define ADC_SampleTime_28Cycles5                   ((uint8_t)0x03)
#define ADC_SampleTime_41Cycles5                   ((uint8_t)0x04)
#define ADC_SampleTime_55Cycles5                   ((uint8_t)0x05)
#define ADC_SampleTime_71Cycles5                   ((uint8_t)0x06)
#define ADC_SampleTime_239Cycles5                  ((uint8_t)0x07)

 

Подробности в RM

Example:

With an ADCCLK = 14 MHz and a sampling time of 1.5 cycles:

Tconv = 1.5 + 12.5 = 14 cycles = 1 μs

 

Насчет 17 канала АЦП: кто сказал, что там должно быть напряжение Vref АЦП?

Вроде там всегда было Vrefint = 1.20 В.

 

 

VREFINT Internal reference voltage (Min Typ Max Unit)

–40 °C < TA < +105 °C 1.16 1.20 1.26 V

–40 °C < TA < +85 °C 1.16 1.20 1.24 V

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К этому времени нужно добавить 12.5 цикла.
Зачем добавлять? Нас интересует время выборки, а не общее время преобразования.

Насчет 17 канала АЦП: кто сказал, что там должно быть напряжение Vref АЦП?

Вроде там всегда было Vrefint = 1.20 В.

В самом деле.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за помощь

 

TSVREFE устанавливается ADC_TempSensorVrefintCmd(ENABLE), у меня не было, увеличил время

значение получил 1.2

буду внимательнее читать документацию)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Появился еще вопрос. Правильно ли что для измерения показаний встроенного датчика температуры в приведенном выше коде достаточно изменить всего лишь номер канала с 17 на 16?

Измеряем значение ацп и по формуле переводим.

//1489=1.2/3.3 * 4096
Temp=(1489-adcVal);
        Temp=Temp/5;
        Temp+=25;

 

Проблема в том, что 1489-adcVal получается отрицательным(

 

Спасибо за помощь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странный какой-то у вас матан...

 

Temperature (in °C) = {(V25 - VSENSE) / Avg_Slope} + 25.

 

где V25 - Voltage at 25°C 1.32 1.41 1.50 V

Avg_Slope - Average slope 4.0 4.3 4.6 mV/°C

 

VSENSE = ADC_VALUE * 3300 / 4096 mV

 

У меня получилось:

 

T = (62156800 - 33000 * ADC_VALUE) / 176128

 

Для проверки:

ADC_VALUE -> Temp

1750 -> +25C

1883 -> 0C

2017 -> -25C

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот тут мы можем плавно перейти к решению предыдущей задачи :)

 

Термодатчик выдает абсолютное напряжение, не зависящее от напряжения питания (которое есть напряжение опоры в нашем АЦП). Значит мы можем исключить (ну хорошо, уменьшить) влияние изменений напряжения притания на показания температуры измерив напряжение внутренней опоры и из него пересчитав константу 3.3 (33000). Или я что-то упустил? Рассуждаю чисто теоретически, температуру внутренним датчиком мерить не приходилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

температуру внутренним датчиком мерить не приходилось.

Для начала цитата

The temperature sensor output voltage changes linearly with temperature. The offset of this

line varies from chip to chip due to process variation (up to 45 °C from one chip to another).

The internal temperature sensor is more suited to applications that detect temperature

variations instead of absolute temperatures. If accurate temperature readings are needed,

an external temperature sensor part should be used.

 

Своими словами: если нужно измерение температуры, то только внешний измеритель.

В современных (3xx, 0xx) stm32 дело обстоит по лучше (есть калибровочные константы прошиваемые при производстве чипа), но осадок остался...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возникла еще одна проблема с ацп + dma, прошу помощи

Такое ощущение что в массив результаты записываются не по порядку, а случайным образом(

По запросу передаю данные по ком порту

 

volatile uint16_t ADC_RAW_Buffer[9];

void init_dma(void)
{
  DMA_InitTypeDef DMA_InitStructure;

  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RAW_Buffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 9;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);

  DMA_Cmd(DMA1_Channel1, ENABLE);
  NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}

void init_adc(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 9;

  ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_3, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_12, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 2, ADC_SampleTime_71Cycles5);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 1,ADC_SampleTime_28Cycles5);

  ADC_TempSensorVrefintCmd(ENABLE);

  ADC_Init(ADC1, &ADC_InitStructure);
  ADC_Cmd (ADC1,ENABLE);   //enable ADC1

  ADC_ResetCalibration(ADC1);   // Reset previous calibration
  while(ADC_GetResetCalibrationStatus(ADC1));
  ADC_StartCalibration(ADC1);   // Start new calibration (ADC must be off at that time)
  while(ADC_GetCalibrationStatus(ADC1));

  ADC_DMACmd(ADC1, ENABLE);
  ADC_Cmd (ADC1,ENABLE);	  //enable ADC1
}

Спасибо

Изменено пользователем Herz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

   ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_3, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_12, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 2, ADC_SampleTime_71Cycles5);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 1,ADC_SampleTime_28Cycles5);

У вас на месте RANK стоит то 1 то 2, а должно быть от 1 до 9 раз у вас 9 каналов. Это порядковый номер канала в списке секвенсора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Не могу запустить АЦП та STM32F050F6P6 в CooCox IDE.

Компилятор реагирует неадекватно, не понимаю в чем дело. Взял из файла "stm32f0xx_adc.h" две строчки, вставил в код, реакция ниже:

При этом GPIO работает нормально, кнопки читаются на порты выводится.

 

 

...StdPeriph_Driver\src\stm32f0xx_rcc.c:636:15: error: 'RCC_CFGR_MCO_PRE' undeclared (first use in this function)

...StdPeriph_Driver\src\stm32f0xx_rcc.c:636:49: error: 'RCC_CFGR_PLLNODIV' undeclared (first use in this function)

 

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

C:\CooCox\CoIDE\workspace\32f050-pwm\main.c:24:23: error: expected declaration specifiers or '...' before '(' token

C:\CooCox\CoIDE\workspace\32f050-pwm\main.c:24:44: error: expected declaration specifiers or '...' before 'ENABLE'

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

C:\CooCox\CoIDE\workspace\32f050-pwm\main.c:25:24: error: expected declaration specifiers or '...' before '(' token

C:\CooCox\CoIDE\workspace\32f050-pwm\main.c:25:45: error: expected declaration specifiers or '...' before 'ENABLE'

 

 

Далее реакция компилятора на эти 6 строчек взятых с форума:

ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;

ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;

ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;

ADC_InitStructure.ADC_NbrOfChannel=1;

ADC_InitStructure.ADC_ScanConvMode=DISABLE;

\main.c:25:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token

 

 

ADC_Init(ADC1,&ADC_InitStructure);

\main.c:31:13: error: expected declaration specifiers or '...' before '(' token

\main.c:31:18: error: expected declaration specifiers or '...' before '&' token

 

ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5);

\main.c:33:29: error: expected declaration specifiers or '...' before '(' token

\main.c:33:34: error: expected declaration specifiers or '...' before '(' token

\main.c:33:49: error: expected declaration specifiers or '...' before numeric constant

 

Аналогично с попытками юзать примеры такого рода, ничего не работает! http://easystm32.ru/for-beginners/20-adc-in-stm32-part-2

Куда копать, помогите плиз...

Уже скачал так называемый драйвер от этого чипа - результат нулевой, файлы такие же как в репозитории IDE.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

...

Куда копать, помогите плиз...

Уже скачал так называемый драйвер от этого чипа - результат нулевой, файлы такие же как в репозитории IDE.

Спасибо.

 

#include <stm32f10x_rcc.h>

 

стоит в файле?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоит вот так. Файлы компилятор находит, т.к. если файл удалить он ругается что не найдено.

#include "stm32f0xx.h"

#include "stm32f0xx_rcc.h"

#include "stm32f0xx_adc.h"

#include "stm32f0xx_gpio.h"

 

У меня проц F0 переименовывал все согласно adc.h и rcc.h результата нема.

Изменено пользователем VVS_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...