Sarog 0 3 декабря, 2014 Опубликовано 3 декабря, 2014 · Жалоба привет, помогите с непонятной проблемой. Код стандартный измеряю значение опорного напряжения, 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){ } } Еще странность, когда изменяю коэффициент тактирования, изменяются и показания Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 25 3 декабря, 2014 Опубликовано 3 декабря, 2014 · Жалоба Мошть вывод Vref нельзя соединять со входом? Если на вход подавать близкое к опорному напряжение, то правильно показывает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 3 декабря, 2014 Опубликовано 3 декабря, 2014 · Жалоба В описании сказано: 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 нс, что значительно меньше необходимого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 декабря, 2014 Опубликовано 3 декабря, 2014 · Жалоба Настройку времени нашел - 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 3 декабря, 2014 Опубликовано 3 декабря, 2014 · Жалоба К этому времени нужно добавить 12.5 цикла.Зачем добавлять? Нас интересует время выборки, а не общее время преобразования. Насчет 17 канала АЦП: кто сказал, что там должно быть напряжение Vref АЦП? Вроде там всегда было Vrefint = 1.20 В. В самом деле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sarog 0 4 декабря, 2014 Опубликовано 4 декабря, 2014 · Жалоба Всем спасибо за помощь TSVREFE устанавливается ADC_TempSensorVrefintCmd(ENABLE), у меня не было, увеличил время значение получил 1.2 буду внимательнее читать документацию) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sarog 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Появился еще вопрос. Правильно ли что для измерения показаний встроенного датчика температуры в приведенном выше коде достаточно изменить всего лишь номер канала с 17 на 16? Измеряем значение ацп и по формуле переводим. //1489=1.2/3.3 * 4096 Temp=(1489-adcVal); Temp=Temp/5; Temp+=25; Проблема в том, что 1489-adcVal получается отрицательным( Спасибо за помощь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Странный какой-то у вас матан... 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба А вот тут мы можем плавно перейти к решению предыдущей задачи :) Термодатчик выдает абсолютное напряжение, не зависящее от напряжения питания (которое есть напряжение опоры в нашем АЦП). Значит мы можем исключить (ну хорошо, уменьшить) влияние изменений напряжения притания на показания температуры измерив напряжение внутренней опоры и из него пересчитав константу 3.3 (33000). Или я что-то упустил? Рассуждаю чисто теоретически, температуру внутренним датчиком мерить не приходилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба температуру внутренним датчиком мерить не приходилось. Для начала цитата 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 дело обстоит по лучше (есть калибровочные константы прошиваемые при производстве чипа), но осадок остался... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sarog 0 12 декабря, 2014 Опубликовано 12 декабря, 2014 (изменено) · Жалоба Возникла еще одна проблема с ацп + 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 } Спасибо Изменено 19 декабря, 2014 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 19 декабря, 2014 Опубликовано 19 декабря, 2014 · Жалоба 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 каналов. Это порядковый номер канала в списке секвенсора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VVS_ 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба Здравствуйте! Не могу запустить АЦП та 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. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба Здравствуйте! ... Куда копать, помогите плиз... Уже скачал так называемый драйвер от этого чипа - результат нулевой, файлы такие же как в репозитории IDE. Спасибо. #include <stm32f10x_rcc.h> стоит в файле? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VVS_ 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 (изменено) · Жалоба Стоит вот так. Файлы компилятор находит, т.к. если файл удалить он ругается что не найдено. #include "stm32f0xx.h" #include "stm32f0xx_rcc.h" #include "stm32f0xx_adc.h" #include "stm32f0xx_gpio.h" У меня проц F0 переименовывал все согласно adc.h и rcc.h результата нема. Изменено 11 февраля, 2015 пользователем VVS_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться