реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> проблема с АЦП, stm32f100
Mikron
сообщение Dec 3 2014, 10:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



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

измеряю значение опорного напряжения, 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){
    }
}


Еще странность, когда изменяю коэффициент тактирования, изменяются и показания
Go to the top of the page
 
+Quote Post
ДЕЙЛ
сообщение Dec 3 2014, 10:34
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Мошть вывод Vref нельзя соединять со входом? Если на вход подавать близкое к опорному напряжение, то правильно показывает?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2014, 10:51
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



В описании сказано:
Цитата
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 нс, что значительно меньше необходимого.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 3 2014, 11:27
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Сергей Борщ @ Dec 3 2014, 14:51) *
Настройку времени нашел - 5 циклов.

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

CODE
#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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2014, 12:30
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(adnega @ Dec 3 2014, 13:27) *
К этому времени нужно добавить 12.5 цикла.
Зачем добавлять? Нас интересует время выборки, а не общее время преобразования.
Цитата(adnega @ Dec 3 2014, 13:27) *
Насчет 17 канала АЦП: кто сказал, что там должно быть напряжение Vref АЦП?
Вроде там всегда было Vrefint = 1.20 В.
В самом деле.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Mikron
сообщение Dec 4 2014, 10:53
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



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

TSVREFE устанавливается ADC_TempSensorVrefintCmd(ENABLE), у меня не было, увеличил время
значение получил 1.2
буду внимательнее читать документацию)
Go to the top of the page
 
+Quote Post
Mikron
сообщение Dec 5 2014, 13:28
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



Появился еще вопрос. Правильно ли что для измерения показаний встроенного датчика температуры в приведенном выше коде достаточно изменить всего лишь номер канала с 17 на 16?
Измеряем значение ацп и по формуле переводим.
Код
//1489=1.2/3.3 * 4096
Temp=(1489-adcVal);
        Temp=Temp/5;
        Temp+=25;


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

Спасибо за помощь
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 5 2014, 13:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 5 2014, 18:32
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 5 2014, 20:07
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Сергей Борщ @ Dec 5 2014, 22:32) *
температуру внутренним датчиком мерить не приходилось.

Для начала цитата
Цитата
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 дело обстоит по лучше (есть калибровочные константы прошиваемые при производстве чипа), но осадок остался...
Go to the top of the page
 
+Quote Post
Mikron
сообщение Dec 12 2014, 10:27
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



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

CODE
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 - Dec 19 2014, 20:16
Go to the top of the page
 
+Quote Post
kan35
сообщение Dec 19 2014, 18:58
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Код
   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 каналов. Это порядковый номер канала в списке секвенсора.
Go to the top of the page
 
+Quote Post
VVS_
сообщение Feb 11 2015, 12:04
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 12-03-10
Пользователь №: 55 913



Здравствуйте!
Не могу запустить АЦП та 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.
Спасибо.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 11 2015, 13:10
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(VVS_ @ Feb 11 2015, 07:04) *
Здравствуйте!
...
Куда копать, помогите плиз...
Уже скачал так называемый драйвер от этого чипа - результат нулевой, файлы такие же как в репозитории IDE.
Спасибо.


#include <stm32f10x_rcc.h>

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
VVS_
сообщение Feb 11 2015, 13:25
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 12-03-10
Пользователь №: 55 913



Стоит вот так. Файлы компилятор находит, т.к. если файл удалить он ругается что не найдено.
#include "stm32f0xx.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_gpio.h"

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

Сообщение отредактировал VVS_ - Feb 11 2015, 13:26
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016