Низкочастотная шаблон

Дрбанана
Пт 22 апреля 2016 г., 11:23
Я хочу попробовать Dev STM32F103C8T6 ? Мне нужно создать очень точный генератор функций. И аппаратный ШИМ будет лучшим. Возможно ли, с STM32F103C8T6 с Arduino ?

Ахулл
Пт 22 апреля 2016 г., 11:29
Вам нужно было бы проверить документацию ST, чтобы увидеть, насколько низкая может идти частота PM Ваш PIN (ы) GPIO со скоростью, который вы хотите. Бит -битвенный шаблон должен быть довольно прост, чтобы настроить, используя этот трюк. Преимущество использования прерывания и счетчика состоит в том, что вы можете настроить такие вещи, как маркировать пространственные соотношения и синхронизация/смещение фазы между булавками с довольно высокой степенью точности, без завязывания процессора.

Mrburnette
Пт 22 апреля 2016 г. 13:15
@Drbanana: добро пожаловать.

Вы используете термин «очень точный» заставляет меня думать, что Arduino не является жизнеспособным ядром. Такие вещи действительно должны быть реализованы в C или ASM и за пределами среды, которая будет создавать прерывание на уровне системы для таймера micros (). Таким образом, с перерывами в 1 США вам нужно определить, можете ли вы работать в (фазе) дрожате.

Лучшим подходом, IMO, был бы GPS -приемник с выходной квадратной волной 1 PPS. Джиттер в настоящее время находится в низком 2-значном диапазоне NS. Запустите ваши аппаратные перегородки (этап фазового блокировки здесь является опцией) с лидера/следа, и вы будете относительно недорогим подходом, не сборный посуду, для создания достойной переменной ширины импульса; Затем вы можете использовать аппаратные часы для генерации прерываний UC для управления захватом, отображением и другими функциями более высокого уровня.

Есть также довольно недорогие выделенные чипы для DDS в наши дни... Но я лично не играл в этой песочнице.


Луча

Дрбанана
Пт 22 апреля 2016 г. 13:20
Вот почему я хочу использовать аппаратный ШИМ, было бы здорово, если бы STM поддерживает его.

Mrburnette
Пт 22 апреля 2016 г., 13:23
Дрбанана писала:Вот почему я хочу использовать аппаратный ШИМ, было бы здорово, если бы STM поддерживает его.

Martinayotte
Пт 22 апреля 2016 г., 13:29
Может быть, PCA9685 может удовлетворить вашу потребность ?
Частота, используемая для управления ШИМ в PCA9685, регулируется от примерно 24 Гц до 1526 Гц

Mrburnette
Пт 22 апреля 2016 г., 13:45
Martinayotte написал:Может быть, PCA9685 может удовлетворить вашу потребность ?
Частота, используемая для управления ШИМ в PCA9685, регулируется от примерно 24 Гц до 1526 Гц

Дрбанана
Пт 22 апреля 2016 г. 14:22
Частота не является проблемой на самом деле. Но это ширина импульса, которая высока с частотой.

Mrburnette
Пт 22 апреля 2016 г. 14:48
Дрбанана писала:Частота не является проблемой на самом деле. Но это ширина импульса, которая высока с частотой.

Вассилис
Пт 22 апреля 2016 г. 15:20
Дрбанана писала:Я хочу попробовать Dev STM32F103C8T6 ? Мне нужно создать очень точный генератор функций. И аппаратный ШИМ будет лучшим. Возможно ли, с STM32F103C8T6 с Arduino ?

Пито
Пт 22 апреля 2016 г., 16:02
Я недавно перепутал PWM на F4 (см http: // www.STM32duino.com/viewtopic.PHP?F = 39&t = 1031 ).
Существует функция, называемая SetPeriod (pwmperiod_in_useconds), которая возвращает значение max_duty. Это максимальное значение важно..
Функция вычисляет внутренние значения для прескалера HW (1..65536), а также значения «timer_overflow», и он устанавливает таймер HW, такой как ваш период PWM как можно лучше.
Например>
maxduty = таймер.SetPeriod (20000);
Устанавливает период ШИМ до 20 мс (SWM FREQ = 50 Гц), и он возвращает, например, MAXDUTY = 64515.
Таким образом, вы можете пойти со своим обязанностями от 0..64515.

F4 только примеры:
pwmwrite (pwm_pin, x); // где 0<= x<= 64515 для периода ШИМ = 20000US (50 Гц)
pwmwrite (pwm_pin, x); // где 0<= x<= 56000 для периода ШИМ = 1000us (1 кГц)
pwmwrite (pwm_pin, x); // где 0<= x<= 16800 для периода ШИМ = 100 кГц)

В F4 в функции SetPeriod () где -то (не где -то, откровенно говоря, есть ошибка с неверным значением clock_per_usecs), поэтому период ШИМ, который я измерял с помощью моего LA, в два раза (половина частоты ШИМ) одного установленного функция SetPeriod..

Имейте в виду максимум зависит от В период ШИМ, так что это не всегда "65535" (т.е. только 16800 для периода ШИМ = 100USECS).

Вот полный источник PWM, который я перепутал для F407Disco, он может работать тоже с F1..
http: // www.STM32duino.com/viewtopic.PHP ... 001#P11792

Rogerclark
Пт 22 апреля 2016 г., 22:29
Когда у людей есть спецификации, которые говорят «очень точные», это заставляет меня задуматься, почему они используют систему Arduino.

ИМХО он не предназначен для точности. Вы можете получить это точное, но я бы предположил, что это не точное.

Что касается точности, я подозреваю, что вам было бы лучше использовать STMCube для экспорта кода, который просто выполняет функцию, которая вам требуется, и не имеет все, что происходит под капюшоном, который система Arduino скрывает от случайных пользователей.

Или, как предложены несколько человек, используйте отдельный специальный генератор PMW

Дрбанана
Сб 23 апреля 2016 г. 12:31
Или, как предложены несколько человек, используйте отдельный специальный генератор PMW Не могли бы вы назвать некоторых из них ? Предлагаемое имеет только 12 -битное разрешение, так как мое требование находится в микросекундах и миллисекундах.
Нравиться

Период 200000us (5 Гц)
Ширина пульса 900US

250000 период (4 Гц)
Ширина пульса 900US

И вот так. Диапазон может идти от 4 Гц - 100 Гц, а ширина импульса может быть от 900 до 100 мс. Смотрите отношение разницы намного высокое между шириной пульса и периодом. Я думаю, что 12 -битное разрешение не сработает. Даже 16 бит не.

Rogerclark
Сб 23 апреля 2016 г. 1:13
Какая точность вам нужна

эн.глин. 1

Martinayotte
Сб 23 апреля 2016 г. 1:27
Дрбанана писала: Не могли бы вы назвать некоторых из них ? Предлагаемое имеет только 12 -битное разрешение, так как мое требование находится в микросекундах и миллисекундах.

Вассилис
Сб 23 апреля 2016 г. 8:27 утра
Для достижения более низкой частоты (4 Гц) вам необходимо изменить конфигурацию часов, которая предварительно определена в Arduino_stm32 ядро до 72 МГц.
В качестве примера я показываю вам картинку выше из моей конфигурации часов Cubemx.
А Часы таймера APB1 должно быть 0.25 МГц (250 кГц), чтобы получить период 65535. Это дает вам длину периода 262 мс, которая находится близко к 250 мс, которые вы хотите. Небольшая корректировка значения 65535 даст вам точный период 250 мс, который вы хотите.

Я использовал таймер 3, чтобы запустить несколько тестов
htim3.Инициатор.Период = 62500 дает вам длину периода 250 мс = 4 Гц
htim3.Инициатор.Период = 2500 дает вам длину 10 мс = 100 Гц

Как предложили другие люди, вам либо нужно использовать дополнительный чип для этого, либо использовать программное обеспечение Cubemx для написания исходного кода в соответствии с вашими потребностями, потому что, по моему мнению, этот случай - это то, что выходит из пределов Arduino Core.

Пито
Сб 23 апреля 2016 г. 9:59 утра
Excel - твой друг. Вы можете найти функцию setPeriod () в Hardwaretimer.CPP в STM32F1. Так что вы можете легко использовать его в своем коде.
Это то, что вы получаете на основе вычисления, предоставляет SetPeriod ():
F1 PWM.JPG
F1 PWM.JPG (126.28 киб) просмотрено 3802 раз

Дрбанана
Сб 23 апреля 2016 г. 10:26 утра
Самый простой способ был бы FPGA или CPLD. Библиотеки обычно включают все, что вам может понадобиться Что они будут? Google кажется никакой помощи. Не могли бы вы объяснить немного об этих 2.

Спасибо.

PS: NVM, я думаю, что они какое -то компоненты. Получил больше вещей в Google.


Rogerclark
Сб 23 апреля 2016 г., 11:24
Дрбанана писала:Самый простой способ был бы FPGA или CPLD. Библиотеки обычно включают все, что вам может понадобиться Что они будут? Google кажется никакой помощи. Не могли бы вы объяснить немного об этих 2.

Спасибо.

PS: NVM, я думаю, что они какое -то компоненты. Получил больше вещей в Google.

Вассилис
Сб 23 апреля 2016 12:08
Я полностью забыл Timer2 Прескалер : o
Хороший улов Пито!

@Drbanana Какой -то код для работы над #include #include // Allow boards to provide a PLL multiplier. This is useful for // e.g. STM32F100 value line MCUs, which use slower multipliers. // (We're leaving the default to RCC_PLLMUL_9 for now, since that // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL #if F_CPU==72000000 #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 #elif F_CPU==48000000 #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 #endif #endif namespace wirish { namespace priv { static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL}; __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; __weak void board_reset_pll(void) { // TODO } __weak void board_setup_clock_prescalers(void) { rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); rcc_clk_disable(RCC_USB); #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } __weak void board_setup_gpio(void) { gpio_init_all(); } __weak void board_setup_usb(void) { #ifdef SERIAL_USB #ifdef GENERIC_BOOTLOADER //Reset the USB interface on generic boards - developed by Victor PV gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); #endif Serial.begin();// Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility #endif } __weak void series_init(void) { // Initialize AFIO here, too, so peripheral remaps and external // interrupts work out of the box. afio_init(); } } }

Дрбанана
Сб 23 апреля 2016 г. 12:20 вечера
Вы, ребята, все классные. Еще одна вещь, значение 65K используется, так как MAX показывает свой 16 -битный таймер. Я думаю, что у STM32 тоже 32 -битный таймер, так что, если это правда, я не могу его использовать?

Кроме того, FPGA и другой, кажется, еще один потрясающий способ.

Martinayotte
Сб 23 апреля 2016 12:40
Для FPGA есть некоторые Opencores:

http: // opencores.org/project, pwm
http: // opencores.org/project, ptc

Общая реализация VHDL:

https: // eewiki.net/pages/view -страница.актио ... D = 20939345

Для CPLD вот общая идея (хотя только 8 бит):

http: // dangerouryprototypes.com/docs/cpl ... _Генератор

Я сделал такую ​​вещь в прошлом (в 199X), 8 бит, с девчонками и TTLS...

Пито
Сб 23 апреля 2016 г., 17:30
Это тоже работает, используя setPeriod ().
Maple Mini.
SPI.setClockDivider(SPI_CLOCK_DIV32); // 2.25 MHz

Rogerclark
Сб 23 апреля 2016 г., 21:56
Martinayotte написал:Для FPGA есть некоторые Opencores:

http: // opencores.org/project, pwm
http: // opencores.org/project, ptc

Общая реализация VHDL:

https: // eewiki.net/pages/view -страница.актио ... D = 20939345

Для CPLD вот общая идея (хотя только 8 бит):

http: // dangerouryprototypes.com/docs/cpl ... _Генератор

Я сделал такую ​​вещь в прошлом (в 199X), 8 бит, с девчонками и TTLS...

Martinayotte
Солнце 24 апреля 2016 г. 1:25 утра
Привет, Роджер,

Еще в эти дни друзья были заменены девчонками (с предохранителями EEPROM), но, чем CPLD и FPGA заменили их...

Это заставляет меня думать, что я не играл со своим циклоном IV и Spartan6 FPGA с более чем года ...

С тех пор я обновил свою ОС рабочей станции, поэтому мне придется переустановить эти соответствующие IDE, надеясь с небольшими проблемами.

Испытание ? 32 Выходы отдельных ШИМ, доступ к которой доступа к I2C Slave Register Map, Syncrhonized с помощью нулевой перекрестной сети от основной мощности 60 Гц !
Да, 32 канала Dimmers, такие как этот проект 199X, но с FPGA ...

Rogerclark
Солнце 24 апреля 2016 г., 3:29
Привет, Мартин

Я помню, как работал с устройствами GAL, но это было много лет назад :-)

Я на самом деле строю диммер, используя STM32 в данный момент, но не делаю ничего необычного. Просто обнаружите пересечение, затем используйте аппаратный таймер, чтобы задержать триггер.
Итак, у меня есть и нулевой пересечение, и запуск ISR. Я знаю, что если я копаюсь в документах, мне не нужно использовать ISR для нулевого пересечения, я смогу получить один короткий таймер, вызванный нулевым перекрестком.
Но я просто хотел, чтобы что -то работало, и отдельные ISRS легче.

Получение эффективного детектора с пересечением нуля так же сложно, как и программное обеспечение. Мне не нравятся те, которые просто используют 2 больших (1 Вт) резистории, чтобы управлять опто. По мере того, как весь цепь детектора становится горячим. Это также склонно к шипам, пропускает программное обеспечение.

Итак, я использую более сложную схему, которую я нашел в Интернете, используя мост, транзистор, конденсатор и несколько резисторов.
Его использование мощности практически ничего, и он имеет фильтр с низким проходом 3DB при 300 Гц, что помогает подавлять шум

Пито
Солнце 24 апреля 2016 г. 6:36 утра
Вернемся к дизайну высокой точности ШИМ - поскольку OP никогда не слышал о FPGA и CPLD, это для него, так как в беспорядке FPGA CPLD требует определенных знаний в нескольких областях, которыми он еще не обладает. Таким образом, решение состоит в том, чтобы оставаться с MCU и с точностью, как показано в таблице выше. Параллельно он может выяснить, есть ли доступное решение..

Rogerclark
Солнце 24 апреля 2016 г., 22:18
Я только что наткнулся на этот калькулятор таймера (Windows Exe)

http: // libstock.Микро.com/index.PHP?Ур ... калькулятор

Я не пробовал, и я уверен, что вы можете сделать те же калькуляторы в Excel и т. Д.
Но это может быть полезно.