StasRadeon

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

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

StasRadeon    1

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

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

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


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

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

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

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

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

  • Одобряю 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    494

Чтобы передавать данные, которые преобразуются с определённой частотой, нужно выбирать скорость передачи равной или (лучше) выше, чем частота преобразования. Иначе данные просто будут не успевать передаваться.
Сделайте частоту 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    157

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

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

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

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

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

 

 

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

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

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

:)

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

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    494
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    494

Правильное.

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

  • Одобряю 1

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


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

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

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

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


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

Почему мало ? 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 064

Стас, Вам вроде на соседнем ресурсе Марк уже объяснял, что 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 064

: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 064

правильно.

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

  • Одобряю 1

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • @Крашер , ну Вы совсем, что ли ребёнок?
      Аккумуляторщик? В военном билете и в наши годы - Вы что, меня, за идиота, что ли, принимаете? Простите, но я Вас как-то вновь не понимаю. Учтём, что нет пока ответа на поставленный вопрос : Уже вследствие этого я могу смело делать выводы о компетенции..
    • Автор идеи @avv_rem , а переработка моя. Я практик а не теоретик, нашёл решение практически. Работает ну и слава богу! Ток ограничивает, от КЗ защищает  красота!
    • Везет! А у мну латр лежит, а провода нет))) Ничего не намотать))
    • Запустил второй канал, пока нагрузка с трансформатора резики. Общее потребеление околок 104мА. Выходные 23,5мА   на 211в Ua, секта 106в . Второй канал чуть отличается в режимах, 24мА на 210в и секта 110в. На второй канал R20 больше на 500 ом воткнул, но думаю пофиг. Выведу балансом громкость. Мучаю держу уже минут 40..50, на БП радиатор нагрелся до 44С, вроде дальше не идет. Поставил пока маленький трансформатор на переменку накал. 6.16 на лампах. Чуть больше двух спичечных коробков. Анодный так же поискал по меньше, с кулак. Оба греются до 31С. Фон не слушал, сегодня лень уже подключать динамики. Да, надо что то с регуляторами по входу приделать, уровень громкости то надо регулировать. Выходные от ЕЛ34, каждый с два кулака. Как то маленьким усилитель у меня явно не выходит.  ПС оос не подключал.   
    • Ну, м-да! Конечно, не студент.
      Извините. (Но вопросы остались).
    • А, не выпытывать эту схему в песочнице, но самому привести и"на пальцах" показать ошибочность мнения многих...    Наиболее близкое пояснение. "Качели" там возникают в любом случае. Особенно - при большой разнице основных характеристик аккумуляторов.  Хоть при бездействии, хоть при разряде-заряде. 
    • Нет, строго научно обосновать не могу. Возможно, можно сослаться на упомянутого вами Киргофа. Но понимаю, что мирно спать аккумуляторы с разным внутренним сопротивлением, хоть и заряженные до одинакового напряжения, не будут.