реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AT91sam7s->TC, Не пойму что считает.
D!m@
сообщение Jun 15 2010, 17:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901



Привет.

Настроил Т2 на измерение время импульсов. Импульс подаю 50Гц -> 20мс
А счетчик дает значение примерно 87136->3.6ms (1 переполнение и рег. захвата). MCK=48MГц или нет?
Настроен на TIMER_CLOCK1->MCK/2
Я не правильно МСК считаю или как??

Стоит кварц 18.432 МГц. стартап: стандарт
Код
// Initialize main oscillator
    AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

    // Initialize PLL at 96MHz (96.109) and USB clock to 48MHz
    //18432000Hz / 14 * (72+1) = 96109714MHz
  
    AT91C_BASE_PMC->PMC_PLLR = BOARD_USBDIV | BOARD_CKGR_PLL | BOARD_PLLCOUNT
                               | BOARD_MUL | BOARD_DIV;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));

    // Wait for the master clock if it was already initialized
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

    // Switch to slow clock + prescaler
    AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER; //2
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));


таймер:
Код
unsigned int over=0;
unsigned int mas[1000];
unsigned char count=0;
static void ISR_TC2(void)
{
   unsigned int uiSR = AT91C_BASE_TC2->TC_SR;
    if( (uiSR & AT91C_TC_COVFS) )
   {
       over++;
   }
   if( (uiSR & AT91C_TC_LDRAS) )
   {
       mas[count] = AT91C_BASE_TC2->TC_RA;
       count++;
       over=0;
   }
  
    
}
void InitTC()
{
  
    //AIC configure.
    AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_TC2;     // Disable the interrupt first
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC2] = 0;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC2] = (unsigned int) ISR_TC2;
    AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_TC2;     // Clear interrupt
    AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_TC2;     // Enables interrupts
    
  
    
    // Enable PWMC peripheral clock
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC2;
    
    // Disable TC clock
    AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKDIS;

    // Disable interrupts
    AT91C_BASE_TC2->TC_IDR = 0xFFFFFFFF;

    // Clear status register
    AT91C_BASE_TC2->TC_SR;

    // Set mode
    AT91C_BASE_TC2->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK | // MCK/2
                             AT91C_TC_BURST_NONE |
                             AT91C_TC_EEVTEDG_RISING |//AT91C_TC_EEVTEDG_BOTH |
                             AT91C_TC_ABETRG |    
                             AT91C_TC_LDRA_RISING;//AT91C_TC_LDRA_BOTH; // each edge of TIOA
    // Enable interrpt
    AT91C_BASE_TC2->TC_IER = AT91C_TC_COVFS | // Counter Overflow
                             AT91C_TC_LDRAS;  // RA Loading
    
    // Start TC2  
    AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
    
     // connect to PIO for TIOA2
    AT91C_BASE_PIOA->PIO_BSR= AT91C_PA26_TIOA2;
    AT91C_BASE_PIOA->PIO_PDR = AT91C_PA26_TIOA2;
}



Как и что, мне настроить, чтоб измерять точно время импульсов???
На АВР просто - какой кварц такая и частота, а на АРМ ПЛЛ с какой точностью умножает и делит?
Можно таймер тактировать от кварца? (бес умножений и делений)

Сообщение отредактировал D!m@ - Jun 15 2010, 17:20
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 15 2010, 18:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(D!m@ @ Jun 15 2010, 21:17) *
Я не правильно МСК считаю или как??

Из-за многочисленных неизвестных BOARD_* ответить не представляется возможным.

Цитата(D!m@ @ Jun 15 2010, 21:17) *
Как и что, мне настроить, чтоб измерять точно время импульсов???

На первый взгляд все правильно настроено. Как получаете конечное значение - 80 с чем-то тысяч?

Цитата(D!m@ @ Jun 15 2010, 21:17) *
На АВР просто - какой кварц такая и частота, а на АРМ ПЛЛ с какой точностью умножает и делит?

Нет такого понятия, как точность умножения и деления PLL. Не точно не умеет по определению.

Цитата(D!m@ @ Jun 15 2010, 21:17) *
Можно таймер тактировать от кварца? (бес умножений и делений)

Только если завести клок через внешнюю петлю. Или не использовать PLL.
Go to the top of the page
 
+Quote Post
D!m@
сообщение Jun 15 2010, 18:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901



25.9.10 PMC Master Clock Register
Register Name: PMC_MCKR
Access Type: Read-write
• CSS: Master Clock Selection
• PRES: Processor Clock Prescaler

CSS Clock Source Selection
0 0 Slow Clock is selected - что значит ?????????
0 1 Main Clock is selected - что значит ?????????
1 0 Reserved
1 1 PLL Clock is selected.
PRES Processor Clock
0 0 0 Selected clock
0 0 1 Selected clock divided by 2
0 1 0 Selected clock divided by 4
0 1 1 Selected clock divided by 8
1 0 0 Selected clock divided by 16
1 0 1 Selected clock divided by 32
1 1 0 Selected clock divided by 64

Этим регистром можно настроить MCK – непосредственно кварц а проц через PLL ???
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 15 2010, 19:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(D!m@ @ Jun 15 2010, 22:36) *
0 0 Slow Clock is selected - что значит ?????????

32KHz RC.

Цитата(D!m@ @ Jun 15 2010, 22:36) *
0 1 Main Clock is selected - что значит ?????????

Основной кварц.

Цитата(D!m@ @ Jun 15 2010, 22:36) *
Этим регистром можно настроить MCK – непосредственно кварц а проц через PLL ???

Нет, нельзя.

Очень похоже, что неправильно подсчитывается число переполнений:
24000000 / 50 / 65536 = 7.324
1.324 * 65536 = 86770

Moderator: Пожалуйста, не злоупотребляйте знаками препинания.
Go to the top of the page
 
+Quote Post
D!m@
сообщение Jun 16 2010, 06:29
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901



Цитата(aaarrr @ Jun 15 2010, 22:21) *
Очень похоже, что неправильно подсчитывается число переполнений:
24000000 / 50 / 65536 = 7.324

Таки да !
Я значения переполнений спотрел c помощью watch в точке останова (было 1).
Забил значения в масив и посмотрел - 7. (вот такая хитрая штука Jtag adapter )


Сделал MCK от основного кварца. Сравнил результат :
Код
                RA    OVER    0xFFFF        MCK                ms                Fre
PLL    max    22149    7    65536    480901    48054857    20,01466782    49,96335732
PLL    min    21561    7    65536    480313    48054857    19,99019579    50,02452255
Main O    min    53131    2    65536    184203    18432000    19,98730469    50,03175844
Main O    max    53235    2    65536    184307    18432000    19,99858941    50,00352672


знчение PLL - 48054857 (пощитал) как бы проверить на сколько оно совпадает с настоящим и как изменяется от температур?
Какой разброс PLL в разных чипах?
Может хто обяснит какой принцып работы плл?(работает он на логике или от rc генератора) ?

Сообщение отредактировал D!m@ - Jun 16 2010, 06:30
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016