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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> at91sam7s256, ADC
D1ma
сообщение Aug 30 2009, 14:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



Здравствуйте.
У АЦП at91sam7s256 есть режим непрерывного преобразования?
Должен быть если к нему можно присоединить PDC.
У меня АЦП после запуска делает преобразования по каждому каналу и пишет в буфер PDC и останавливается. А надо, чтоб дальше в цикле преобразовывало.

Как включить режим непрерывного преобразования? Иначе, зачем ему PDC?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 14:41
Сообщение #2


Гуру
******

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



Цитата(D1ma @ Aug 30 2009, 18:07) *
Как включить режим непрерывного преобразования? Иначе, зачем ему PDC?

Воспользоваться запуском от таймера или внешнего пина. Кстати, почитайте сразу еррату - 10+ пунктов по АЦП.
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 30 2009, 14:54
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



Цитата(aaarrr @ Aug 30 2009, 17:41) *
Воспользоваться запуском от таймера

таймеры снизят частоту дискретиз.
Цитата
или внешнего пина.

нет возможности паять
Цитата
еррату - 10+ пунктов по АЦП

?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 15:00
Сообщение #4


Гуру
******

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



Цитата(D1ma @ Aug 30 2009, 18:54) *
таймеры снизят частоту дискретиз.

С чего бы вдруг?

Цитата(D1ma @ Aug 30 2009, 18:54) *
?

В чем вопрос?
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 30 2009, 15:06
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



Цитата(aaarrr @ Aug 30 2009, 18:00) *
В чем вопрос?

еррату - 10+ пунктов по АЦП. - что это?

как таймер определит конец преобразования и мгновено запустит его снова?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 15:10
Сообщение #6


Гуру
******

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



Цитата(D1ma @ Aug 30 2009, 19:06) *
еррату - 10+ пунктов по АЦП. - что это?

ERRATA - список ошибок кристалла в конце Datasheet'а.

Цитата(D1ma @ Aug 30 2009, 19:06) *
как таймер определит конец преобразования и мгновено запустит его снова?

Преобразование длится фиксированное время; таймер настраивается так, чтобы запустить следующее сразу после окончания предыдущего.
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 30 2009, 17:11
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



так понял режима непрерывного преобразования у ат91сам7і256 - нет

еще баг при смене канала преобразования какойто мусор литит в память а потом воще незапускается код где настрой ацп и смена линиї смтр. ниже
Код
void InitADC()
{
  InitTC0();

  // Enable peripheral clock    
  AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_ADC);    
  // Reset the controller
  AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST;
  // Write to the MR register
  AT91C_BASE_ADC->ADC_MR = 0;// Clear the register

  
  unsigned int prescal;//5MH
  unsigned int startup;//20µs
  unsigned int shtim;  //1667ns track and hold time
  prescal = (BOARD_MCK/(ADC_FREQ*2))-1;
  startup =11;//[(Startup Time * ADCClock)/8]-1 = [(20 10e-6 * 5000000)/8]-1 = 11,5
  shtim=6;    //(HoldTime * ADCClock)-1 = (1667 10e-9 * 5000000)-1 = 7.335
  AT91C_BASE_ADC->ADC_MR =  AT91C_ADC_TRGEN_DIS               | // Íàïèøèòå ê ðåãèñòðó Ã.
                            AT91C_ADC_LOWRES_10_BIT           |
                            AT91C_ADC_SLEEP_NORMAL_MODE       |
                            ((prescal<<8)&AT91C_ADC_PRESCAL)  |
                            ((startup<<16)&AT91C_ADC_STARTUP) |
                            ((shtim<<24)&AT91C_ADC_SHTIM);
  
  AT91C_BASE_ADC->ADC_CHDR =  AT91C_ADC_CH0 |
                              AT91C_ADC_CH1 |
                              AT91C_ADC_CH2 |
                              AT91C_ADC_CH3 |
                              AT91C_ADC_CH4 |
                              AT91C_ADC_CH5 |
                              AT91C_ADC_CH6 |
                              AT91C_ADC_CH7;

  AT91C_BASE_ADC->ADC_CHER =AT91C_ADC_CH5;
  AT91C_BASE_ADC->ADC_IDR=0xffffffff;
  //Seting PDC
  AT91C_BASE_ADC->ADC_PTCR=AT91C_PDC_RXTDIS|AT91C_PDC_TXTDIS;
  AT91C_BASE_ADC->ADC_RPR=(unsigned int)ADCbuf;
  AT91C_BASE_ADC->ADC_RCR=ADC_SIZE_BUF;

    
}
void StartADCSignal1()
{
    //ADC from line 1
    AT91C_BASE_ADC->ADC_CHDR =AT91C_ADC_CH5;
    AT91C_BASE_ADC->ADC_CHER =AT91C_ADC_CH4;
    TakesADC=true;
    AT91C_BASE_ADC->ADC_RPR=(unsigned int)ADCbuf;
    AT91C_BASE_ADC->ADC_RCR=ADC_SIZE_BUF;
    TC_Start(AT91C_BASE_TC0);
    while(TakesADC)
      AT91C_BASE_ADC->ADC_CR=AT91C_ADC_START;
    
}
void StartADCSignal2()
{
    //ADC from line 2
     AT91C_BASE_ADC->ADC_CHER =AT91C_ADC_CH5;
    AT91C_BASE_ADC->ADC_CHDR =AT91C_ADC_CH4;
     TakesADC=true;
    AT91C_BASE_ADC->ADC_RPR=(unsigned int)ADCbuf;
    AT91C_BASE_ADC->ADC_RCR=ADC_SIZE_BUF;
    TC_Start(AT91C_BASE_TC0);
    while(TakesADC)
      AT91C_BASE_ADC->ADC_CR=AT91C_ADC_START;
    
}



что скажете гуру?

Сообщение отредактировал D1ma - Aug 30 2009, 17:12
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 17:21
Сообщение #8


Гуру
******

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



Цитата(D1ma @ Aug 30 2009, 21:11) *
что скажете гуру?

Если не приведете код полностью, то ничего не скажу. И зачем таким способом переключать каналы, когда можно сразу разрешить оба?
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 30 2009, 17:48
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



Цитата(aaarrr @ Aug 30 2009, 20:21) *
И зачем таким способом переключать каналы, когда можно сразу разрешить оба?

для увеличения частоты выборки

код которого нехватает:
Код
#define ADC_FREQ 5000000

#define ADC_SIZE_BUF 6000
unsigned short ADCbuf[ADC_SIZE_BUF];
bool TakesADC;


void ISR_Tc0()
{
    unsigned int status;
    // Read TC0 status
    status = AT91C_BASE_TC0->TC_SR;
    // RC compare
    if ((status & AT91C_TC_CPCS) == AT91C_TC_CPCS)
    {
      //Diseble TC0
      AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
      //RESET ADC
      AT91C_BASE_ADC->ADC_CR=AT91C_ADC_SWRST;
      //flag end adc
      TakesADC=false;
    }
}
void TC_Start(AT91S_TC *pTc)
{
    pTc->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}
void InitTC0()
{
    /// Configure TC for a 10ms over TC0 4Ãö ç 400ÃÖ
    // Enable TC0 peripheral clock
    AT91C_BASE_PMC->PMC_PCER =(1 << AT91C_ID_TC0);
    // Disable TC clock
    AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
    // Disable interrupts
    AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF;
    // Clear status register
    AT91C_BASE_TC0->TC_SR;
    // Set mode
    AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV3_CLOCK;//div MCK 32
    AT91C_BASE_TC0->TC_RC  = 15017; // 10ms
  
    //Conf AICIntr
    AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_TC0);// Disable the interrupt first
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0; // Configure mode and handler
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int)ISR_Tc0;
    AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);// Clear interrupt

    //Eneble interupt for compare RC
    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; //interopt on of compare rc 10ìñ
    
    //Enebl AICIntr
    AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
}

и главная гдето так
Код
int main()
{
  LCD.SetLogo();
  InitModBus();
  InitADC();
  delay(1000*MS);
  AT91C_BASE_PIOA->PIO_PER=3;
  AT91C_BASE_PIOA->PIO_OER=3;
  
  AT91C_BASE_ADC->ADC_CHER =AT91C_ADC_CH5;
  while(1)
  {
    StartADCSigna2();
    WBufADC(1);
   //ModbusEIntr();
   // ModbusDIntr();
    AT91C_BASE_PIOA->PIO_CODR=1;
    AT91C_BASE_PIOA->PIO_SODR=2;
    StartADCSigna2();
    WBufADC(2);
    //delay(1000*MS);
    AT91C_BASE_PIOA->PIO_CODR=2;
    AT91C_BASE_PIOA->PIO_SODR=1;
  //  delay(1000*MS);
    
  }
}


я так понял посли
Код
//RESET ADC
AT91C_BASE_ADC->ADC_CR=AT91C_ADC_SWRST;

сбиваются его настройки ?
непонравился мне тут АЦП
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 18:03
Сообщение #10


Гуру
******

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



Цитата(D1ma @ Aug 30 2009, 21:48) *
я так понял посли
Код
//RESET ADC
AT91C_BASE_ADC->ADC_CR=AT91C_ADC_SWRST;

сбиваются его настройки ?

Естественно.

Цитата(D1ma @ Aug 30 2009, 21:48) *
непонравился мне тут АЦП

Мне тоже. Только антипатия не избавляет от чтения документации.

АЦП запускается сигналом TIOAx, а не вручную в прерывании таймера.
Вам нужно:
1. Настроить таймер и выход TIOA на постоянную генерацию импульсов для запуска АЦП.
2. Каналы можно переключать в прерывании ENDRX PDC АЦП.

Пока что все построено идеологически совершенно неправильно.
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 30 2009, 18:20
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



не АЦП я запускаю вручную
Код
while(TakesADC)
      AT91C_BASE_ADC->ADC_CR=AT91C_ADC_START;


а таймер мзмеряет время измерений примерно 10мс (сбрасывает флаг TakesADC), 2865 выборок
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 18:42
Сообщение #12


Гуру
******

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



Цитата(D1ma @ Aug 30 2009, 22:20) *
не АЦП я запускаю вручную
Код
while(TakesADC)
      AT91C_BASE_ADC->ADC_CR=AT91C_ADC_START;


а таймер мзмеряет время измерений примерно 10мс (сбрасывает флаг TakesADC), 2865 выборок

Ну и зачем так делать?
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 30 2009, 21:19
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



Цитата(aaarrr @ Aug 30 2009, 21:42) *
Ну и зачем так делать?

как точно выщетать время преобразования? (в тактах ядра)
моим способом простой ацп максиму примерно 4 такта
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 30 2009, 21:43
Сообщение #14


Гуру
******

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



Цитата(D1ma @ Aug 31 2009, 01:19) *
как точно выщетать время преобразования? (в тактах ядра)

Цитата
Converting a single analog value to a 10-bit digital data requires Sample and Hold Clock cycles
as defined in the field SHTIM of the “ADC Mode Register” on page 540 and 10 ADC Clock cycles.

и еще учесть следующее:
Цитата
If a hardware trigger is selected, the start of a conversion is triggered after a delay starting at
each rising edge of the selected signal. Due to asynchronism handling, the delay may vary in a
range of 2 MCK clock periods to 1 ADC clock period.


Цитата(D1ma @ Aug 31 2009, 01:19) *
моим способом простой ацп максиму примерно 4 такта

Ничего не понял.
Go to the top of the page
 
+Quote Post
D1ma
сообщение Aug 31 2009, 06:49
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



согласен. сделаю запуск таймером...

а как поднять качество преобразования? (програмным путем) перевести ядро в какой режим, чтоб работала переферия (юарт , ТС0,ТС1,ацп,ДМА)? и с этого режима ядро выходило при прерывания.
ато сильный разброс +-5 sad.gif (аналоговая часть сделаная на макетке)
Go to the top of the page
 
+Quote Post

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

 


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


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