Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F407 RTC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
mantech
Приветствую.

Есть одна нетривиальная задача - нужен таймер с разрешением 0.01 сек

Посмотрел хитрый блок часов в стм, и понял что не все так просто crying.gif

Во первых - кварц с частотой 32768 на 100 нацело не делится.

Во вторых, счетчик RTC_SSR прибавляется на 1 каждые 1\256 сек, что тоже не то-не се.

Вопрос - как-то можно сделать что-то более-менее похожее, исходя из всего этого, или решение только одно - надо где-то искать кварц на 36КГц?
adnega
Цитата(mantech @ Feb 3 2014, 15:05) *
Есть одна нетривиальная задача - нужен таймер с разрешением 0.01 сек

Таймеров в STM много. Разрешение - хоть микросекунды. Причем тривиально!
Или Вы что-то не договариваете?
kolobok0
Цитата(mantech @ Feb 3 2014, 15:05) *
...нужен таймер с разрешением 0.01 сек...искать кварц на 36КГц?


я что то не догоняю или....

у Вас камень кварцованный(в правильном раскладе) с частотой (вдумайтесь) 168 милионов раз в секунду.
Точность какая при этом у Вас получается? Свои 0,01 Вы сможете смело и достаточно точно получить на любом(практически) таймере поделив
всё это хозяйство на нужное число.будет у вас константа смещение на какую нить там сотую миллионную - Вы такую точность
даже не выбирете ничем - ни каналами ввода выовода, ни пинами, ни мат обработкой...

или???
mantech
Цитата(kolobok0 @ Feb 3 2014, 15:17) *
я что то не догоняю или....


А в курсе, что камень на своих 168мегах.... в выкл. состоянии не работает?? А часы идут от батарейки? wink.gif

Вот и мне нужно, чтоб они шли не только, когда есть питание..

Ясень пень, что на обычном таймере я могу получить любую выдержку, только она будет несинхронна со встроенными часами.

ЗЫ. Сейчас почитал даташит повнимательнее - оказывается там регистр синхронного делителя 15 бит и плюс еще асинхронный 7 бит (я раньше думал, что он - это старшая часть синхроного biggrin.gif )

Отсюда вопрос - зачем вообще этот асинхронный делитель? Может сделать проще - задать его значение=1 (0 там помоему нельзя), итого получаем на входе синхронного 16384КГц, я так понимаю, и на счетчик миллисекунд будет поступать эта частота, а ее потом уже и делим на соотв. коефф. чтоб получить мс?
adnega
Цитата(mantech @ Feb 3 2014, 15:25) *
А в курсе, что камень на своих 168мегах.... в выкл. состоянии не работает?? А часы идут от батарейки? wink.gif
Вот и мне нужно, чтоб они шли не только, когда есть питание..
Ясень пень, что на обычном таймере я могу получить любую выдержку, только она будет несинхронна со встроенными часами.

Думаю, Вам стоит еще раз аккуратно объяснить чего Вы желаете.
Нужны энергонезависимые часы с шагом 0.01 сек?
От кварца с частотой 32768Гц не получите, ибо делитель должен быть дробный!
Еще вопросы?
mantech
Цитата(adnega @ Feb 3 2014, 16:27) *
Думаю, Вам стоит еще раз аккуратно объяснить чего Вы желаете.
Нужны энергонезависимые часы с шагом 0.01 сек?
От кварца с частотой 32768Гц не получите, ибо делитель должен быть дробный!
Еще вопросы?



Хорошо, попробую biggrin.gif

1) нужны часы, которые идут от батарейки

2) разрешающая способность 0.01 сек (точность +-10мс)

Я попробовал так - поставил асинхр. делитель в 0, а синхр в 32767. В рез-те получил тот же 1 Гц на выходе, и декремент регистра миллисек с частотой кварца. рассогласование частоты при делении - 68Гц,
т.е. абс. точность получается при частоте 32700Гц, в принципе - сойдет.

Правильно-ли я все понял, и если дел-ль=0 это нормально, или так делать нельзя?
adnega
Цитата(mantech @ Feb 3 2014, 16:46) *
Хорошо, попробую biggrin.gif

1) нужны часы, которые идут от батарейки

2) разрешающая способность 0.01 сек (точность +-10мс)

Я попробовал так - поставил асинхр. делитель в 0, а синхр в 32767. В рез-те получил тот же 1 Гц на выходе, и декремент регистра миллисек с частотой кварца. рассогласование частоты при делении - 68Гц,
т.е. абс. точность получается при частоте 32700Гц, в принципе - сойдет.

Правильно-ли я все понял, и если дел-ль=0 это нормально, или так делать нельзя?

Фраза "When both prescalers are used, it is recommended to configure the asynchronous prescaler
to a high value to minimize consumption." из UM говорит, что если используются оба делителя, то
рекоментуется в асинхронный заносить бОльшие значения для уменьшения энергопотребления.

Надеюсь, на Ваш вопрос ответил. Хотя мне до сих пор не понятно кому "нужны идущие от батарейки часы"
с такой чремерной разрешающей способностью и "никакой" точностью?
SyncLair
в чём проблема? просыпайтесь каждые 1/256 секунды высчитывайте прошла ли 0.01 алгоритмически и делайте что вам надо, у вас же написано : НЕ ХУЖЕ! а не точно каждые 0.01 сек.
adnega
Цитата(SyncLair @ Feb 3 2014, 18:55) *
в чём проблема? просыпайтесь каждые 1/256 секунды высчитывайте прошла ли 0.01 алгоритмически и делайте что вам надо, у вас же написано : НЕ ХУЖЕ! а не точно каждые 0.01 сек.

И 1/128 будет достаточно. Вариант уж очень прожорливый, хотя об этой стороне вопроса (энергопотребление) автор темы тоже умалчивает.
Возможно, автор хочет сделать секундомер с выводрм сотых долей, причем не хочет заниматься "всем этим матаном" по пересчету 1/128 в 0.01.
Зачем это надо автор отказывается объяснять.
Почему бы не запустить RTC с обычным секундным интервалом и алгоритмически вычислять сотые на основании RTC->SSR?
Что за "величины" будут в RTC->TR и RTC->DR и что с ними можно сделать вопрос тоже открытый?
mantech
Цитата(adnega @ Feb 3 2014, 18:39) *
Фраза "When both prescalers are used, it is recommended to configure the asynchronous prescaler
to a high value to minimize consumption." из UM говорит, что если используются оба делителя, то
рекоментуется в асинхронный заносить бОльшие значения для уменьшения энергопотребления.


Странно однако, это я про делитель...

А второе - что значит с никакой точностью? Я написал - погрешность не более 0.01 сек, как-то подругому писать? biggrin.gif

Да, часы должны работать от батарейки, потребление, конечно, чем меньше-тем лучше, высчитывать миллисекунды из 1\128 это как? Можете объяснить?

Цитата(adnega @ Feb 3 2014, 19:15) *
Почему бы не запустить RTC с обычным секундным интервалом и алгоритмически вычислять сотые на основании RTC->SSR?
Что за "величины" будут в RTC->TR и RTC->DR и что с ними можно сделать вопрос тоже открытый?


Он именно так и работает - с секундным интервалом, иначе сами часы будут считать неправильно, логично?

Просто с точки зрения математики - чем большее число делить на 100, тем точнее результат, например 32768 \ 100 получаем 327

Для проверки 327*100 = 32700, т.е. неточность 68Гц.
Если делитель сделаем больше , скажем 16, до частоты 2048Гц, то получаем 2048 \ 100 = 20

проверяем 20*100*16 = 32000, т.е. мы "отстаем " уже на 768Гц, разница ощутима?

Цитата(adnega @ Feb 3 2014, 19:15) *
Зачем это надо автор отказывается объяснять.


В смысле зачем? Нужны часы для спортивных тренировок.

Цитата(adnega @ Feb 3 2014, 18:39) *
из UM говорит, что если используются оба делителя, то
рекоментуется в асинхронный заносить бОльшие значения для уменьшения энергопотребления.


Замерил потребление, как было 1.5 мкА, при асинхр. делителе 128(по умолчанию), так и при полностью откл. делителе.
Golikov A.
вопрос в том насколько плавает кварц, и насколько он изначально расходиться...

из 1/128 сделать 0.01 примерно так
1/128 = 0.0078125 === 0
2/128 = 0.015625 === 0.01
3/128 = 0.0234375 === 0.02
4/128 = 0.03125 === 0.03

причем у вас нет накопления ошибки, погрешность прибора с ценой деления 0.01 по умолчанию +- 0.005, а через 128 отсчетов у вас будет честная 1, и следующий круг без какой либо накопленной погрешности. Но что-то мне говорит что точность кварца в температуре будет сильно хуже....
mantech
Цитата(Golikov A. @ Feb 3 2014, 21:29) *
вопрос в том насколько плавает кварц, и насколько он изначально расходиться...
причем у вас нет накопления ошибки, погрешность прибора с ценой деления 0.01 по умолчанию +- 0.005, а через 128 отсчетов у вас будет честная 1, и следующий круг без какой либо накопленной погрешности. Но что-то мне говорит что точность кварца в температуре будет сильно хуже....


Это все понятно, заказчик не согласен ставить какие-то более качественные кварцы, пусть будет так.

А на счет делителя, если на потреблежку от батареи не сильно влияет, больше тут никаких "подводных камней" нет? Если нет - то я так и оставляю, как делал.

Все эти деления по точности дают худший результат, плюс округления и пр...
Golikov A.
да можно делить на сколько угодно больше 100
Просто потом из числа насчитанных тактов правильно перевести в 0.01 секунды.

adnega
Цитата(mantech @ Feb 3 2014, 21:51) *
Это все понятно, заказчик не согласен ставить какие-то более качественные кварцы, пусть будет так.
А на счет делителя, если на потреблежку от батареи не сильно влияет, больше тут никаких "подводных камней" нет? Если нет - то я так и оставляю, как делал.
Все эти деления по точности дают худший результат, плюс округления и пр...

Для тренеровок сгодится любой часовой кварц.
Насчет точности +-10мс было требование. Можно доказать, что "деления и всякие округления" дадут точность не хуже +-4мс.
Делайте так ((RTC->SSR * 100) >> 8) - так будут Вам сотые доли секунды с заявленной точностью при минимальном потреблении.
mantech
Цитата(adnega @ Feb 3 2014, 23:25) *
Делайте так ((RTC->SSR * 100) >> 8)


Это при синхр. делителе 256?
adnega
Цитата(mantech @ Feb 3 2014, 23:42) *
Это при синхр. делителе 256?

Формально 0xFF = 255 для синхронного и 0x7F для асинхронного (на единицу меньше нужно заносить в регистр).
mantech
Цитата(adnega @ Feb 4 2014, 00:34) *
Формально 0xFF = 255 для синхронного и 0x7F для асинхронного (на единицу меньше нужно заносить в регистр).

Ясно, т.е. значения по умолчанию. Спасибо, попробую cool.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.