частотомер на GD32f303c
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
Из оригинальной библиотеки.
/* FPU settings 303*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
Советы из инета.
Нужно стараться, чтобы все переменные были float а не double. По умолчанию компилятор делает double, и в этом случае сопроцессор особо не помогает.
В прерываниях плавучку не использовать (либо озаботиться сохранением плавучего контекста).
после инициализации переменной нужно букву f ставить.
Либо указать ключ -fsingle-precision-constant (это для gcc). Тогда все константы по умолчанию будут float, а не double.
По умолчанию константы с плавающей точкой считаются double. А если в выражении хоть один операнд является double, то все другие операнды преобразуются в double, и вычисления производятся в double. Так работает си.
/* FPU settings 303*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
Советы из инета.
Нужно стараться, чтобы все переменные были float а не double. По умолчанию компилятор делает double, и в этом случае сопроцессор особо не помогает.
В прерываниях плавучку не использовать (либо озаботиться сохранением плавучего контекста).
после инициализации переменной нужно букву f ставить.
Либо указать ключ -fsingle-precision-constant (это для gcc). Тогда все константы по умолчанию будут float, а не double.
По умолчанию константы с плавающей точкой считаются double. А если в выражении хоть один операнд является double, то все другие операнды преобразуются в double, и вычисления производятся в double. Так работает си.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: частотомер на GD32f303c
Andrey_B, хочу сделать конвейер на GD. Или чего-то не понимаю, или куб не использует своими настройками возможности таймеров. Куб не позволяет настроить таймер так, что бы тактировался от своего канала захвата и захват работал. Таймер тактируется от канала, но захват не работает. Если выставить TI1_ED(по двум фронтам), то работает, а от TI1FP1 не хочет.
Если вручную подшаманить, то работает. Это недоработка куба или моя?
Эти строчки приходится каждый раз добавлять вручную.
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
Если вручную подшаманить, то работает. Это недоработка куба или моя?
Эти строчки приходится каждый раз добавлять вручную.
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
Re: частотомер на GD32f303c
linkov1959, да, куб некоторые вещи не позволяет сделать. Видимо разработчики считают, что чрезмерная гибкость больше навредит. Иногда помогает перейти с HAL на LL. Но частенько "доинициализировать" приходится вручную. Пользоваться функциями куба не только для инициализации, но и для непосредственного управления, считаю вообще нельзя.
Вообще использовать заточенный на STM куб для работы с GD плохая идея. Они всё таки различаются. Сам я с GD не работал, но по опыту работы например с CH32F103C8T6 или CH32V203K8T6, при всей похожести периферии клонов, иногда вылезают ну очень значительные отличия. Так что только даташит.
ЗЫ: что касается плавучки и быстродействия. Многие вещи, которые на первый взгляд скрыты, например сохранение и восстановления контекста при вызове обработчика прерывания с использованием плавучих переменных или без них, тоже по разному будет сказываться на производительности в целом. Или интенсивное использование ПДП (DMA), которое вроде как идёт в фоне, тоже может сильно влиять на производительность.
Вообще использовать заточенный на STM куб для работы с GD плохая идея. Они всё таки различаются. Сам я с GD не работал, но по опыту работы например с CH32F103C8T6 или CH32V203K8T6, при всей похожести периферии клонов, иногда вылезают ну очень значительные отличия. Так что только даташит.
ЗЫ: что касается плавучки и быстродействия. Многие вещи, которые на первый взгляд скрыты, например сохранение и восстановления контекста при вызове обработчика прерывания с использованием плавучих переменных или без них, тоже по разному будет сказываться на производительности в целом. Или интенсивное использование ПДП (DMA), которое вроде как идёт в фоне, тоже может сильно влиять на производительность.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: частотомер на GD32f303c
Andrey_B, по прерываниям есть вопросы. Оказалось, что мой конвейер на stm401 работает не так, как я задумал. Может, потому и работает.
Я там разрешаю прерывания по захвату NVIC_EnableIRQ(50), но по таймингу вижу, что прерывание срабатывает сразу не дожидаясь захвата. Вроде за это какой-то бит отвечает и его надо сбрасывать, неужели куб этого не делает?
- КРАМ
- Друг Кота
- Сообщения: 25163
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: частотомер на GD32f303c
[uquote="Andrey_B",url="/forum/viewtopic.php?p=4507946#p4507946"]интенсивное использование ПДП (DMA), которое вроде как идёт в фоне, тоже может сильно влиять на производительность.[/uquote]
Не просто влиять, а вплоть до почти полной блокировки исполнения...
Попробуйте снять данные с конвейерного АЦП через GPIO и DMA на частоте вчетверо ниже частоты ядра...

Не просто влиять, а вплоть до почти полной блокировки исполнения...
Попробуйте снять данные с конвейерного АЦП через GPIO и DMA на частоте вчетверо ниже частоты ядра...
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
Запаял GD32F407VG (360 руб) на переходник (100 руб)
Залил blink кокосом как для stm32f407ve.
Запустился на частотах по Кубу.
с кварцем 20 мгц коэф. /2 *78 /2=390мгц
с ТСХО 25 мгц /2 *63 /2=393мгц
периферию не смотрел.
Плюсы
подключается FPU
таймера 8+2(32 бит) +2+2
ADC -3 штуки
флеш 512 кб. с 0-ws.
рам 192 кб.
По цене оптимально GD32F407VE -260 руб с доставкой
BOOT0 нужно садить на землю
Прошивка и отладка в кокосе через порт SW без отключения от компа и всяких перемычек.
Через ST LINK v2 , с него и питание 3,3в
Залил blink кокосом как для stm32f407ve.
Запустился на частотах по Кубу.
с кварцем 20 мгц коэф. /2 *78 /2=390мгц
с ТСХО 25 мгц /2 *63 /2=393мгц
периферию не смотрел.
Плюсы
подключается FPU
таймера 8+2(32 бит) +2+2
ADC -3 штуки
флеш 512 кб. с 0-ws.
рам 192 кб.
По цене оптимально GD32F407VE -260 руб с доставкой
BOOT0 нужно садить на землю
Прошивка и отладка в кокосе через порт SW без отключения от компа и всяких перемычек.
Через ST LINK v2 , с него и питание 3,3в
Последний раз редактировалось Игорь2111 Чт ноя 30, 2023 15:36:43, всего редактировалось 3 раза.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: частотомер на GD32f303c
Игорь2111, супер! Где брал?
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
на AliExpress
https://sl.aliexpress.ru/p?key=89LvU77
Периферию надо будет проверить на макс. тактовую.
https://sl.aliexpress.ru/p?key=89LvU77
Периферию надо будет проверить на макс. тактовую.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: частотомер на GD32f303c
//По цене оптимально GD32F407VE -260 руб с доставкой//
Заказал за 150р с доставкой.
https://www.aliexpress.com/item/1005005 ... 1802hsc9Cx
Заказал за 150р с доставкой.
https://www.aliexpress.com/item/1005005 ... 1802hsc9Cx
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
По частоте ядра GD32F407 стабильно работает только до 330-340 мгц
С ТСХО 25 мгц коф /2 *54 /2 =337 мгц
С ТСХО 25 мгц коф /2 *54 /2 =337 мгц
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
Нестабильность была из-за питания.
Внутренний стаб.ST-LINK не тянул.
При 400 мгц потребление 175 ма.
Норма при 168 мгц 85 ма.
Поставил внешний 1117-33.
При 400 мгц тактовой время расчета синуса без FPU по ранее описанному алгоритму 2,7 мксек (1118 тактов)
с FPU 0.7 мксек. (291 такт системной)
Прилично теплый.
Режим тяжелый придется или клеить радиатор или снижать частоту.
без FPU
https://img.radiokot.ru/files/149432/3b7spfoe08.jpg
c FPU
https://img.radiokot.ru/files/149432/3b7sqcymkk.jpg
Добавлено after 5 hours 58 minutes 42 seconds:
В GD32F407 есть строеный режим работы ADC 1,2,3
Интересно что получится при макс.тактовой.
https://img.radiokot.ru/files/149432/3b83m95zcc.jpg
Внутренний стаб.ST-LINK не тянул.
При 400 мгц потребление 175 ма.
Норма при 168 мгц 85 ма.
Поставил внешний 1117-33.
При 400 мгц тактовой время расчета синуса без FPU по ранее описанному алгоритму 2,7 мксек (1118 тактов)
с FPU 0.7 мксек. (291 такт системной)
Прилично теплый.
Режим тяжелый придется или клеить радиатор или снижать частоту.
без FPU
https://img.radiokot.ru/files/149432/3b7spfoe08.jpg
c FPU
https://img.radiokot.ru/files/149432/3b7sqcymkk.jpg
Добавлено after 5 hours 58 minutes 42 seconds:
В GD32F407 есть строеный режим работы ADC 1,2,3
Интересно что получится при макс.тактовой.
https://img.radiokot.ru/files/149432/3b83m95zcc.jpg
- КРАМ
- Друг Кота
- Сообщения: 25163
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: частотомер на GD32f303c
В очередной раз. Дело не в интерливе. Дело в совершенно аналоговой схеме АЦП. Сигнал еще нужно захватить, прежде чем запустить преобразование. Ну и само преобразование - это тоже глубоко аналоговый процесс с балансировкой заряда... Его разгон приводит к потере эффективной разрядности.
На выходе быстро растет шум.
На выходе быстро растет шум.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: частотомер на GD32f303c
КРАМ, Всё просто. В кубе выставляется 3 ADC на общий канал, выбирается режим интерлив, разрядность, настраивается DMA и массив из ОЗУ выводится на экран. Подаем тестовый сигнал и гоним тактовую ADC , наблюдая картинку. Полутонов не замечал, там резкий срыв.
- КРАМ
- Друг Кота
- Сообщения: 25163
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: частотомер на GD32f303c
[uquote="linkov1959",url="/forum/viewtopic.php?p=4513658#p4513658"]Полутонов не замечал, там резкий срыв.[/uquote]
Вы несете ахинею, извините.
Что вы называете "тестовым сигналом"?
Как вы измеряете ENOB?
Срыв - это когда перестает работать автомат последовательных приближений - чисто цифровая схема.
Но далеко задолго до этого срыва от исходных 12 разрядов мало что остается...
Откройте даташит на любой SAR ADC и узнайте для себя его основные параметры. И лишь потом экспериментируйте со встроенным АЦП.
Интерлив лишь позволяет получить чередование АЦП в автоматическом режиме, тем самым кратно увеличивая скорость. Но он никак не влияет на скорость отдельных ядер АЦП.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4513658#p4513658"]массив из ОЗУ выводится на экран.[/uquote]
Я должен вас огорчить. Скорость сканирования памяти с помощью JTAG столь низка, что вашим "методом" ничего определить невозможно.
Вы несете ахинею, извините.
Что вы называете "тестовым сигналом"?
Как вы измеряете ENOB?
Срыв - это когда перестает работать автомат последовательных приближений - чисто цифровая схема.
Но далеко задолго до этого срыва от исходных 12 разрядов мало что остается...
Откройте даташит на любой SAR ADC и узнайте для себя его основные параметры. И лишь потом экспериментируйте со встроенным АЦП.
Интерлив лишь позволяет получить чередование АЦП в автоматическом режиме, тем самым кратно увеличивая скорость. Но он никак не влияет на скорость отдельных ядер АЦП.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4513658#p4513658"]массив из ОЗУ выводится на экран.[/uquote]
Я должен вас огорчить. Скорость сканирования памяти с помощью JTAG столь низка, что вашим "методом" ничего определить невозможно.
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
Попробуем , может и получится. Любителям много не надо
Увидеть на экране показометра-частомера TFT-LCD 128*160 чистый меандр на частоте желательно 10 мгц. без внешней обвязки. (тестовый сигнал)
При этом не спалив МК из-за большой потребляемой мощности.
Это и будет проверкой всей периферии МК. (А как это все будет реализовано абсолютно неважно)
Увидеть на экране показометра-частомера TFT-LCD 128*160 чистый меандр на частоте желательно 10 мгц. без внешней обвязки. (тестовый сигнал)
При этом не спалив МК из-за большой потребляемой мощности.
Это и будет проверкой всей периферии МК. (А как это все будет реализовано абсолютно неважно)
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: частотомер на GD32f303c
Игорь2111, 15 Мсэмплов минимум должны получить, это сносный меандр 1 Мгц, но можно помечтать о 30 Мсэмплах.
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
На макетнойй плате с GD32F303CC можно сделать простой генератор синуса
с помощью 12 бит DAC (pin A4) на фиксированную частоту.
Первый способ рассчет таблицы синуса в оперативке и вывод в DAC в цикле for()
для частоты 775 гц 4631 точка на период синуса.
+-1 точка +-0,2 гц
Добавлено after 6 minutes 51 second:
Второй способ
Предварительный расчет таблицы одного периода синуса в оперативке и
вывод по переполнению таймера через DMA в DAC
для 775 гц таблица 20071 точка
Частота меняется изменением количества точек
+-1точка +-0,1 гц
Собирается,прошивается и отлаживается в Кокосе под видом stm32f103RC
Бюджет макетка-350 руб, програматор-120 руб, усилок D класс 20 Вт на tpa3116 собранный 350 руб
с помощью 12 бит DAC (pin A4) на фиксированную частоту.
Первый способ рассчет таблицы синуса в оперативке и вывод в DAC в цикле for()
для частоты 775 гц 4631 точка на период синуса.
+-1 точка +-0,2 гц
Добавлено after 6 minutes 51 second:
Второй способ
Предварительный расчет таблицы одного периода синуса в оперативке и
вывод по переполнению таймера через DMA в DAC
для 775 гц таблица 20071 точка
Частота меняется изменением количества точек
+-1точка +-0,1 гц
Собирается,прошивается и отлаживается в Кокосе под видом stm32f103RC
Бюджет макетка-350 руб, програматор-120 руб, усилок D класс 20 Вт на tpa3116 собранный 350 руб
- Вложения
-
- 303 синус табл 775 гц +DMA+TIM4+.rar
- синус таймер+DMA
- (2.96 КБ) 187 скачиваний
-
- 303 синус табл 775 гц +.rar
- вывод в цикле
- (2.29 КБ) 252 скачивания
Последний раз редактировалось Игорь2111 Вс фев 11, 2024 03:51:59, всего редактировалось 1 раз.
- КРАМ
- Друг Кота
- Сообщения: 25163
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: частотомер на GD32f303c
Оба метода ничем друг от друга не отличаются и для формирования сетки 0,1 Гц являются отвратительными.
Причин две.
1. Сетка будет принципиально нелинейной.
2. Безумное, ни на чем не основанное количество отсчетов.
Мелкий шаг делается с помощью DDS. А DDS - это скользящая фаза.
Если не устраивает полученный джиттер, то делают дополнительно следящий фильтр.
Причин две.
1. Сетка будет принципиально нелинейной.
2. Безумное, ни на чем не основанное количество отсчетов.
Мелкий шаг делается с помощью DDS. А DDS - это скользящая фаза.
Если не устраивает полученный джиттер, то делают дополнительно следящий фильтр.
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: частотомер на GD32f303c
Благодарю, будем учиться дальше
Добавлено after 9 hours 11 minutes 28 seconds:
По количеству точек
Читал по теории для КНИ синуса половина младшего разряда DAC 2-n разрядов количество точек на период должно быть 2-n +3.
Т.е для 12 разрядного 32568.
И поразила низкая частота вывода массива в цикле for (~100 тактов)
Добавлено after 9 hours 11 minutes 28 seconds:
По количеству точек
Читал по теории для КНИ синуса половина младшего разряда DAC 2-n разрядов количество точек на период должно быть 2-n +3.
Т.е для 12 разрядного 32568.
И поразила низкая частота вывода массива в цикле for (~100 тактов)