|
проблема с АЦП, stm32f100 |
|
|
|
Dec 3 2014, 10:10
|

Частый гость
 
Группа: Участник
Сообщений: 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){ } } Еще странность, когда изменяю коэффициент тактирования, изменяются и показания
|
|
|
|
|
Dec 3 2014, 10:51
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 3 2014, 11:27
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 3 2014, 12:30
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 5 2014, 13:28
|

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

|
Появился еще вопрос. Правильно ли что для измерения показаний встроенного датчика температуры в приведенном выше коде достаточно изменить всего лишь номер канала с 17 на 16? Измеряем значение ацп и по формуле переводим. Код //1489=1.2/3.3 * 4096 Temp=(1489-adcVal); Temp=Temp/5; Temp+=25; Проблема в том, что 1489-adcVal получается отрицательным( Спасибо за помощь
|
|
|
|
|
Dec 5 2014, 20:07
|
Гуру
     
Группа: Свой
Сообщений: 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 дело обстоит по лучше (есть калибровочные константы прошиваемые при производстве чипа), но осадок остался...
|
|
|
|
|
Dec 12 2014, 10:27
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 19 2014, 18:58
|
Знающий
   
Группа: Участник
Сообщений: 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 каналов. Это порядковый номер канала в списке секвенсора.
|
|
|
|
|
Feb 11 2015, 12:04
|
Участник

Группа: Участник
Сообщений: 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. Спасибо.
|
|
|
|
|
Feb 11 2015, 13:10
|

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

|
Цитата(VVS_ @ Feb 11 2015, 07:04)  Здравствуйте! ... Куда копать, помогите плиз... Уже скачал так называемый драйвер от этого чипа - результат нулевой, файлы такие же как в репозитории IDE. Спасибо. #include <stm32f10x_rcc.h> стоит в файле?
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Feb 11 2015, 13:25
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|