StasRadeon

PIC Timer прерывания

48 сообщений в этой теме

StasRadeon    1

Ваши мнения ? как можно исправить. Можете подсказать куда  посмотреть , что можно изменить ?

UART с рейтом в 128000 работает 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Alex    484

Чтобы знать куда посмотреть, что изменить, да и вообще что делать, нужно знать цель. А её из Ваших уст не очень слышно.
Мы понимаем, что у Вас плохо с Русским, но всё-таки, попытайтесь внятно объяснить вопрос.
 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

Я работаю с  Microphone Sensor (KY-038), и хотелось зарегистрировать голос. А для этого , мне нужно как минимум 8000 значение от ацп , чтобъ потом в Матлаб ево преображать для дольнешово дело.  И я так подумал , если нужно 8000 значения. Зная что Ф = 1/Т, то мне нужно получать  данные с периодом в 125 мкс и  передать  через UART.  Хочу сделать распознавание голоса с неуроновами сетями на недорогой микроконтроллер . 

Извините за мой русский. 

    //Baudrate 128.000
    //  U1BRG = (40.000.000 / (16 * BaudRate)) - 1
    //  U1BRG = (36850000 / (16 * 128.000)) - 1
    //  U1BRG = 19.53125
    

Изменено пользователем StasRadeon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

Чтобы передавать данные, которые преобразуются с определённой частотой, нужно выбирать скорость передачи равной или (лучше) выше, чем частота преобразования. Иначе данные просто будут не успевать передаваться.
Сделайте частоту UART, хотя бы, раза в 2 выше, тогда все данные буду передаваться вовремя и корректно.
Это с учётом того, что на каждое одно преобразование Вы будете передавать 1 символ. Сколько символов Вы будете передавать, во столько раз должна быть выше частота UART.

 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

Это значит что если я отправлю 3 символа ( потому что работаю ацп на 10 битов и я отправляю [0-256 максимум ] аdc value  ( но не сложно и 1024 ) ) то будет нужно  в 3 раза быстрее, правильно понел ? То значит нужно будет UART -> 256.000 ? 

и значит что Freq , не должен быть 40 Мнz , а 80 Mhz 

Правильно ?

и видно что мне нужно использовать и Direct Memory Acces (DMA) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    154

Дело не в ДМА. ДМА лишь позволяет буферизовать поток данных, но если скорость выгрузки из буфера ДМА будет ниже, чем скорость поступления данных, то буфер ДМА неизбежно будет переполнен.

Нужно увеличивать скорость связи с компьютером.  Расчет делать лениво, но для 125 мкс периода получается поток 8кслов/с  то есть 16 кбайт/с.

Сиречь простой переброс в УАРТ с рейтом ВЫШЕ, чем 16000 даст искомое.

Но есть одно но. Передача данных на компьютер имеет ограничения по латентности. И это определяется операционной системой. Так интервал транзакций на компьютер может колебаться от 1 до 10 мс МИНИМУМ.

Но даже если гнать по HID USB мосту с кадрами по 64 байта, то легко можно получить 32кбайт/с, а при CDC USB еще больше.

 

 

2 часа назад, StasRadeon сказал:

Извините за мой русский. 

Вы из Румынии или из Молдавии?

:)

Изменено пользователем my504
  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484
1 час назад, StasRadeon сказал:

Это значит что если я отправлю 3 символа ( потому что работаю ацп на 10 битов и я отправляю [0-256 максимум ] аdc value  ( но не сложно и 1024 ) ) то будет нужно  в 3 раза быстрее, правильно понел ? То значит нужно будет UART -> 256.000 ?

Поняли правильно. Только зачем 3 байта ? 1024 значений укладываются хорошо и в 2 байта.
Отсюда, как уже выше сказали, Вам нужен поток не менее 16 килобайт/сек. , а это 128 кбит/сек. Это минимум.
 

1 час назад, StasRadeon сказал:

и значит что Freq , не должен быть 40 Мнz , а 80 Mhz

Никак не связано. При тактировании периферии в 40 МГц, легко можно получить скорость в 128 килобод.
 

PS: А вообще, для голоса и 8 бит хватит за глаза. Да и частоту дискретизации смело можно понижать. На 8 КГц музыка нормально играет (без высоких), не говоря уж о голосе :)


 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
1 час назад, my504 сказал:

Вы из Румынии или из Молдавии?

Moldova 

Хорошо, и как мне повысить на 16 килобайт/сек ? Проблема в УАРТ как видно. Дайте маленький пример,  пожалуйста 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

bits_per_character -> 8 data bits + 1 start bit + 1 stop bit
    
bytes x bits_per_character / bits_per_second

16000 x 10 / 128000 = 1.25 seconds.
16 x 1024 x 10 / 128000 = 1.28 seconds.

правильное мышление  ? 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

Правильное.

Да, 128 кбит/сек не хватит. Нужна скорость побольше.
 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

но когда я смотрел в Device Manager в ПК , порт больше чем 128.000 не принимает. 

А как сделать так что побоище. Допустить поставим 256000, -> 0.64 seconds; Тоже мало  

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

Почему мало ? 256000 хватает.
10 бит * 2 байта * 8000 КГц = 160000 кбит/сек.
 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

через два-три часа отпишусь, буду дома чтоба тестировать . спасибо большое 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dm37    54

может имеет смысл сразу поднять скорость до 921 600 кбит/с (dspic33fj128mc802 по datasheet вроде поддерживает: Two UART modules (10 Mbps)), а потом посмотрите на сколько можно снизить скорость

многие переходники USB-COM поддерживают скорость до 921 600 кбит/с (но данные переходники можно использовать только для отладки, на длительное время нельзя - USB отваливается)
а если требования к надёжности выше, то можно это:
http://www.moxa.ru/shop/boards/pci_express/cp-102e/cp-102el/
http://www.moxa.ru/shop/com_v_ethernet/industrial/ia_5000a/nport_ia_5150a/
http://www.moxa.ru/shop/converters/fiber/icf-1150/icf-1150-m-sc/

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
void InitUART1() {
    
	U1MODEbits.UARTEN = 0;	
    U1STAbits.UTXEN = 0;
	U1MODEbits.ABAUD = 0;	
	U1MODEbits.BRGH = 0;	//High Speed mode
	U1MODEbits.PDSEL = 0;	// Fara paritate
	U1MODEbits.STSEL = 0;	// 1 bit de Stop/
	//  U1BRG = (Fcy / (16 * BaudRate)) - 1
	//  U1BRG = (36850000 / (16 * 256000)) - 1
	//  U1BRG = 10
	U1BRG = 10;//256.000//239;
	U1MODEbits.UARTEN = 1;	//Activam UART
	U1STAbits.UTXEN = 1; //Activam Transmisia
    _delay__us(30); // 1/256000
    //DELAY_105uS

это последние модификацие в коде, но тоже не очень быстро ;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

Спасибо огромное всем , отпишусь когда будет проект готовый. ^_^

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

здравствуйте , у меня такая проблема : настроел ацп , чтобы время конверсией ацп было 22.4 us.

настроил чтоба конверсия не было автоматической , а сделал функцию

unsigned int read_adc_value(void)
{
    AD1CON1bits.SAMP = 1; // start 
    //while(!AD1CON1bits.SAMP);
    __delay_us(10);
    AD1CON1bits.SAMP = 0; // stop 
    while(!AD1CON1bits.DONE);
    return ADCBUF0;
}

Когда в MPLAB X ставлю breakpoint показывает мне время конверсией около 5 ms .

Пожалуйста, может кто то посмотреть и подскажет где я не делаю правильно .

Мой расчеты :

=====PLL -> 80 MHz====================

    CLKDIVbits.PLLPRE = 0;
    PLLFBDbits.PLLDIV = 43 - 2;
    CLKDIVbits.PLLPOST = 0;

    // 43 x: 79.2275 MHz = 39.61375 MIPS

====================================

========ADC -> 22us =================
 Tad=Tcy*(adcs+1)=(1/40)*4 = 1.6us
 Tc = 14 * 1.6 = 22.4 us

====================================

Работаю на то чтобы взять 8000 - 10000 значения от ацп в секунду , и потом все значения переслать в ПК. 

Если есть другие идеи  как  можно взяты эти 8000 - 10000 значения  по быстрее , пожалуста скажите и мне.

 

Microcontroller  : DSPIC33fj128MC802

ADC_DSPIC33.X.rar

Изменено пользователем StasRadeon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 056

Стас, Вам вроде на соседнем ресурсе Марк уже объяснял, что Tad не может быть меньше 117.6ns,  параметр AD50 даташита,

У Вас Fcy=40MHz, Tcy=25ns.

А в настройках и коментах к ним вообще бред написан...

Цитата

    AD1CON3bits.ADRC = 1; ????//0 // foloseste ceasul magistralei
    AD1CON3bits.ADCS = 3; ????// Timpul necesar unei conversii este de 22.4 us
// Ceasul pentru conversia AD are formula Tad=Tcy*(adcs+1)
// Tad=Tcy*(adcs+1)=(1/40)*64=1.6us ????
// Se seteaza intrarile analogice

 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

Да, правильно там 63 + 1 ;

Tad=Tcy*(adcs+1)=(1/40Mhz)*64=1.6us 

Tc = 14 * 1.6 = 22.4 us

про AD1CON3bits.ADRC = 1; написано -> 1 = ADC internal RC clock

все же , я чего то не делаю правильно 

 

Изменено пользователем StasRadeon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 056

:wall: что правильно? откуда у вас 63 взялось? какое отношение RC осцилятор имеет предделителю? к разберитесь как работает тактирование ADC...

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
19 минут назад, IMXO сказал:

разберитесь как работает тактирование ADC

FRC + PLL -> 80 MHZ

    CLKDIVbits.PLLPRE = 0;
    PLLFBDbits.PLLDIV = 43 - 2; 
    CLKDIVbits.PLLPOST = 0;

FOSC  = 80 MHz

FCY  = FOSC / 2 = ~40 MHz (39.61375 MIPS)

Tcy (the instruction cycle) = 1/40 MHz = 25ns

Tad > 117.6ns ;

Tad = Tcy /(ADCS + 1) = (1/40MHz) * 5 = ~125ns;

правильно ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 056

правильно.

забыли AD1CON3bits.ADRC =0;

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

огромное спасибо! , заработало как надо 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас