• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
StasRadeon

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

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

StasRadeon    1

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

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

:)

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

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


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

Правильное.

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

  • Одобряю 1

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


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

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

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

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


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

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

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

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

правильно.

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

  • Одобряю 1

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Ваша сметана сродни обезжиренному кефиру. ...Максимальная жирность жирной сметаны составляет 48%, а высокожирного продукта – 58%. В магазинах обычно продается 15-20-25%-ная сметана – более жирный продукт можно приобрести на базаре. Врачи утверждают, что человеческий организм лучше всего усваивает сметану с максимальной жирностью...
       
    • Ардуину в компьютер первым делом воткнуть нужно. Подождать, пока установятся драйвера (возможно, винда их автоматом не найдёт, тогда скачать с сайта производителя платки). В диспетчере устройств появится COM-порт. Вот после этого и IDE его увидит.
    • @Окись меди , послал жалобу модераторам на Вас за рекламу продукции не в профильной теме.
      Есть тема типа "Купи-Продай", там и шалите со своими станками.  Ну, по чуть-чуть. 
      @Dr. West вот осознал, другие помалкивают. Знать, согласны с "Что, начинать..."
    • Поэтому и надо ставить номиналы резисторов как на схеме. Не зря поставлен 50 ком регулятор громкости. У триодов с высоким усилением есть входная ёмкость Миллера. Она большая и в 6Н9С  равняется 70-100пф. И если регулятор громкости высокоомный 500ком вы ставите в среднее положение,то получается RC цепочка 250ком - 80пф,которая ослабляет ВЧ частоты. Есть калькулятор ОН лайн. Вот здесь http://tel-spb.ru/rc.html  пользуйтесь им при расчётах  и увидите всё сами. Вот ввёл 250ком и 80пф. Как видим очень большой завал. Подставьте 25 ком и увидите,как будет хорошо. А в некоторых схемах в интернете рекомендуют включать параллельно триоды входной лампы 6Н9С и тем самым увеличивают входную ёмкость  ещё больше и заваливают ВЧ ещё больше .  
    • В промышленных устройствах применяется многоступенчатое включение-отключение, смысл которого можно описАть следующим алгоритмом. Включение: 1-вход замкнут, нагрузка отключена, питания нет; 2-подаётся питание через балластное сопротивление; 3-уменьшаем балластное сопротивление (если нужно, то п.3 повторяется многократно); 4-замыкаем балластное сопротивление; 5-ждём окончания переходных процессов, подключаем нагрузку и размыкаем вход. Для выключения тоже можно что-то придумать...) С уважением В.
    • Так, полез в мусорку ценники из магазина искать.
      А-а-а, пень старый! Сметану уж давно не покупал. 
      Честно, не помню цены.  Хе, нашел-таки. В мастерской своей редко мусор выбрасываю. Там обычно только бумаги. Не тухнут.
      Сметана 26%, 0,4 литра (пластиковый пакет) - 2,03 Это $1. Моя зарплата достаточно высока для нашей местности. У других - 200-600 BYN ($100-300). Сравнивайте.
    • https://alltransistors.com/ru/transistor.php?transistor=14926 http://paratran.com/2paratran.php?tr=63787 http://paratran.com/3AnalogTransistor.php?tr=63787   Может этот???    Тут почитайте https://www.drive2.ru/l/461201973094384964/