|
at91sam7s256, ADC |
|
|
|
Aug 30 2009, 14:07
|
Участник

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

|
Здравствуйте. У АЦП at91sam7s256 есть режим непрерывного преобразования? Должен быть если к нему можно присоединить PDC. У меня АЦП после запуска делает преобразования по каждому каналу и пишет в буфер PDC и останавливается. А надо, чтоб дальше в цикле преобразовывало.
Как включить режим непрерывного преобразования? Иначе, зачем ему PDC?
|
|
|
|
|
Aug 30 2009, 14:54
|
Участник

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

|
Цитата(aaarrr @ Aug 30 2009, 17:41)  Воспользоваться запуском от таймера таймеры снизят частоту дискретиз. Цитата или внешнего пина. нет возможности паять Цитата еррату - 10+ пунктов по АЦП ?
|
|
|
|
|
Aug 30 2009, 15:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(D1ma @ Aug 30 2009, 18:54)  таймеры снизят частоту дискретиз. С чего бы вдруг? Цитата(D1ma @ Aug 30 2009, 18:54)  ? В чем вопрос?
|
|
|
|
|
Aug 30 2009, 15:06
|
Участник

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

|
Цитата(aaarrr @ Aug 30 2009, 18:00)  В чем вопрос? еррату - 10+ пунктов по АЦП. - что это? как таймер определит конец преобразования и мгновено запустит его снова?
|
|
|
|
|
Aug 30 2009, 15:10
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(D1ma @ Aug 30 2009, 19:06)  еррату - 10+ пунктов по АЦП. - что это? ERRATA - список ошибок кристалла в конце Datasheet'а. Цитата(D1ma @ Aug 30 2009, 19:06)  как таймер определит конец преобразования и мгновено запустит его снова? Преобразование длится фиксированное время; таймер настраивается так, чтобы запустить следующее сразу после окончания предыдущего.
|
|
|
|
|
Aug 30 2009, 17:11
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 30 2009, 17:48
|
Участник

Группа: Участник
Сообщений: 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; сбиваются его настройки ? непонравился мне тут АЦП
|
|
|
|
|
Aug 30 2009, 18:03
|
Гуру
     
Группа: Свой
Сообщений: 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 АЦП. Пока что все построено идеологически совершенно неправильно.
|
|
|
|
|
Aug 30 2009, 18:20
|
Участник

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

|
не АЦП я запускаю вручную Код while(TakesADC) AT91C_BASE_ADC->ADC_CR=AT91C_ADC_START; а таймер мзмеряет время измерений примерно 10мс (сбрасывает флаг TakesADC), 2865 выборок
|
|
|
|
|
Aug 30 2009, 18:42
|
Гуру
     
Группа: Свой
Сообщений: 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 выборок Ну и зачем так делать?
|
|
|
|
|
Aug 30 2009, 21:19
|
Участник

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

|
Цитата(aaarrr @ Aug 30 2009, 21:42)  Ну и зачем так делать? как точно выщетать время преобразования? (в тактах ядра) моим способом простой ацп максиму примерно 4 такта
|
|
|
|
|
Aug 30 2009, 21:43
|
Гуру
     
Группа: Свой
Сообщений: 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 такта Ничего не понял.
|
|
|
|
|
Aug 31 2009, 06:49
|
Участник

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

|
согласен. сделаю запуск таймером... а как поднять качество преобразования? (програмным путем) перевести ядро в какой режим, чтоб работала переферия (юарт , ТС0,ТС1,ацп,ДМА)? и с этого режима ядро выходило при прерывания. ато сильный разброс +-5  (аналоговая часть сделаная на макетке)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|