Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » STM32 DMA burst


STM32 DMA burst

Сообщений 31 страница 59 из 59

31

Pridnya написал(а):

Ну вот и у меня теперь частота ШИМ 41 кГц, все по формуле. Это хорошо. Спасибо!

Не забывай !!!

Код:
TIM2->PSC = PRESCALER-1;
TIM2->ARR =PERIOD-1;
Код:
TIM2->ARR = 2048-1;	

32

Pridnya написал(а):

А что с MCO1 творится? Какая-то жуть. Уже 13-я ревизия RM0090 Rev.13 вышла и в ней тот же косяк:

Сие соблюдаем? Уверен что нет..

Bits 22:21 MCO1: Microcontroller clock output 1
Set and cleared by software. Clock source selection may generate glitches on MCO1. It is
highly recommended to configure these bits only after reset before enabling the external
oscillators and PLL.

Посмотри где у меня конфигурируется MCO ...

Система тактирования

33

dosikus написал(а):

Pridnya написал(а):

    А что с MCO1 творится? Какая-то жуть. Уже 13-я ревизия RM0090 Rev.13 вышла и в ней тот же косяк:

Сие соблюдаем? Уверен что нет..

    Bits 22:21 MCO1: Microcontroller clock output 1
    Set and cleared by software. Clock source selection may generate glitches on MCO1. It is
    highly recommended to configure these bits only after reset before enabling the external
    oscillators and PLL.

Посмотри где у меня конфигурируется MCO ...

Система тактирования

Ясен пень, что не соблюдаем. Ну и мануал. В моем случае чтобы вывести частоту на MCO1 нужно править код файла system_stm32f4xx.c (который сгенерил клок конфигуратор) до включения PLL, а я включил вывод в файл main.c. А у тебя этого файла что ли нет?

Отредактировано Pridnya (2017-03-22 12:20:48)

34

Pridnya
Дим , я писал  для кого????   Система тактирования
Ну хоть счас почитай, только не как "изгонятель бесов" -поверхностно и через гугль переводчик ...

35

dosikus написал(а):

Pridnya
Дим , я писал  для кого????   Система тактирования
Ну хоть счас почитай, только не как "изгонятель бесов" -поверхностно и через гугль переводчик ...

Я уже пользу извлек из твоего кода. Оказывается, что большая часть кода из system_stm32f4xx.c мною не используется и вообще не нужна мне (функция обновления частоты во время выполнения программы, функция для работы с внешним ОЗУ). Где включать эти биты я понял. Т.е. код станет меньше и понятнее - расположение таблици векторов и её смещение, коэффициенты и инициализация тактирования и всё.
PS: Гуголь переводчик не умеет переводить технические тексты, потому и почти не пользуюсь им, только отдельные слова и то не всегда нужное выдает.

Отредактировано Pridnya (2017-03-22 12:46:45)

36

Pridnya написал(а):

Оказывается, что большая часть кода из system_stm32f4xx.c мною не используется и вообще не нужна мне (функция обновления частоты во время выполнения программы, функция для работы с внешним ОЗУ).

Сейчас не нужны, освоишься, поймешь что к чему, напишешь свое.
Теперь понимаешь почему я не использую ни спл ни калокуб? Тянуть в проект непонятно кем и как наляпанное...

37

dosikus написал(а):

Pridnya написал(а):

    Оказывается, что большая часть кода из system_stm32f4xx.c мною не используется и вообще не нужна мне (функция обновления частоты во время выполнения программы, функция для работы с внешним ОЗУ).

Сейчас не нужны, освоишься, поймешь что к чему, напишешь свое.
Теперь понимаешь почему я не использую ни спл ни калокуб? Тянуть в проект непонятно кем и как наляпанное...

Понятно, что хрень кем-то написаная вместо "Си - переносимого Ассемблера" становится непереносимой и нечитаемой хренью, заточенной под кодогенератор для полных идиотов.

38

dosikus написал(а):

Pridnya написал(а):

    А что с MCO1 творится? Какая-то жуть. Уже 13-я ревизия RM0090 Rev.13 вышла и в ней тот же косяк:

Сие соблюдаем? Уверен что нет..

    Bits 22:21 MCO1: Microcontroller clock output 1
    Set and cleared by software. Clock source selection may generate glitches on MCO1. It is
    highly recommended to configure these bits only after reset before enabling the external
    oscillators and PLL.

Посмотри где у меня конфигурируется MCO ...

Система тактирования

Виноват! Туплю. Нужно записать в биты 22-21, а я пишу (3<<22). :) Все нормально.

В SystemInit() нужно написать

Код:
void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;
	
/*Bits 22:21 MCO1: Microcontroller clock output 1
Set and cleared by software. Clock source selection may generate glitches on MCO1. It is
highly recommended to configure these bits only after reset before enabling the external
oscillators and PLL. */
	RCC->CFGR |= 
	((7 << 24) // Bits 24:26 MCO1PRE: MCO1 prescaler =5
	|(3 << 21) // Bits 22:21=11: PLL, 
  );

А в main.c, кроме включения тактирования порта GPIOA и настройки альтернативной функции нужно еще и установить скорость Very High Speed. Это я смотрю у тебя стиль такой - не указывать скорость порта в случае альтернативной функции (как ты в случае с ШИМ написал), но в случае с ШИМ это не критично, а вот в случае SPI на несколько десятков мегагерц или MCO1 PLL 168/5=33.6 МГц - существенно. Без указания скорости сигнал не увидешь.

Код:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;	

GPIOA->MODER &= ~(3U<<8*2); // Clear.
GPIOA->MODER |=  (2U<<8*2); // PA8 -  Alternate function mode.
GPIOA->AFR[1]  &= ~(15U << ( 0*4)); // 
GPIOA->AFR[1]  |=  (0U << ( 0*4));  // 
GPIOA->OSPEEDR &= ~( 3U << ( 8*2));	// Clear.
GPIOA->OSPEEDR |=  ( 3U << ( 8*2)); // 01: Very high speed.

Отредактировано Pridnya (2017-03-22 15:33:22)

39

Код:
/*!< MCO1 configuration */
#define RCC_CFGR_MCO1_Pos                  (21U)                               
#define RCC_CFGR_MCO1_Msk                  (0x3U << RCC_CFGR_MCO1_Pos)         /*!< 0x00600000 */
#define RCC_CFGR_MCO1                      RCC_CFGR_MCO1_Msk                   
#define RCC_CFGR_MCO1_0                    (0x1U << RCC_CFGR_MCO1_Pos)         /*!< 0x00200000 */
#define RCC_CFGR_MCO1_1                    (0x2U << RCC_CFGR_MCO1_Pos)         /*!< 0x00400000 */

40

Pridnya написал(а):

но в случае с ШИМ это не критично, а вот в случае SPI на несколько десятков мегагерц или MCO1 PLL 168/5=33.6 МГц - существенно. Без указания скорости сигнал не увидешь.

Вот где это критично, там и настраиваю...

см. Система тактирования

41

dosikus написал(а):

Код:

/*!< MCO1 configuration */
#define RCC_CFGR_MCO1_Pos                  (21U)                               
#define RCC_CFGR_MCO1_Msk                  (0x3U << RCC_CFGR_MCO1_Pos)         /*!< 0x00600000 */
#define RCC_CFGR_MCO1                      RCC_CFGR_MCO1_Msk                   
#define RCC_CFGR_MCO1_0                    (0x1U << RCC_CFGR_MCO1_Pos)         /*!< 0x00200000 */
#define RCC_CFGR_MCO1_1                    (0x2U << RCC_CFGR_MCO1_Pos)         /*!< 0x00400000 */

Ты хочешь сказать, что лучше без магических чисел. Но у меня таких макроопределений нет в к4.71, это у тебя, наверное, из 5-го.

42

Pridnya
Это все есть в stm32f407xx.h и об этом уже писал - Keil
И от кайла это не зависит , хотя лучше 5ку поставь...

43

dosikus написал(а):

Pridnya
Это все есть в stm32f407xx.h и об этом уже писал - Keil
И от кайла это не зависит , хотя лучше 5ку поставь...

Значит у меня старый неполный вариант этого файла, у меня есть

Код:
/*!< MCO1 configuration */
#define  RCC_CFGR_MCO1                       ((uint32_t)0x00600000)
#define  RCC_CFGR_MCO1_0                     ((uint32_t)0x00200000)
#define  RCC_CFGR_MCO1_1                     ((uint32_t)0x00400000)

44

* @file    stm32f407xx.h
  * @author  MCD Application Team
  * @version V2.6.0
  * @date    04-November-2016
  * @brief   CMSIS STM32F407xx Device Peripheral Access Layer Header File.

45

А у меня

* @file    stm32f4xx.h
  * @author  MCD Application Team
  * @version V1.1.0RC3 - edited by Keil
  * @date    14-December-2012

Нужно обновляться.

Отредактировано Pridnya (2017-03-23 09:10:46)

46

По теме: в AN4776 есть описание способа генерации сигналов произвольной формы с помощью ШИМ, для чего и используется DMA burst, причем в этом примере описано как менять не только скважность при постоянной частоте, но и частоту ШИМ, т.е. DMA burst позволяет синхронно обновлять оба регистра TIMx_ARR и TIMx_CCR (период и скважность).

AN4776 Arbitrary waveform generation using timer DMA-burst feature

5.3  Application example: arbitrary waveform generation using
timer DMA-burst feature

This example demonstrates one possible usage of the STM32 timer peripherals to generate an arbitrary waveform signal without CPU overhead. This example aims also to demystify the DMA-burst timer feature which is the keystone for this example.

PS: Алексей, тебе плюсик. :)

Ребята много спорили, а dosikus молодец, в STM32 TIM1 или TIM8 PWM mode c DMA burst специально заточен для генераторов сигналов произвольной формы, причем аппаратно - без участия ядра микроконтроллера (подробнее в AN4776).

В примере из AN4776 с помощью DMA burst происходит синхронное обновление нескольких регистров сразу, например TIM1_ARR (период ШИМ) и TIM1_CCR1 (скважность). Но эти два регистра 16-ти битные, поэтому пропускной способности шины AHB (32 бита) как раз хватает.

В примере dosikus-a DMA burst использовался для генерации 4-х сигналов произвольной формы, но при этом частота ШИМ была фиксированной TIM_ARR не менялся, а менялись сразу 4 регистра TIM_CCR1, TIM_CCR2, TIM_CCR3, TIM_CCR4, но в этих 16-ти разрядных регистрах менялся только 1 байт, т.е. за один раз менялись 4 байта - те же 32 бита AHB.

Вот я не понял, а годится ли DMA burst для многоканальной генерации сигналов произвольной формы? Т.е. менять в регистрах CCRx сразу 4*16 бит, может, шина AHB умеет это делать за два раза?

Отредактировано Pridnya (2017-03-23 09:33:16)

47

Все может. Кстати напомни ИМ ТАМ что на первой странице 4х фазный выхлоп с Center aligned mode ...

48

Вот тебе 3х фазный синус на 256 выборок с амплитудой до 0xFFFF. Естественно частота гикнулась до минимума и даже на разогнанном F072 до 72MHz  ВСЕГО 4Hz.
У тебя TIM1 тарахтит 168MHz ...

Как и в прошлый раз на картинко - 1-2 канал, 1-3 канал и FFT .
Конденсаторы увеличил до 2uF...

http://s019.radikal.ru/i617/1703/4d/9461f9e88c5d.jpg

http://s014.radikal.ru/i326/1703/0d/ca95b6486266.jpg

http://s46.radikal.ru/i111/1703/9d/855932d5ca72.jpg

Pridnya написал(а):

Но эти два регистра 16-ти битные, поэтому пропускной способности шины AHB (32 бита) как раз хватает.

Че ты заладил , на это пусть "изгонятельбесов" дро**т , так и не поняв сути...

49

Pridnya написал(а):

По теме: в AN4776 есть описание способа генерации сигналов произвольной формы с помощью ШИМ, для чего и используется DMA burst, причем в этом примере описано как менять не только скважность при постоянной частоте, но и частоту ШИМ, т.е. DMA burst позволяет синхронно обновлять оба регистра TIMx_ARR и TIMx_CCR (период и скважность).

Естественно . Стас  давным-давно DMA burst для  красивых  реализаций использует.
А если перестать  упорото мыслить асмом, все заколосится ...

50

dosikus написал(а):

Pridnya написал(а):

    По теме: в AN4776 есть описание способа генерации сигналов произвольной формы с помощью ШИМ, для чего и используется DMA burst, причем в этом примере описано как менять не только скважность при постоянной частоте, но и частоту ШИМ, т.е. DMA burst позволяет синхронно обновлять оба регистра TIMx_ARR и TIMx_CCR (период и скважность).

Естественно . Стас  давным-давно DMA burst для  красивых  реализаций использует.
А если перестать  упорото мыслить асмом, все заколосится ...

Это мы с тобой уже почти трехфазный инвертор сделали. :)

Теперь вопрос в схемотехнику упирается:

Как из однополярного ШИМа сделать двуполярный синус и попроще.
На мысль приходит мост и драйвер. Но нужно, чтобы весь мост управлялся с одного канала ШИМ, не хочется использовать два канала ШИМ (и dead time) для управления одним мостом. Хочется как-то попроще, чтобы этот драйвер сам dead time формировал с нашего ШИМа.
http://sf.uploads.ru/t/dXthn.png
http://s7.uploads.ru/t/lF2bA.png

Отредактировано Pridnya (2017-03-23 14:56:29)

51

Спасибо огромное vt340 за тулзу!!!!

Залил таблицу с амплитудой до 0x2FF на 256 выборок :

http://s018.radikal.ru/i517/1703/84/5290f82522d6.jpg

http://s61.radikal.ru/i174/1703/28/b1afc8740799.jpg

http://s015.radikal.ru/i330/1703/4f/150195f60c87.jpg

http://s020.radikal.ru/i714/1703/2c/bc9bae32845d.jpg

52

Pridnya написал(а):

Но нужно, чтобы весь мост управлялся с одного канала ШИМ, не хочется использовать два канала ШИМ (и dead time) для управления одним мостом. Хочется как-то попроще, чтобы этот драйвер сам dead time формировал с нашего ШИМа.

А когда RM ЧИТАТЬ НАЧНЕШЬ ?
Каналы имеют комплементарные выхлопы с dead time, ищи TIMx-CHN.
Там и break есть...

53

dosikus написал(а):

Pridnya написал(а):

    Но нужно, чтобы весь мост управлялся с одного канала ШИМ, не хочется использовать два канала ШИМ (и dead time) для управления одним мостом. Хочется как-то попроще, чтобы этот драйвер сам dead time формировал с нашего ШИМа.

А когда RM ЧИТАТЬ НАЧНЕШЬ ?
Каналы имеют комплементарные выхлопы с dead time, ищи TIMx-CHN.
Там и break есть...

Я ж на TIM2 сделал (TIM2/TIM5), а у него нет комплементарных выходов, dead time и break. Нужно переделать на TIM1 (TIM1/TIM8) -  у этих всё есть. :)

54

Pridnya написал(а):

Как из однополярного ШИМа сделать двуполярный синус и попроще.

Я чегой-то не пойму , тебе же 3х фазный результат нужен на 3х же фазную нагрузку?
Добавляй к своему рисунку еще 2 ключа, выбирай TIM1 или TIM8, конфигури  3 канала с комплементарным выхлопом и дидтайм.
Добавляй драйверы ключей.
Или ты у меня разрешения спрашиваешь? :D

Кстати вот в тему - http://d1.amobbs.com/bbs_upload782111/f … 265522.pdf

55

dosikus написал(а):

Спасибо огромное vt340 за тулзу

Ну, если оно работает, давай тогда расшарим, может ещё кому пригодится )
Маленький скриптик для генерации таблицы синусов - https://yadi.sk/d/naqKh4e03EDEJU/Tcl?force_show=1
http://s9.uploads.ru/gzCms.png

Код:
0x80, 0xFF, 0x80, 0x00, 
0x83, 0xFF, 0x7C, 0x00, 
0x86, 0xFF, 0x79, 0x00, 
0x89, 0xFF, 0x76, 0x00, 
0x8C, 0xFE, 0x73, 0x01, 
0x8F, 0xFE, 0x70, 0x01, 
...

56

vt340 написал(а):

dosikus написал(а):

    Спасибо огромное vt340 за тулзу

Ну, если оно работает, давай тогда расшарим, может ещё кому пригодится )
Маленький скриптик для генерации таблицы синусов - https://yadi.sk/d/naqKh4e03EDEJU/Tcl?force_show=1
...

Прикольно. Сохранил себе три файла с Яндекс-диска. Никогда не пользовался TCL.
Если что-то нужно сгенерить, то обычно пишу программку на Си для командной строки, запускаю и создаю текстовый файл.

PS: Там у вас странная кнопка есть "Скачать", по которой скачивается весь форум mcu.goodboard.ru. Я нажал - начало качаться 35 мегабайт подождал и выключил.
http://s3.uploads.ru/t/I1bYZ.png

Отредактировано Pridnya (2017-03-24 12:22:15)

57

Pridnya написал(а):

странная кнопка есть "Скачать", по которой скачивается весь форум mcu.goodboard.ru

Нет, это просто всякие разные файлы к моим топикам, а локальные копии форума там в Local_Copy, они пока маленькие - по полмега

58

Доброго времени суток.
МК STM32f103.
Объясните, пожалуйста, как настроить TIM1->DCR.
Если честно, по RM непонятно, за что конкретно отвечают эти 2 регистра - DCR и DMAR. Хочется разобраться.

59

Кстати, о тригонометрии. Я себе набросал простой генератор табличных синусов, чтобы на микроконтроллерах при необходимости считать. При компиляции получаем бинарник gentab, который позволяет сгенерировать таблицу синусов с заданной точностью (числа с фиксированной точностью).
Заменяем соответствующие данные в файле calcsin.c и включаем его к себе в дерево исходников под МК.
Макрос ONE_FIXPT - положение десятичной точки (если он равен 100, то у нас 2 числа после точки и т.д.).
SZ - длина таблиц.
TYPE - тип данных (по умолчанию - int32_t).
_PI, _2PI и _PI_2 — соответствующие макросы в целых с заданной точностью.
Функции calcsin, calccos и calctan вычисляют соответствующие тригонометрические функции. Основная из них ­— calcsin.
Уменьшить размер таблицы и упростить вычисление удалось благодаря тому, что я использую не равномерную сетку по углу, а сетку с заданной точностью для линейной интерполяции. Нужная пара данных из таблицы выбирается обычным бинарным поиском.


Вы здесь » Микроконтроллеры » Архив » STM32 DMA burst