Добрый вечер! Я хочю поиграться с температурным сенсоросм что встроен в stm8l discovery плату. В рефмануале написано что на заводе измеряно выходное напряжение с этого датчика с розрешением АЦП 12 бит и сохранено по адресу TS_Factory_CONV_V90 (один байт, а старшая часть =6). В даташите на контроллер нашел вот этот адрес TS_Factory_CONV_V90=0х4910. В самом отладчике посмотрел да и считывал тоже, но данные по этому адресу =0хFF. В рефмануале также написано что таким же способом измеряно и внутренне опрорное напряжение и тоже сохранено по адресу VREFINT_Factory_CONV=0х4911. У меня это значение тоже равняется 0хFF. У всех так? или я может чт-то с памятью перепутал. Мне что-то не верится чтоб эти велечины были одинаковые. значения с памяти считывал вот так:
Код
#define VREFINT (* (char *) 0x4911)
u16 temp_=VREFINT;
Artem_Petrik
Jul 8 2012, 16:27
наверно volatile char нужно. даже volatile int.
Цитата
наверно volatile char нужно. даже volatile int.
Делал и так. Все равно 0хFFFF.
Artem_Petrik
Jul 8 2012, 17:15
Вчитался, все же volaile char, сохранен только младший байт. т.е. читать правильней так:
Код
u16 temp_=0x600 | VREFINT;
Для проверки стоит листинг посмореть, во что оно там компилится.
В эррате по этому поводу ничего нет, так что должно работать. Жаль проверить не на чем, одни stm8s-ки.
Код
Вчитался, все же volaile char, сохранен только младший байт. т.е. читать правильней так
На сколько я понял по этому адресу и есть только один байт. а старшая часть равняется 3. Тоесть мне нужно только один байт.
Померял температуру датчиком. АЦП использовал 12 бит. Получил значение 0х2А1. Если перещитать в напряжене то это гдето 0,6 В. В рефмануале приводится формула по которой щитать : Т[C]=(VSENSE/AvgSlope)-273.15. и AvgSlope должно быть в V/°K но в даташите на контроллер дается число 1,62 в мВ/С. И тогда получается 600/1,62=370.
всетаки наверное 1,62 это в мВ/К
отнимаю 370-273=97 С

в принципе тоже многовато.
Реально ли такое значение или я ошибся в формуле? всетаки написано что датчик меряет тампературу устройства. Интересно этот датчик как переферия контроллера или на плате установлен? Но всеже 100 градусов мне не верится.. ((
Сейчас посмотрел на своей 8L - да, там в памяти одни FF'ы.
Вообще в даташите сказано что там результат работы ADC, не надо ли его запустить сначала?
Код
Вообще в даташите сказано что там результат работы ADC, не надо ли его запустить сначала?
Вы имеете ввиду сконфигурировать на измерение температурного канала, запустить преобразование и посмотреть в пямять?
Все равно там FF остаются.
Вы пробовали пользоваться этим датчиком? Сколько он вам показывает при комнатной-летней температуре? А то у меня получилось около 100 градусов!
Не пробовал, только сейчас заинтересовался. Переписал функцию измерения VRef из примера IAR для STM8L (Просто заменил каналы VRef на TempSensor), ADC_GetConversionValue дает 677. Для нынешней комнатной температуры - вполне может быть. (если формула не та или не так поняли. Проще будет с двумя значениями температуры измерить и посмотреть, но мне сейчас греть и охлаждать лень как-то).
А даташит сейчас посмотрел, на 0х4910 - это же вроде Factory conversion registers, т.е. не результат, а просто калибровочные данные?
Код
ADC_GetConversionValue дает 677. Для нынешней комнатной температуры - вполне может быть.
(677*3,6)/4096=0,6
(600/1,62)-273.15=97 С ???
Мдя, туплю уже.
Ну что пока можно сказать - видимо на заводе эти камни никто не измерял, соответственно придется мерять самим по паре известных температур.
Я эксперементировал с временем выборки. В даташите сказано что она должнеа быть 10 мкс. Я это считал так. Тактовая частота контроллера 16 МГц. 1/16=0.0625
10/0.0625=160. Тоесть это если делитель для АЦП не трогать то надо установить время выборки 160 тактов. Но здесь и получаются вот такие запредельные температуры.
Я поставил 16 циклов и температура вышла около 40 градусов, что в принципе более на правду похоже.
Как точно пощитать сколько надо циклов задать в настройках чтоб получить время выборки 10 мкс?
Насколько я понял имеется один байт со значением TS_Factory_CONV_V90, предпологается, что старшая часть равна 0x03.
Данное значение получено при напряжении питания 3-+10мВ (опорном) и температуре 90-+5 градусов Цельсия.
У STM8L151K6 данное значение расположено по адресу 0x004911, в моем мк это значение равно 0x43.
Следовательн имеем 0x0343=835, что при указанном опорном около 0,611 В.
Если я правильно понял, то далее нам нужно получить второю точку, для этого необходимо получить значение при температуре 25 градусов Цельсия.
У меня получилось 0x26C=620, т.е. 0,498В (опорное у меня 3,29В).
Используя эти две точки, можно получить наклон и смещение характеристики, что должно повысить точность преобразования.
Dejmos
Jul 10 2012, 05:38
Тогда получается что 677 - вполне адекватное значение. Оно в итоге у меня и получалось при любом времени выборки.
Но, так как на 8LDiscovery по адресу 0x4911 находятся FF'ы (интересно почему), для расчета температуры придется измерять 2 точки.
Возможно вы неправильно "читате" ?
Используйте утилиту для отладки STMStudio (http://www.st.com/internet/evalboard/product/251373.jsp).
Только не используйте её для мониторинга ОЗУ и Флеш-памяти ОДНОВРЕМЕННО! Дает сбой, я не уверен, что разработчики знают об ошибке.
Dejmos
Jul 10 2012, 19:25
ZiB, просматривал память IAR'ом - там ff'ы. В STMStudio завтра на работе могу посмотреть для проверки, но сомневаюсь что результаты будут отличаться
Я ИАР не использую и не сильно доверяю отладчикам )
STMStudio использует технологию при которой можно мониторить любую ячейку памяти МК без вмешателства в его работу (такая же фишка есть и в кортексах), очень удобно.
Ждем результата, очень интересно, т.к. я давно занимаюсь стм8 (уже наверное третий год) и планирую дальше с ними работать.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.