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

 
 
> 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
 
Start new topic
Ответов
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
haker_fox
сообщение Oct 3 2012, 00:25
Сообщение #6


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

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


;
******

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:48
Рейтинг@Mail.ru


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