|
Как переслать результат АЦП на комп. |
|
|
|
Nov 18 2006, 07:27
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(Doka @ Nov 17 2006, 22:59)  JTAG нужен.. Эмулятор.. не помню встроен ли он в ezDsp320F2812 далее по хелпу: RTDX
насчет МатЛАБа: см. описание тузла: "Link for Code Composer Studio" Ну вот опять общие фразы... Лучше бы кусочки кода... Эмулятор встроенный. Про RTDX я знаю, но для того, чтобы вывести переменную на график встроенный в CCS RTDX ведь не нужен.
Сообщение отредактировал PhX - Nov 18 2006, 07:30
--------------------
Если все, то не я...
|
|
|
|
|
Nov 18 2006, 17:54
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(PhX @ Nov 17 2006, 23:39)  Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить? может просто через uart. в компе разогнать до 921600. этого вполне хватит для передачи в реальном времени. а если родной на такой скорости откажется работать, то через USB<->RS232. да и matlab с компортом работать вроде умеет.
|
|
|
|
|
Nov 21 2006, 17:24
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(PhX @ Nov 17 2006, 14:39)  Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?
ezDsp320F2812 CCS 3.1 В принципе, вам Дока ответил уже, хочу просто дополнить. Чтобы график отображался в CCS, делаете так View-->Graph-->Time/Frequency... Если хотите динамически, поставьте breakPoint где-нибудь в программе и нажмите кнопку Animate, по мере выполнения программы график будет обновляться. Чтобы сохранить с помощью CCS данные из программы, делаете так File-->Graph-->Save... Также можно и загружать некие данные в программу. Еще простой вариант. Графики из окошек CCS удобно заносить в буфер обмена (clipboard) с помощью клавиш Alt+PrtSc, а потом в ворд-документ с помощью копи-пейст (или Ctrl+V). Иногда здорово помогает(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 21 2006, 21:15
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(=GM= @ Nov 21 2006, 19:24)  Чтобы график отображался в CCS, делаете так View-->Graph-->Time/Frequency... Если хотите динамически, поставьте breakPoint где-нибудь в программе и нажмите кнопку Animate, по мере выполнения программы график будет обновляться. Ну до этого я конечно дошел, осталось 3 вопроса: Дано: Каждые 1/20000 сек вызывается прервание, где результат преобразования записывается в переменную int16 myadcresult. Вопросы: 1. Что писать в Start Address? В хелпе пишется, что это адрес буфера с данными которые будем изображать, т.е. что надо делать этот самый буфер? 2. Acquisition Buffer Size это что такое? Видимо размер этого буфера. 3. Display Data Size а это что такое? Видимо размер буфера из которого данные выводяться на график, т.е. из Acquisition Buffer данные постоянно валятся в Display Buffer из которого и выводятся на экран. Так-то все вроде понятно, но как создать этот самый Acquisition Buffer без дополнительного кода в функции прерывания (а если с ним, то набросайте please). Если ответить на эти вопросы я думаю проблема будет частично решена. Цитата(=GM= @ Nov 21 2006, 19:24)  Чтобы сохранить с помощью CCS данные из программы, делаете так File-->Graph-->Save... Также можно и загружать некие данные в программу. Не знал спасибо! Цитата(=GM= @ Nov 21 2006, 19:24)  Еще простой вариант. Графики из окошек CCS удобно заносить в буфер обмена (clipboard) с помощью клавиш Alt+PrtSc, а потом в ворд-документ с помощью копи-пейст (или Ctrl+V). Иногда здорово помогает(:-). Ну а это знает каждый advanced user (:-).
--------------------
Если все, то не я...
|
|
|
|
|
Nov 22 2006, 17:33
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(PhX @ Nov 21 2006, 18:15)  Цитата(=GM= @ Nov 21 2006, 19:24)  Чтобы график отображался в CCS, делаете так View-->Graph-->Time/Frequency... Если хотите динамически, поставьте breakPoint где-нибудь в программе и нажмите кнопку Animate, по мере выполнения программы график будет обновляться.
Ну до этого я конечно дошел, осталось 3 вопроса: Дано: Каждые 1/20000 сек вызывается прервание, где результат преобразования записывается в переменную int16 myadcresult. Вопросы: 1. Что писать в Start Address? В хелпе пишется, что это адрес буфера с данными которые будем изображать, т.е. что надо делать этот самый буфер? Задаете начала массива (Start Address) для графика, поскольку отрисовать можно только массив (или буфер, тот же мтс-символ, только вид сбоку). Сам массив (буфер) должен быть у вас в программе. Цитата(PhX @ Nov 21 2006, 18:15)  2. Acquisition Buffer Size это что такое? Видимо размер этого буфера. Это размер вашего массива, она может не совпадать с длиной буфера отображения, хитрость в том, что возможна нормализация всех элементов буфера, ну или у вас буфер со смешанными сигналами, значит рисовать надо через слово. Много чего там можно придумать. Цитата(PhX @ Nov 21 2006, 18:15)  3. Display Data Size а это что такое? Видимо размер буфера из которого данные выводяться на график, т.е. из Acquisition Buffer данные постоянно валятся в Display Buffer из которого и выводятся на экран. Так-то все вроде понятно, но как создать этот самый Acquisition Buffer без дополнительного кода в функции прерывания (а если с ним, то набросайте please). Если ответить на эти вопросы я думаю проблема будет частично решена. Обычный буфер для отображения, находится на писюке. Сколько надо точек отобразить, таков и буфер Цитата(PhX @ Nov 21 2006, 18:15)  Цитата(=GM= @ Nov 21 2006, 19:24)  Еще простой вариант. Графики из окошек CCS удобно заносить в буфер обмена (clipboard) с помощью клавиш Alt+PrtSc, а потом в ворд-документ с помощью копи-пейст (или Ctrl+V). Иногда здорово помогает(:-).
Ну а это знает каждый advanced user (:-). Ну раз вы advanced user(:-), вот так сделать можете (ех1) или так (ех2)?
Эскизы прикрепленных изображений
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 23 2006, 21:01
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Большое спасибо за доходчивый ответ. Однако программы на ассемблере мне понятны немногим более чем китайская грамата. Я на С то еще не асс, так что буду разбираться. Кстати нарвыл такую штуку DataLog из DMCLib, вроде работает, если кто в асме разбирается и будет время и желание глянте. Применяется так:
main() { dlog1.iptr1 = &Q15_var1; // Pass input to DATALOG module dlog1.iptr2 = &Q15_var2; // Pass input to DATALOG module dlog1.iptr3 = &Q15_var3; // Pass input to DATALOG module dlog1.iptr4 = &Q15_var4; // Pass input to DATALOG module dlog1.trig_value = 0x0; // Pass input to DATALOG module dlog1.size = 0x400; // Pass input to DATALOG module dlog1.prescalar = 1; // Pass input to DATALOG module dlog1.init(dlog1); // Call init function for dlog1 } void interrupt periodic_interrupt_isr() { dlog1.update(&dlog1); // Call update function for dlog1 }
и вроде работает.
Вопросы:
1. Почему один раз буфер забился и все одна и та-же картинка это так должно быть? 2. Что такое dlog1.trig_value?
; File name : DLOG4CHC.ASM ; ; Originator : Advanced Embeeded Control (AEC) ; Texas Instruments Inc. ; ; Description : 4-Channel Data logging module ; ; Date : 02/01/2002 (DD/MM/YYYY)
; Routine Name: data_log_update ; ; C prototype : void DLOG_4CH_update(DLOG_4CH_handle); ; void DLOG_4CH_init(DLOG_4CH_handle); ; ; The struct object is defined in the header file "dlog_4ch.h" as follows: ; ; typedef struct { ; long task; /* Variable: Task address pointer */ ; int *iptr1; /* Input: First input pointer (Q15) */ ; int *iptr2; /* Input: Second input pointer (Q15) */ ; int *iptr3; /* Input: Third input pointer (Q15) */ ; int *iptr4; /* Input: Fourth input pointer (Q15) */ ; int trig_value; /* Input: Trigger point (Q15) */ ; int prescalar; /* Parameter: Data log prescale */ ; int skip_cntr; /* Variable: Data log skip counter */ ; int cntr; /* Variable: Data log counter */ ; long write_ptr; /* Variable: Graph address pointer */ ; int size; /* Parameter: Maximum data DLOG_4CH_buffer */ ; int (*init)(); /* Pointer to init function */ ; int (*update)(); /* Pointer to update function */ ; } DLOG_4CH;
; ; External Reference .def _DLOG_4CH_update .def _DLOG_4CH_init
; Data log buffer definition BUFF_SIZE .set 400h DLOG_4CH_buff1 .usect "DLOG", BUFF_SIZE DLOG_4CH_buff2 .usect "DLOG", BUFF_SIZE DLOG_4CH_buff3 .usect "DLOG", BUFF_SIZE DLOG_4CH_buff4 .usect "DLOG", BUFF_SIZE
;============================================================================== ; Initialization Function ;==============================================================================
_DLOG_4CH_init: MOVL XAR5,#POS_TRIG_S1 MOVL *XAR4,XAR5 ; task=#POS_TRIG_S1 ADDB XAR4,#10 ; XAR4->trig_value MOV *+XAR4[2],#0
MOVL XAR5,#DLOG_4CH_buff1 MOVL *+XAR4[4],XAR5 ; write_ptr=DLOG_4CH_buff1 MOV AL,*+XAR4[6] ; ACC=size MOV *+XAR4[3],AL ; cntr=size LRETR ;============================================================================== ; Datalog Update Function ;==============================================================================
_DLOG_4CH_update: SETC SXM MOVL XAR5,XAR4 ; XAR4->task MOVL XAR7,*XAR4++ ; XAR4->iptr1, XAR7=task ADDB XAR5,#10 ; XAR5->trig_value LB *XAR7 ; Branch to TASK POS_TRIG_S1: MOV ACC,*XAR5 ; ACC=trig_value MOVL XAR6,*XAR4 ; XAR6=iptr1 SUB ACC,*XAR6 ; ACC=(trig_value - *iptr1) BF DL_EXIT,LEQ ; Exit if ACC <= 0 MOVL XAR6,#POS_TRIG_S2 MOVL *--XAR4,XAR6 ; task=POS_TRIG_S2 LRETR POS_TRIG_S2: MOV ACC,*XAR5 ; ACC=trig_value MOVL XAR6,*XAR4 ; XAR6=iptr1 SUB ACC,*XAR6 ; ACC=(trig_value - *iptr1) BF DL_EXIT,GEQ ; Exit if ACC >= 0 MOVL XAR6,#DL_TRIGGERED MOVL *--XAR4,XAR6 ; task=POS_TRIG_S2 LRETR DL_TRIGGERED: INC *+XAR5[2] ; skip_cntr=skip_cntr+1 MOV ACC,*+XAR5[2] ; ACC=skip_cntr SUB ACC,*+XAR5[1] ; ACC=skip_cntr-prescalar SBF DL_EXIT,NEQ ; if (skip_cntr+1) < prescalar, then exit MOV *+XAR5[2],#0 ; skip_cntr=0 MOV ACC,*+XAR5[3] ; ACC=cntr SBF DLOG_END,EQ DEC *+XAR5[3] ; cntr=cntr-1 ADDB XAR5,#4 ; XAR5->write_ptr
MOVL XAR6,*XAR5 ; XAR6=write_ptr ADDB XAR6,#1 ; XAR6=write_ptr+1 MOVL *XAR5,XAR6 ; write_ptr=write_ptr + 1 SUBB XAR6,#1 ; XAR6=write_ptr
MOV AR0,#BUFF_SIZE ; AR0=BUFF_SIZE ; Log sample pointed by IPTR1 MOVL XAR7,*XAR4++ ; XAR7=iptr1 MOV AL,*XAR7 ; AL=*iptr1 NOP *,ARP6 MOV *0++,AL ; *write_ptr=*iptr1, XAR6=write_ptr+size
; Log sample pointed by IPTR2 MOVL XAR7,*XAR4++ ; XAR7=iptr2 MOV AL,*XAR7 ; AL=*iptr2 NOP *,ARP6 MOV *0++,AL ; *write_ptr=*iptr2, XAR6=write_ptr+size
; Log sample pointed by IPTR3 MOVL XAR7,*XAR4++ ; XAR7=iptr3 MOV AL,*XAR7 ; AL=*iptr3 NOP *,ARP6 MOV *0++,AL ; *write_ptr=*iptr3, XAR6=write_ptr+size
; Log sample pointed by IPTR4 MOVL XAR7,*XAR4++ ; XAR7=iptr4 MOV AL,*XAR7 ; AL=*iptr4 NOP *,ARP6 MOV *0++,AL ; *write_ptr=*iptr4, XAR6=write_ptr+size LRETR
; Reinitialise the module to log the data when the logging is triggered next DLOG_END:
MOVL XAR6,#DLOG_4CH_buff1 MOVL *+XAR5[4],XAR6 ; write_ptr=DLOG_4CH_buff1 MOVL XAR6,#POS_TRIG_S1 MOVL *--XAR4,XAR6 ; task=POS_TRIG_S2
MOV AL,*+XAR5[6] ; ACC=size MOV *+XAR5[3],AL ; cntr=size DL_EXIT: LRETR
--------------------
Если все, то не я...
|
|
|
|
|
Dec 6 2006, 16:52
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(PhX @ Dec 6 2006, 09:28)  Задача наблюдения за переходными процессами при пуске двигателя постоянного тока. Требуется снимать ток якоря (АЦП), угол поворота вала, скорость вращения вала (энкодер). Управление двигателем осуществляется при помощи ШИМ (широтно импульсной модуляции) питающего напряжения частотой 20 кГЦ. Переходные процессы в электродвигателе длятся отностительно долго (около 1 сек.), то есть необходимо отобразить на графике 20000*3=60000 точек * 2 = 120000 байт (в крайнем случае отбросив скорость вращения 20000*2=40000 = 80000 байт). Естественно создать буфер такого размера в памяти контроллера не реально. Вижу комбинацию двух путей, как помочь горю. 1) Уменьшить размер буфера в 2-4 раза, если записывать в буфер разности текущего и предыдущего значений. Тогда вам потребуется минимум 20Кбайт. В процессоре есть 18Кслов озу, т.е. 36 Кбайт. Ну пусть 3 Кслова на программу, останется 30 Кбайт. 2) Использовать кольцевой буфер и передачу не через отладочный джей-таг, а через рс232 или спи. Ну примерно так, пишите в буфер 30 кбайт за секунду, а выдаете 10 кбайт за секунду (скорость 115кбод), значит вам должно хватить буфера на 20 кбайт, который вы передадите уже после завершения односекундного переходного процесса. Цифры примерные, просто для начала разговора, главное, чтобы была понятна идея.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 6 2006, 17:04
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(PhX @ Nov 17 2006, 14:39)  Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?
ezDsp320F2812 CCS 3.1 Фу-ты, не обратил внимания, что вы используете ezDsp320F2812, там же внешняя память прицеплена 128 Кбайт! Не надо ничего делать, просто используйте эту память, записываете туда ваши данные, а потом хоть 5 минут качайте в писюк, времени у вас вагон(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 7 2006, 09:18
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(=GM= @ Dec 6 2006, 19:04)  Фу-ты, не обратил внимания, что вы используете ezDsp320F2812, там же внешняя память прицеплена 128 Кбайт! Не надо ничего делать, просто используйте эту память, записываете туда ваши данные, а потом хоть 5 минут качайте в писюк, времени у вас вагон(:-). Это конечно выход, однако это частное решение проблемы. Неужели через этот JTAG нельзя передать данные со скоростью большей чем 20000*16/1024=312.5 кбит/сек. Чего они там кичатся RTDXом, который также осуществляется через JTAG, букву R тогда в кавычки надо ставить. Вообще где есть инфа по характеристикам предачи через JTAG?
--------------------
Если все, то не я...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|