[Решено] чтение датчика температуры процессора синих таблеток

электрический
Пн 26 февраля 2018 г., 13:20
Прошло несколько дней, когда я застрял на этом. По сути, я не мог найти нигде примера для чтения температуры процессора, используя датчик, который подключен к АЦП. Библиотека STM32ADC заполнена функциями, которые должны сделать, но, как ни странно, они, кажется, сломаны. После многих часов попыток объединить их в рабочую программу, я все еще застрял. Я был снова и снова в классе и файлах утилиты, которые я открыл в Eclipse. Я пытался сделать это как с прерыванием, так и без них. Фундаментальная проблема заключается в том, что большинство функций, которые, очевидно, необходимы для выполнения работы, приводят к сбою BP с мигающим светом на PC13 и без ответа от серийного. Вот тестовая программа для подхода без прерывания: #include STM32ADC adc(ADC1); uint8 tempSensor = 16; void setup() { Serial.begin(115200); adc.calibrate(); adc.setSampleRate(ADC_SMPR_13_5); // enabling either of the // following two lines crash the system (PC13 is flashing): // adc.setChannels(&tempSensor, 1); // adc.enableInternalReading(); } void loop() { while (Serial.available() == 0); Serial.read(); adc.startConversion(); float cpu_temp = adc.readTemp(); Serial.print("temp: "); Serial.println(cpu_temp); }

Стивестронг
Пн 26 февраля 2018 г. 13:48
Вы пробовали этот пример: https: // github.com/rogerclarkmelbourne/ ... Датчик.Ино ?

Mrburnette
Пн 26 февраля 2018 г., 18:32
... Пито тоже есть его версия: ViewTopic.PHP?t = 1317

Итак, мои или пито, либо должны работать.

Луча

Это поиск в Google, который нашел код Пито: internal temperature sensor site:stm32duino.com

электрический
Вт 27 февраля 2018 г. 5:39
Я нашел код Пито ранее. Это не компилировало для меня без ошибок. Я думаю, что из -за разных версий Arduino IDE. Но приведенный выше связанный код скомпилирован и успешно работает. Я выработал математику, чтобы масштабировать ее до сегмента, используя эффективные расчеты с фиксированной точкой. Математика в библиотеке очень сильно неправильно, но я адаптировал ее. Я скоро опубликую это. Спасибо за помощь.

Стивестронг
Вт 27 февраля 2018 г. 16:19
[электрический - Вт 27 февраля 2018 г. 5:39 утра] - Математика в библиотеке очень сильно неправильно, но я адаптировал ее. Я скоро опубликую это.
Пожалуйста, сделайте это.

электрический
Вт 27 февраля 2018 г., 17:57
Вот тестовый код: #include const float AverageSlope = 0.0043; // V/oC, range specified .004 to .0046 const float V25 = 1.43; //Nominal volts, range specified 1.34 - 1.52 const uint16 voltsAt25C = round((V25 / 3.3) * 4096.0); // nominal ADC value at 25C void setup() { Serial.begin(115200); setup_temperature_sensor(); } void loop() { //pause for a key input while (Serial.available() == 0); Serial.read(); uint16 reading = adc_read(ADC1, 16); // show the raw ADC offset int differential = voltsAt25C - reading; Serial.print("raw ADC offset: "); Serial.println(differential); // convert ADC reading to Volts float voltage = 3.3 * reading / 4096; Serial.print("computed ADC volts: "); Serial.println(voltage); // show floating point computation value float cpu_temp = (float)((V25 - voltage) / AverageSlope) + 25.0; Serial.print("float calculated temp: "); Serial.println(cpu_temp); // compute temperature scaled by 100 as: // long scaledTemp = 33L * differential * 100000L / 4096 / 43 + 2500; // expression numerator and denominator factored by 32 to avoid // possible integer overflow: // long scaledTemp = 33L * 3125 * differential / (128 * 43) + 2500; Serial.print("scaled integer temp: "); Serial.println(scaledTemp); Serial.print("scaled integer temp as float: "); float makeFloat = (float)scaledTemp / 100; Serial.println(makeFloat); Serial.println(); } void setup_temperature_sensor() { adc_reg_map *regs = ADC1->regs; // 3. Set the TSVREFE bit in the ADC control register 2 (ADC_CR2) to wake up the // temperature sensor from power down mode. Do this first 'cause according to // the Datasheet section 5.3.21 it takes from 4 to 10 uS to power up the sensor. regs->CR2 |= ADC_CR2_TSVREFE; // 2. Select a sample time of 17.1 μs // set channel 16 sample time to 239.5 cycles // 239.5 cycles of the ADC clock (72MHz/6=12MHz) is over 17.1us (about 20us), but no smaller // sample time exceeds 17.1us. regs->SMPR1 = (0b111 << (3 * 6)); // set channel 16, the temp. sensor }

Mrburnette
Вт 27 февраля 2018 г., 19:25
[электрический - Вт 27 февраля 2018 г., 17:57] - ...
Сегодня может быть первый раз, когда кусок замороженного мяса использовалась в качестве кулера процессора! :)
Я знаю, что ты второй в очереди позади меня, и мы, вероятно, не рядом с линией :ржу не могу:

электрический
Ср 28 февраля 2018 г., 19:03
Я работал над этой прошлой ночью и нашел решение. Я сосредоточен на том, чтобы заставить библиотеку работать, а не просто получать чтения. Есть две проблемы с библиотекой, как теперь она стоит. Один - математика. Это просто и требует лишь незначительных изменений в STM32ADC :: readTemp (). Другой более тонкий, и я обращаюсь за советом, так как объяснение ускользает от меня, и это не является хорошей основой для запуска запроса на привлечение. По сути, в случае, что вызывает STM32ADC :: EnableInternalReading () заставляет систему сбой с помощью мигающей PC13. Это происходит на двух разных установках на двух разных компьютерах, которые я использую. Эта функция является оберткой для enable_internal_reading (), которая реализована в UTIL_ADC.C, который является компонентом самой библиотеки. Когда enable_internal_reading () перемещается из util_adc в ADC Libmaple.H и ADC.c, все в порядке, и я могу собрать разумный набросок, как: #include STM32ADC adc(ADC1); void setup() { Serial.begin(115200); adc.calibrate(); adc.enableInternalReading(); adc.setSampleRate(ADC_SMPR_239_5); } void loop() { //pause for a key input while (Serial.available() == 0); Serial.read(); float CPUtemp = adc.readTemp(); Serial.print("CPU internal temp : "); Serial.print(CPUtemp); Serial.println(" C"); }

Стивестронг
Ср 28 февраля 2018 г., 19:14
Тем временем я много переработал одну и ту же ADC LIB для F4, поэтому я посмотрю на это.
У вас есть предупреждающие сообщения во время сборки?
Поверните многословный.

электрический
Ср 28 февраля 2018 г. 8:10 вечера
Я не получаю предупреждений с включенной словесной. Редактировать - (пощечивание лба), которая была модифицированной версией. Я верну все, как это было, и попробую еще раз.

Стивестронг
Ср 28 февраля 2018 г., 22:17
Ну, я получаю предупреждение при попытке составить ваш пример: C:\Users\Luser\AppData\Local\Temp\arduino_build_730770\libraries\STM32ADC\STM32ADC.cpp.o: In function `STM32ADC::enableInternalReading()': C:\Users\Luser\Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\STM32ADC\src/STM32ADC.cpp:47: warning: undefined reference to `enable_internal_reading(adc_dev*)'

электрический
Чт, 01, 2018, 4:51
Спасибо, это исправление работает отлично. С нетерпением жду возможности обновления библиотеки, над которым вы работаете.

Zoomx
Пн, 05 марта 2018 г., 9:26 утра
Может быть, полезно добавить функцию для чтения необработанного значения, что -то вроде этого uint16_t STM32ADC::readTempi() { uint16_t result = adc_read(_dev, 16); return result; }

Mrburnette
Пн, 05 марта 2018 13:07
Весь этот центр ЦП-температура является несколько академическим, так как любой старый кремниевый диод или транзистор может быть превращена в датчик температуры.
https: // en.Википедия.org/wiki/silicon_b ... ure_sensor

Тем не менее, использование UC в качестве датчика температуры окружающей среды подразумевает, что UC останется при температуре окружающей среды: требует, чтобы драйверы CMOS-вывода источника/источник были минимально нагружены, а UC имеет достаточный поток воздуха, чтобы рассеять любое самообладание.

ИМХО, это довольно абсурдно, если не намерение состоит в том, чтобы следить за тем, как в собственности UC, как при перезагружающем или тяжелом токе нагрузки выхода. Это интересный лабораторный эксперимент, но минимально полезный в любом реальном устройстве. Вы получите лучшие результаты от 10-центного термистора и использования Стейнхарт-Харт приближение. Если для ограниченного диапазона необходимы 5% или меньше результатов, 8-битный A/D с термопарой, управляемая термопарой с таблицей поиска: Старый пример пикакса.


Луча

Mrburnette
Пн, 05 марта 2018 г., 13:15
С нетерпением жду возможности обновления библиотеки, над которым вы работаете. Техника настолько проста, что библиотека, на мой взгляд, просто излишне. Слишком много пользователей STM32DUINO полностью подключены на библиотеках. Разбейте свои цепочки и напишите свою собственную функцию или напишите свою собственную библиотеку. Библиотеки-двухющий меч для Arduino ... Да, инфраструктура Arduino быстро доступна, но экспериментатор/программист заблокирован-на парадигме, созданной кем-то другим. Слишком много конечных пользователей просто не могут ничего сделать, если нет библиотеки, чтобы это произошло! Это печаль.

Бросить вызов себе, чтобы минимизировать использование библиотек для ваших собственных проектов. Перепроверьте общую библиотеку, которую вы используете часто, может быть, библиотека дисплея или библиотека GPS. Если вы экспериментатор, никогда не пишите один и тот же код одинаково ... Есть миллиона способов добраться от пункта А в пункт Б ... Откройте для себя что -то новое.

Луча

Zoomx
Вт, 06 марта 2018 г., 9:31
Я никогда не думал использовать внутренний датчик температуры в качестве рабочего датчика.
Я проверил это только на веселье, калибровка означает только для того, чтобы числа были более похожи на реальные. Но я обнаружил, что внутренний был лучше, чем DHT11 (хорошо, это легко!)
Вот пример, шесть дней (у меня 14 месяцев данных)
Sensorstest.jpg
SensorStest.JPG (51.83 киб) просмотрено 684 раза

Mrburnette
Вт, 06 марта 2018 12:56
[Zoomx - Вторник 06 марта 2018 г. 9:31] - ...
Я проверил это только на развлечение, ...
В этом тесте MCU ничего не делал, только каждые 20 секунд с использованием задержки, и это было в моем офисе.
...
Zoomx,

Я согласен, что это весело, и график довольно интересный. Однако вы и я были обусловлены, зная, что использование внутреннего диода полос заливки обычно не для температуры окружающей среды, некоторые новички могут не знать, что. Мои замечания о использовании датчика были более академическими, так что читатель не пошел по пути мышления, который приведет к убеждению, что его использование будет хорошей идеей. : D

Луча

Rogerclark
Вт, 06 марта 2018 г. 9:01
@zoomx

Мне пришлось удалить ссылку на изображение, потому что этот сайт обслуживает порно изображения, если вы нажмете на ссылку

Пожалуйста, просто загрузите изображение на форум

Zoomx
Ср. 07, 2018, 10:42
: шок:

Сделанный! Спасибо, Роджер, и извините за мою ошибку, используя первую службу хостинга изображений, которые я нашел.

Rogerclark
Ср. 07 марта 2018 г., 20:54
@zoomx

Не беспокойся.

В любом случае, выглядит лучше, чтобы иметь полноразмерное изображение на форуме...


КСТАТИ. Вы поместили STM32 в режим низкой мощности / спя ?

Я помню, как делал некоторые тесты, когда я разгонял STM32 на 128 МГц, и на несколько градусов стало теплее на несколько градусов.
Нагревание не было проблемой для его работы, так как я думаю, что оно было менее чем на 5 градусов повышения температуры при 128 МГц (вероятно, 2 или 3 град)
Но, возможно, это не проблема при беге на уровне 72 МГц

Zoomx
Чт, 8 марта 2018 г., 9:15 утра
Я использовал Arduino, и тест был проведен о датчиках, а не внутренней температуре. Как я писал, атмега ничего не делала между мерами, это было только в задержке.

Я планирую тест со многими датчиками, использующими Arduino и STM32, но я должен выставить его на улицу, так как в офисном изменении температуры не подходит для эксперимента (но хорошо для меня!).
Я также планирую меру против нагрузки MCU, и, возможно, я буду использовать заимствованную тепловую камеру FLIR.

Mrburnette
Чт, 08, 2018 12:54
[Zoomx - Чт, 08, 2018, 9:15 утра] - ...
И, может быть, я буду использовать заимствованную тепловую камеру FLIR.
Да! Картинки ... Так круто ...в разговорной речи :ржу не могу:

Выполнить из внешнего SRAM