реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как переслать результат АЦП на комп.
PhX
сообщение Nov 17 2006, 17:39
Сообщение #1


Местный
***

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



Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?

ezDsp320F2812
CCS 3.1

Сообщение отредактировал PhX - Nov 17 2006, 17:40


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
Doka
сообщение Nov 17 2006, 17:59
Сообщение #2


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



JTAG нужен.. Эмулятор.. не помню встроен ли он в ezDsp320F2812
далее по хелпу: RTDX

насчет МатЛАБа: см. описание тузла: "Link for Code Composer Studio"


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 18 2006, 07:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
Doka
сообщение Nov 18 2006, 17:22
Сообщение #4


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



28xmaster.chm -> Animating the Program and Graphs
28x_real.chm (demonstrates how to use Code Composer Studio's real-time debug features)


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 18 2006, 17:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(PhX @ Nov 17 2006, 23:39) *
Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?

может просто через uart.
в компе разогнать до 921600. этого вполне хватит для передачи в реальном времени.
а если родной на такой скорости откажется работать, то через USB<->RS232.
да и matlab с компортом работать вроде умеет.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 21 2006, 17:24
Сообщение #6


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). Иногда здорово помогает(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 21 2006, 21:15
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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 (:-).


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 22 2006, 17:33
Сообщение #8


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)?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
PhX
сообщение Nov 23 2006, 21:01
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
PhX
сообщение Dec 4 2006, 19:44
Сообщение #10


Местный
***

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



После упорной борьбы с собственным ламерством я со всем разобрался. Однако появилась новая проблема: скачки на графике если Display Data Size > Acquisition Buffer Size. Это видимо из-за того, что пересылка данных из Acquisition Buffer на комп занимает некоторое время, за которое этот самый Acquisition Buffer перезаписывается много раз. Что нужно сделать, чтобы преодолеть эту неприятность?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 5 2006, 13:19
Сообщение #11


Ambidexter
*****

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



Цитата(PhX @ Dec 4 2006, 16:44) *
...новая проблема: скачки на графике если Display Data Size > Acquisition Buffer Size. Это видимо из-за того, что пересылка данных из Acquisition Buffer на комп занимает некоторое время, за которое этот самый Acquisition Buffer перезаписывается много раз. Что нужно сделать, чтобы преодолеть эту неприятность?


Самое простое сделать Display Data Size =< Acquisition Buffer Size. Зачем вам нужно, чтобы DisplayBuffer елозил по всему Acquisition Buffer? Что за задача?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
PhX
сообщение Dec 6 2006, 12:28
Сообщение #12


Местный
***

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



Задача наблюдения за переходными процессами при пуске двигателя постоянного тока. Требуется снимать ток якоря (АЦП), угол поворота вала, скорость вращения вала (энкодер). Управление двигателем осуществляется при помощи ШИМ (широтно импульсной модуляции) питающего напряжения частотой 20 кГЦ.
Переходные процессы в электродвигателе длятся отностительно долго (около 1 сек.), то есть необходимо отобразить на графике 20000*3=60000 точек * 2 = 120000 байт (в крайнем случае отбросив скорость вращения 20000*2=40000 = 80000 байт). Естественно создать буфер такого размера в памяти контроллера не реально.


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 6 2006, 16:52
Сообщение #13


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 кбайт, который вы передадите уже после завершения односекундного переходного процесса.

Цифры примерные, просто для начала разговора, главное, чтобы была понятна идея.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 6 2006, 17:04
Сообщение #14


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 минут качайте в писюк, времени у вас вагон(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
PhX
сообщение Dec 7 2006, 09:18
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 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?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 12:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016