Четверг, 25.04.2024, 13:27

Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Чат
 Калибровка RTC на STM32F1
Ну вот собственно как и обещал расскажу о процедуре калибровки RTC на STM32F1.
В предыдущей статье мы инициализировали RTC, теперь же, нам сюда надо добавить сл. строчку:

void  RTC_INIT  (void)                                                                            //Инициализация RTC
{
  if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN)                 //Проверка работы часов, если не включены, то инициализировать
  {
  RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;  //Включить тактирование PWR и Backup
  PWR->CR |= PWR_CR_DBP;                                                            //Разрешить доступ к Backup области
  RCC->BDCR |= RCC_BDCR_BDRST;                                               //Сбросить Backup область
  RCC->BDCR &= ~RCC_BDCR_BDRST;
  RCC->BDCR |= RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_LSE;        //Выбрать LSE источник (кварц 32768) и подать тактирование
  RCC->BDCR |= RCC_BDCR_LSEON;                                                //Включить LSE
  while ((RCC->BDCR & RCC_BDCR_LSEON) != RCC_BDCR_LSEON){} //Дождаться включения
  BKP->RTCCR |= 3;                                                                         //калибровка RTC
  while (!(RTC->CRL & RTC_CRL_RTOFF));                                         //проверить закончены ли изменения регистров RTC
  RTC->CRL  |=  RTC_CRL_CNF;                                                        //Разрешить Запись в регистры RTC
  RTC->PRLL  = 0x7FFF;                                                                    //Настроит делитель на 32768 (32767+1)
   BKP->RTCCR |= BKP_RTCCR_CCO;                   //Включение вывода Temper
  RTC->CRL  &=  ~RTC_CRL_CNF;                                                     //Запретить запись в регистры RTC
  while (!(RTC->CRL & RTC_CRL_RTOFF));                                         //Дождаться окончания записи
  RTC->CRL &= (uint16_t)~RTC_CRL_RSF;                                         //Синхронизировать RTC
  while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){}                  //Дождаться синхронизации
  PWR->CR &= ~PWR_CR_DBP;                                                         //запретить доступ к Backup области
  }
}
 
Этой строчкой мы выводим на вывод Tamper (PC13), сигнал, который равен частота LSE (кварцевого резонатора) поделенной на 64, с идеальным кварцем частота была бы равна 512 Гц (32768/64=512), но так как кварцы не идеальны, то частота будет уходить от 512 Гц. Теперь нам надо как можно точнее определить частоту на выводе Tamper. Так как калибровка в STM32F1 умеет только пропускать такты (убавлять значения счетчика) через каждые 2^20 (1048576) тактов, то для начала рассмотрим пример, когда частота Tamper получилась больше 512 Гц. у меня получилась частота 512,00137625969938607194976140096 Гц, умножаем на 64 и получаем частоту кварца 32768,088080620760708604784729661 Гц, затем это делим на наш делитель 32768*3600 сек в часе*24 часа*30 дней получаем 2592006,9673147281419892456670924, и видим что наши часы уйдут на 6,967 сек за 30 дней. теперь можем воспользоваться калибровочной таблицей:

Значение калибровки Значение отклонения в  ppm Значение отклонения в секундах за месяц (30 дней) Значение калибровки Значение отклонения в  ppm Значение отклонения в секундах за месяц (30 дней) Значение калибровки Значение отклонения в  ppm Значение отклонения в секундах за месяц (30 дней)
0 0 0 43 41 106 86 82 213
1 1 2 44 42 109 87 83 215
2 2 5 45 43 111 88 84 218
3 3 7 46 44 114 89 85 220
4 4 10 47 45 116 90 86 222
5 5 12 48 46 119 91 87 225
6 6 15 49 47 121 92 88 227
7 7 17 50 48 124 93 89 230
8 8 20 51 49 126 94 90 232
9 9 22 52 50 129 95 91 235
10 10 25 53 51 131 96 92 237
11 10 27 54 51 133 97 93 240
12 11 30 55 52 136 98 93 242
13 12 32 56 53 138 99 94 245
14 13 35 57 54 141 100 95 247
15 14 37 58 55 143 101 96 250
16 15 40 59 56 146 102 97 252
17 16 42 60 57 148 103 98 255
18 17 44 61 58 151 104 99 257
19 18 47 62 59 153 105 100 260
20 19 49 63 60 156 106 101 262
21 20 52 64 61 158 107 102 264
22 21 54 65 62 161 108 103 267
23 22 57 66 63 163 109 104 269
24 23 59 67 64 166 110 105 272
25 24 62 68 65 168 111 106 274
26 25 64 69 66 171 112 107 277
27 26 67 70 67 173 113 108 279
28 27 69 71 68 176 114 109 282
29 28 72 72 69 178 115 110 284
30 29 74 73 70 180 116 111 287
31 30 77 74 71 183 117 112 289
32 31 79 75 72 185 118 113 292
33 31 82 76 72 188 119 113 294
34 32 84 77 73 190 120 114 297
35 33 87 78 74 193 121 115 299
36 34 89 79 75 195 122 116 302
37 35 91 80 76 198 123 117 304
38 36 94 81 77 200 124 118 307
39 37 96 82 78 203 125 119 309
40 38 99 83 79 205 126 120 311
41 39 101 84 80 208 127 121 314
42 40 104 85 81 210

Так как у нас получило отклонение почти 7 секунд за 30 дней то устанавливаем калибровочное значение 3.
А теперь рассмотрим если кварц работает медленнее. К примеру частота Tamper получилась 511,99567 Гц. умножаем на 64 и получаем частоту кварца 32767,72288 Гц. Значит нам нужно делитель RTC выставит 32767, а не 32768. и производим те же действия что в предыдущем примере. 32767,72288/32767*3600*24*30=2592057,1826825769829401532029176. В этом примере без калибровки наши часы будут убегать на 57,182 секунд за 30 дней, теперь же выберем подходящее значение из таблицы. Калибровочная поправка равна 23.
Вот собственно и все что касается калибровки RTC на STM32.
Руководство по калибровки от ST находится здесь


2024
Поиск
Перевод
Статистика
Счетчики
Онлайн лист
Онлайн всего: 1
Гостей: 1
Пользователей: 0