STM32F407 и встроенный термодатчик (ADC1)
02.10.2014, 15:08
|
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
STM32F407 и встроенный термодатчик (ADC1)
Всем привет) Наверняка уже была такая тема, но найти я не смог.
Подскажите что ни так я делаю! Вроде бы все по DS: настроил АЦП1 на 16-й канал, включил термодатчик и считаю по указанной формуле! вроде бы все просто, но у меня получаются какие-то немыслимые значения(
из АЦП приходят значения от 1020 до 1098, ну а при расчете по формуле получаю отрицательные значения(
|
PHP код:
|
//********************ADC1**CH16******************** *******
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1-›CR1 |= ADC_CR1_DISCEN; /*!‹Discontinuous mode on regular channels */
ADC1-›CR1 |= ADC_CR1_SCAN; //Scan mode enabled
ADC-›CCR |=ADC_CCR_TSVREFE; //включаем термодатчик
ADC1-›SQR3 |=16; //16-й канал
ADC1-›SMPR1 |=ADC_SMPR1_SMP16; //111: 480 cycles
ADC1-›CR2 |=ADC_CR2_EXTEN_0; //Trigger detection on the rising edge
ADC1-›CR2 |=ADC_CR2_CONT;
ADC1-›CR2 |=ADC_CR2_ADON;
ADC1-›CR2 |=ADC_CR2_SWSTART;
//////////////КОНСТАНТЫ ИЗ DS ///////////////
float V_25 = 0.76; //Вольт
float Slope =0.0025; //2.5e-3; //Вольт
float Vref = 3.3; //Вольт
while(1)
{
ADC1-›CR2 |=ADC_CR2_SWSTART;
while (!(ADC1-›SR & ADC_SR_EOC));
data= ADC1-›DR;
float V_sense = data*Vref/4096.0; //преобразование попугаев в вольты
float temp3 = (V_25 - V_sense)/Slope + 25.0; //вычисление температуры
}
}
|
|
|
|
|
02.10.2014, 15:33
|
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Вам нужно взять другое значение для float V_25, типовое 0.76В Вам не годится.
В дейташите сказано, что выходное напряжение датчика температуры сдвинуто от чипа к чипу, и сдвиг может достигать 45 градусов.
Вам нужно проградуировать Ваш собственный чип. Измерить выходное напряжение при известной температуре, например при +20 в комнате, и вычислить своё собственное значение для float V_20. Потом использовать это значение в формуле
float temp3 = (V_20 - V_sense)/Slope + 20.0;
|
|
|
|
Сказали "Спасибо" Yurkin2014
|
|
|
02.10.2014, 16:04
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Пустое это занятие. Измеряет длину хвоста сферического коня в вакууме.
|
|
|
|
02.10.2014, 16:27
|
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Сообщение от Yurkin2014
|
Вам нужно взять другое значение для float V_25, типовое 0.76В Вам не годится.
В дейташите сказано, что выходное напряжение датчика температуры сдвинуто от чипа к чипу, и сдвиг может достигать 45 градусов.
Вам нужно проградуировать Ваш собственный чип. Измерить выходное напряжение при известной температуре, например при +20 в комнате, и вычислить своё собственное значение для float V_20. Потом использовать это значение в формуле
float temp3 = (V_20 - V_sense)/Slope + 20.0;
|
Спасибо, за совет) Я то откалибровал , но значения скачат до 10 градусов(
|
|
|
|
02.10.2014, 16:28
|
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Сообщение от Easyrider83
|
|
Пустое это занятие. Измеряет длину хвоста сферического коня в вакууме.
|
Согласен, занятие не оч перспективное!Но начальство приказало - изучить и выжать все из этого датчика xD
|
|
|
|
02.10.2014, 17:14
|
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Что-то не так в Ваших измерениях.
Я запустил на своём STM32F4 Дискавери измерения датчика температуры. Провёл 1000 измерений, получил значения АЦП стабильные от 1054 до 1056. В комнате воздух 27 градусов. При моём питании 2.95В пересчет даёт напряжение датчика 0.76В, типа 2 градуса сдвиг от типового.
|
|
|
|
03.10.2014, 10:08
|
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Сообщение от Yurkin2014
|
Что-то не так в Ваших измерениях.
Я запустил на своём STM32F4 Дискавери измерения датчика температуры. Провёл 1000 измерений, получил значения АЦП стабильные от 1054 до 1056. В комнате воздух 27 градусов. При моём питании 2.95В пересчет даёт напряжение датчика 0.76В, типа 2 градуса сдвиг от типового.
|
хм, интересно! Вы можете показать настройку ацп ? она отличается от моей ?
|
|
|
|
03.10.2014, 10:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Сообщение от STM32F4
|
|
но значения скачат до 10 градусов
|
Сообщение от Yurkin2014
|
|
Провёл 1000 измерений, получил значения АЦП стабильные от 1054 до 1056.
|
Измерения подряд или разовые? Между измерениями проц спит или нет? Термодатчик ATtiny45 вполне отчётливо показывал рост температуры (проц спит, если читать раз в 1..2 минуты - температура ниже, если поставить серию - есть рост и стабилизация на новом уровне).
|
|
|
|
03.10.2014, 10:31
|
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Сообщение от ForcePoint
|
|
Измерения подряд или разовые? Между измерениями проц спит или нет? Термодатчик ATtiny45 вполне отчётливо показывал рост температуры (проц спит, если читать раз в 1..2 минуты - температура ниже, если поставить серию - есть рост и стабилизация на новом уровне).
|
Я измеряю не по таймеру, один раз в секунду! запуск непрерывного измерения ничего не меняет!
|
|
|
|
03.10.2014, 12:13
|
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: STM32F407 и встроенный термодатчик (ADC1)
Сообщение от STM32F4
|
|
Вы можете показать настройку ацп ? она отличается от моей ?
|
Настройки такие: частота клоков АЦП 24МГц, одиночное измерение, скана нет, старт по таймеру2, частота таймера 100кГц
|
PHP код:
|
/* ADC Common Init ************************************************** ********/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_9Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC1 Init ************************************************** **************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel configuration *************************************/
ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
ADC_TempSensorVrefintCmd( ENABLE);
|
Сегодня прохладнее, получил 500 точек подряд, то есть пачка измерений через 10мкс, всего 5мс на 500 точек. Разброс от 1038 до 1040.
Последний раз редактировалось Yurkin2014; 03.10.2014 в 12:27.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:51.
|
|