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

 
 
 
Reply to this topicStart new topic
> DMA+DAC, изменение массива на лету
stm32f4
сообщение Oct 2 2012, 09:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Всем привет)Поскажите, как можно изменить значения массива, который указан в качестве передаваемого в DMA ЦАПу?
т.е имеется массив значений для генерации синуса:
Код
const uint16_t sin_50hz[] =
{ 2048, 2112, 2177, 2241, 2305, 2368, 2432, 2495, 2557, 2619, 2681, 2742, 2802,
        2861, 2920, 2978, 3035, 3091, 3145, 3199, 3252, 3303, 3353, 3402, 3450,
        3496, 3541, 3584, 3626, 3666, 3705, 3742, 3777, 3811, 3843, 3873, 3901,
        3928, 3952, 3975, 3996, 4015, 4032, 4047, 4060, 4071, 4080, 4087, 4092,
        4095, 4095, 4095, 4092, 4087, 4080, 4071, 4060, 4047, 4032, 4015, 3996,
        3975, 3952, 3928, 3901, 3873, 3843, 3811, 3777, 3742, 3705, 3666, 3626,
        3584, 3541, 3496, 3450, 3402, 3353, 3303, 3252, 3199, 3145, 3091, 3035,
        2978, 2920, 2861, 2802, 2742, 2681, 2619, 2557, 2495, 2432, 2368, 2305,
        2241, 2177, 2112, 2048, 1984, 1919, 1855, 1791, 1728, 1664, 1601, 1539,
        1477, 1415, 1354, 1294, 1235, 1176, 1118, 1061, 1005, 951, 897, 844,
        793, 743, 694, 646, 600, 555, 512, 470, 430, 391, 354, 319, 285, 253,
        223, 195, 168, 144, 121, 100, 81, 64, 49, 36, 25, 16, 9, 4, 1, 0, 1, 4,
        9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 168, 195, 223, 253, 285, 319,
        354, 391, 430, 470, 512, 555, 600, 646, 694, 743, 793, 844, 897, 951,
        1005, 1061, 1118, 1176, 1235, 1294, 1354, 1415, 1477, 1539, 1601, 1664,
        1728, 1791, 1855, 1919, 1984 };

с помощью DMA я передаю ЦАПу все значения по прерыванию таймера!!!!!
Код
//***********DMA1***************
    RCC->AHB1ENR    |= RCC_AHB1ENR_DMA1EN;
    DMA1_Stream5->CR|= DMA_SxCR_CHSEL;            // 111: channel 7 selected
    DMA1_Stream5->PAR= (uint32_t)&DAC->DHR12R1; // указатель на переферийное устройство
    DMA1_Stream5->M0AR=(uint32_t)&sin_50hz[0];//адрес буфера
    DMA1_Stream5->NDTR=200;                        // кол-во передаваемых данных
    DMA1_Stream5->CR|= DMA_SxCR_MINC;            // инкремент указателя буфера
    DMA1_Stream5->CR|= DMA_SxCR_MSIZE_0;        // размер элемента в памяти 16 бит
    DMA1_Stream5->CR|= DMA_SxCR_PSIZE_0;        // размер элемента в переферии 16 бит
    DMA1_Stream5->CR|= DMA_SxCR_CIRC;            // цикличная передача данных
    DMA1_Stream5->CR|= DMA_SxCR_DIR_0;            // 01: Memory-to-peripheral
    DMA1_Stream5->CR|= DMA_SxCR_PL;                // 11: Very high
    DMA1_Stream5->CR|= DMA_SxCR_EN;                // включение ПДП


так вот,повторюсь) как в процессе передачи данных добавить делитель!!!!!!!!!!! к примеру по нажатию кнопки урезать(увеличить) размах!!!!!!т.е сделать что-то типа этого: DMA1_Stream5->M0AR=((uint32_t)&sin_50hz[0])/2-делить каждый элемент буферана опр знач!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 2 2012, 09:52
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Разместите sin_50hz[] в ОЗУ, и меняйте как угодно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
stm32f4
сообщение Oct 2 2012, 10:45
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Цитата(AHTOXA @ Oct 2 2012, 13:52) *
Разместите sin_50hz[] в ОЗУ, и меняйте как угодно.

А можно поподробней?, пожалуйста!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 2 2012, 11:55
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (stm32f4 @ Oct 2 2012, 19:45) *
А можно поподробней?, пожалуйста!

Уберите слово const в объявлении массива) Согласно этому объект (Вам массив) будет размещен в ОЗУ.

Т.к. в DMA Вы передаете только стартовый адрес массива, то менять Вам придется весь массив (делить или домножать на некое число). DMA же в ходе передачи не сможет делать выборку каждого значения и модифицировать его.

Следовательно, перед передачей придется менять все значения Вашего массива. Для того, чтобы их можно было менять, они и должны лежать в ОЗУ.

Примерно так
CODE
arrayModifyFunc( uint16_t mul_val )
{
    for( uint16_t i = 0; i < sizeof( sin_50hz ) / sizeof( uint16_t ); i++ )
        sin_50hz[ i ] *= mul_val;
}


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
_pv
сообщение Oct 2 2012, 13:41
Сообщение #5


Гуру
******

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



Цитата(haker_fox @ Oct 2 2012, 17:55) *
Примерно так
Код
arrayModifyFunc( uint16_t mul_val ){
  for( uint16_t i = 0; i < sizeof( sin_50hz ) / sizeof( uint16_t ); i++ ) sin_50hz[ i ] *= mul_val;
}

только лучше всё-таки делать копию исходного массива умножая на нужное число, а то после некоторого количества регулировок туда-сюда из-за ошибок округления синус может превратиться в совсем не синус.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 2 2012, 13:45
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Конечно копию. А если нужно совсем аккуратно, то две копии. Пока одна работает, меняем другую, и уже потом переключаем DMA на неё.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
stm32f4
сообщение Oct 2 2012, 14:24
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Цитата(haker_fox @ Oct 2 2012, 15:55) *
Уберите слово const в объявлении массива) Согласно этому объект (Вам массив) будет размещен в ОЗУ.

Т.к. в DMA Вы передаете только стартовый адрес массива, то менять Вам придется весь массив (делить или домножать на некое число). DMA же в ходе передачи не сможет делать выборку каждого значения и модифицировать его.

Следовательно, перед передачей придется менять все значения Вашего массива. Для того, чтобы их можно было менять, они и должны лежать в ОЗУ.

Примерно так
Код
arrayModifyFunc( uint16_t mul_val )
{
    for( uint16_t i = 0; i < sizeof( sin_50hz ) / sizeof( uint16_t ); i++ )
        sin_50hz[ i ] *= mul_val;
}

Ух ты, то что надо)спасибо!
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 2 2012, 14:43
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Синус, который меняет амплитуду в переходе через ноль - это правильно!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 3 2012, 00:25
Сообщение #9


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (_pv @ Oct 2 2012, 21:41) *
только лучше всё-таки делать копию исходного массива умножая на нужное число, а то после некоторого количества регулировок туда-сюда из-за ошибок округления синус может превратиться в совсем не синус.

Ну да, я лишь скелет набросал. Да и с делением автору придется подумать. Я лишь только умножение сделал)

А может имеет смысл все во float перегнать. Какая разница для ARM? rolleyes.gif Тогда по бубену, множитель ли, делитель ли, все одно wink.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 3 2012, 04:44
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(haker_fox @ Oct 3 2012, 03:25) *
А может имеет смысл все во float перегнать. Какая разница для ARM?

Танунах. Как будто процу больше заниматься нечем. И при этом ошибки округления все равно будут накапливаться.

Сообщение отредактировал _Pasha - Oct 3 2012, 08:29
Go to the top of the page
 
+Quote Post
YAM
сообщение Oct 3 2012, 05:47
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



А что, уже не кошерно на выход DAC поставить цифровой резюк и делать что хочешь уже на выходе? (все равно там ну хоть какой буфер надо ставить) rolleyes.gif
Вы же должны сами понимать, что при чисто "цифровом делении" уменьшается число квантовний выходного сигнала.


--------------------
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 3 2012, 08:21
Сообщение #12


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (_Pasha @ Oct 3 2012, 13:44) *
Танунах. Как будто процу больше заниматься нечем. И при этом ошибки округления все равно накапливаться.

А фдрух нэчэм? rolleyes.gif Моя же вариант допольнительный предлагать rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th July 2025 - 07:09
Рейтинг@Mail.ru


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