3 фазовая переменная частотная привод VFD с F103

Богданаоан
Ср 16 января 2019 г., 17:04
Всем привет,
Я «играл» со строительством VFD для моей машины с ЧПУ. Я бы изобразил, что спросил... Почему из -за любви к Богу вы бы хотели построить одну из этих вещей, когда они продают за арахис в наши дни. И ответ.. Я получил в свои руки очень причудливый шпиндель, в котором требуется частоты до 1000 Гц, а дешевые диски, которые я вижу в Интернете. Также я как бы хотел использовать это, чтобы учиться и поделиться.
Основная часть, которую я в настоящее время обеспокоен, - это трехфазный синусоидальный генератор волн. Вот что я сделал до сих пор:

Изображение

Я в принципе заставил его работать, используя простую логику и «наивный» код.
Вот код:

PROGMEM const uint16_t Half_Sine[] = { 0, 4, 8, 13, 17, 22, 26, 31, 35, 40, 44, 48, 53, 57, 61, 66, 70, 74, 79, 83, 87, 91, 95,100,104,108,112,116,120,124, 128,131,135,139,143,146,150,154,157,161,164,167,171,174,177,181,184,187,190,193,196,198,201,204,207,209,212,214,217,219, 221,223,226,228,230,232,233,235,237,238,240,242,243,244,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255, 256,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,244,243,242,240,238,237,235,233,232,230,228,226,223, 221,219,217,214,212,209,207,204,201,198,196,193,190,187,184,181,177,174,171,167,164,161,157,154,150,146,143,139,135,131, 128,124,120,116,112,108,104,100, 95, 91, 87, 83, 79, 74, 70, 66, 61, 57, 53, 48, 44, 40, 35, 31, 26, 22, 17, 13, 8, 4 }; int PhaseA_OUT = PA8; // TIM1_CH1 pwm output for phase A sine wave int PhaseA_High_EN = PB10; int PhaseA_Low_EN = PB11; int PhaseA_EN_State = 0; int PhaseB_OUT = PA9; // TIM1_CH2 pwm output for phase B sine wave int PhaseB_High_EN = PB8; int PhaseB_Low_EN = PB9; int PhaseB_EN_State = 0; int PhaseC_OUT = PA10; // TIM1_CH3 pwm output for phase C sine wave int PhaseC_High_EN = PB5; int PhaseC_Low_EN = PB6; int PhaseC_EN_State = 0; int Amplitude_OUT = PA6; // TIM3_CH1 pwm channel for controlling the amplitude of the sinewave by using the sine wave channels as carriers for higher frequency pwm int Amplitude_CTRL = 100; // variable that controls the duty cycle of Amplitude_OUT pin int Frequency_CTRL = 100; // variable that controls the frequency of the sine wave int Array_Limit = 179; int a = 0; int b = 0; int c = 0; int i = 0; // Array Increment int Dead_Band_Delay = 10; HardwareTimer CarrierTimer(1); HardwareTimer AmplitudeTimer(3); void setup() { CarrierTimer.setPrescaleFactor(1); CarrierTimer.setOverflow(256); AmplitudeTimer.setPrescaleFactor(8); AmplitudeTimer.setOverflow(500); pinMode(PhaseA_OUT, PWM); pinMode(PhaseA_High_EN, OUTPUT); pinMode(PhaseA_Low_EN, OUTPUT); pinMode(PhaseB_OUT, PWM); pinMode(PhaseB_High_EN, OUTPUT); pinMode(PhaseB_Low_EN, OUTPUT); pinMode(PhaseC_OUT, PWM); pinMode(PhaseC_High_EN, OUTPUT); pinMode(PhaseC_Low_EN, OUTPUT); pinMode(Amplitude_OUT, PWM); digitalWrite(PhaseA_High_EN, HIGH); digitalWrite(PhaseA_Low_EN, LOW); } void loop() { pwmWrite(Amplitude_OUT, Amplitude_CTRL); if (a < 60) { b = a + 120; } else { b = a - 60; } if (a < 120) { c = a + 60; } else { c = a - 120; } a++; if (a > Array_Limit) { a = 0; digitalWrite(PhaseA_High_EN, (PhaseA_EN_State) ? HIGH : LOW); digitalWrite(PhaseA_Low_EN, (PhaseA_EN_State) ? LOW : HIGH); PhaseA_EN_State = ! PhaseA_EN_State; } if (b == 0) { digitalWrite(PhaseB_High_EN, (PhaseB_EN_State) ? HIGH : LOW); digitalWrite(PhaseB_Low_EN, (PhaseB_EN_State) ? LOW : HIGH); PhaseB_EN_State = ! PhaseB_EN_State; } if (c == 0) { digitalWrite(PhaseC_High_EN, (PhaseC_EN_State) ? HIGH : LOW); digitalWrite(PhaseC_Low_EN, (PhaseC_EN_State) ? LOW : HIGH); PhaseC_EN_State = ! PhaseC_EN_State; } pwmWrite(PhaseC_OUT, Half_Sine[c]); pwmWrite(PhaseA_OUT, Half_Sine[a]); pwmWrite(PhaseB_OUT, Half_Sine[b]); delay_us(Frequency_CTRL); }

Mrburnette
Ср 16 января 2019 г., 17:26
[Богданаоан - Ср 16 января 2019 г., 17:04] - ... Я получил в свои руки очень причудливый шпиндель, в котором требуется частоты до 1000 Гц, а дешевые диски, которые я вижу в Интернете. Также я как бы хотел использовать это, чтобы учиться и поделиться....
Ребята, вы думаете, я смогу получить некоторую помощь в реализации аналогичного решения для F103? Я полагаю, что это то, что плата STM32 не сделала бы ничего, кроме генерации SINE SINE с частотой, определяемой каким -то внешним сигналом или передаваемой через сериал другим MCU.
http: // stm32duino.com/viewtopic.PHP?T = 2351
«TED» построил один фазовый синусоидальный генератор, который достигает 15 кГц с внешней фильтрацией, но многофаза гораздо более сложна и может потребовать такого подхода, как волшебные волны Magic Sine. https: // www.Тинаджа.com/glib/msinprop.PDF

Другие подходы в целом можно найти в Google: https: // www.Google.com/search?q = uc+код ... синус+волны

Луча

Богданаоан
Ср 16 января 2019 г., 19:24
Спасибо, Рэй, я прочитал эти.
Я пытаюсь разместить фотографии прогресса, который я делаю, но я получаю ошибку «Слишком большое изображение». Конечно, изображение до 100 КБ не является большим изображением в наши дни. Я делаю что -то не так?

Рик Кимбалл
Ср 16 января 2019 г., 19:25
[Богданаоан - Ср 16 января 2019 г., 19:24] - Спасибо, Рэй, я прочитал эти.
Я пытаюсь разместить фотографии прогресса, который я делаю, но я получаю ошибку «Слишком большое изображение». Конечно, изображение до 100 КБ не является большим изображением в наши дни. Я делаю что -то не так?
Используйте сайт публикации изображения. Я использую Imgur.компонент.

[Редактировать] Я вижу, что вы использовали сайт с изображением, убедитесь, что вы используете предложенный код встраивания. Посмотрите, что я сделал в вашем первом посте, чтобы исправить изображение.[/редактировать[

Тед
Чт 17 января 2019 г. 18:31
Для синуса
https: // www.STM32duino.com/viewtopic.pH ... 0&начало = 30

Тед
Чт 17 января 2019 г. 18:46
для квадрата;
Добавить еще 1 таймер
12.5 кГц, 90deg HardwareTimer pwmtimer3(3); HardwareTimer pwmtimer2(2); void setup() { pinMode(PA7, PWM); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(1); pwmtimer3.setOverflow(5760 - 1); pwmtimer3.setCompare(TIMER_CH2, 2880); pwmtimer3.refresh(); pwmtimer3.resume(); delay(50); // phase shift adjustment pinMode(PA3, PWM); pwmtimer2.pause(); pwmtimer2.setPrescaleFactor(1); pwmtimer2.setOverflow(5760- 1); pwmtimer2.setCompare(TIMER_CH4, 2880); pwmtimer2.refresh(); pwmtimer2.resume(); } void loop() { }

Тед
Чт 17 января 2019 г., 19:09
Я вижу, что вы использовали сайт с картинками, убедитесь, что вы используете свой предложенный код встроенного кода. Посмотрите, что я сделал в вашем первом посте, чтобы исправить изображение.[/редактировать[

уменьшить его ниже 50 КБ

Тед
Чт 17 января 2019 г., 19:14
Я думаю, тебе это нужно, я использую их без проблем.
MTD6501C-HC1 3-фазный бесщеточный синусоидальный датчик-датчик

Богданаоан
Пт 18 января 2019 г. 9:30
[Тед - Чт 17 января 2019 г., 19:14] - Я думаю, тебе это нужно, я использую их без проблем.
MTD6501C-HC1 3-фазный бесщеточный синусоидальный датчик-датчик
Спасибо, Тед, это выглядит очень интересно.
Просматривая таблицу чипа, я не могу найти ссылку на выходную частоту 3 -фазового сигнала. Или именно так, что он делает ваш входной сигнал, а фазовый сместирует его на 3 отдельных сигнала на 180 градусов друг от друга, что будет означать, что любой FREQ вы подаете на вход, это также будет выходной сигнал.

Богданаоан
Пт 18 января 2019 г. 9:34
[Тед - Чт 17 января 2019 г. 18:31] - Для синуса
https: // www.STM32duino.com/viewtopic.pH ... 0&начало = 30
Я прочитаю это и постараюсь понять это
Спасибо

Богданаоан
Пт 18 января 2019 г. 9:37 утра
[Рик Кимбалл - Ср 16 января 2019 г., 19:25] -
[Богданаоан - Ср 16 января 2019 г., 19:24] - Спасибо, Рэй, я прочитал эти.
Я пытаюсь разместить фотографии прогресса, который я делаю, но я получаю ошибку «Слишком большое изображение». Конечно, изображение до 100 КБ не является большим изображением в наши дни. Я делаю что -то не так?
Используйте сайт публикации изображения. Я использую Imgur.компонент.

[Редактировать] Я вижу, что вы использовали сайт с изображением, убедитесь, что вы используете предложенный код встраивания. Посмотрите, что я сделал в вашем первом посте, чтобы исправить изображение.[/редактировать[
Это помогает,
Я загрузил несколько фотографий в работе. Полезно/разрешено показывать схемы схемы или я должен придерживаться только бита STM32?

Тед
Пт 18 января 2019 г., 17:02
ИзображениеMTD6501C-HC1

Вам не нужен генератор, он находится внутри чипа, поэтому вы подключаете двигатель прямо к нему. Единственный думает, что вам нужно рассмотреть - насколько велик ваш мотор = ток мотора.

Богданаоан
Пт 18 января 2019 г., 19:24
Из того, что я могу видеть в таблице данных, этот чип генерирует набор из 3 квадратных сигналов, которые 180 -й фазы друг с другом на основе частоты входной квадратной волны. Если это так, это не так уж много пользуется для меня, так как мне нужна модулированная волна грехов, чтобы иметь возможность плавно запустить мой мотор. Мотор, с которым я работаю, - это 3.Мотор AC 8 кВт, но это еще одна проблема, для которой я считаю, что у меня есть решение с точки зрения IGBT и драйверов.
Я прочитаю тему, которую вы связали в одном из ваших предыдущих ответов, так как я думаю, что один из них очень близок к тому, что я пытаюсь достичь

Тед
Пт 18 января 2019 г. 22:38
Таким образом, для этой мощности вам нужен 3 -фазовый инвертор SINE, скорость двигателя, который вы можете регулировать по частоте или с помощью ШИМ, в первом случае вы можете использовать мой синусоидальный генератор, частота меняется по численности здесь <#define образцы 100>, Во втором случае вы можете использовать MTD6501C-HC1, подключенный к небольшим 3-фазовым двигателям, и взять 3 синусоидальных сигнала из булавок 4,5,7 для инвертора, скорость контролируется ШИМ на контакте 10, без небольших двигателей нет сигналов на пинатах 4,5,7.

MTD6501C-HC1
производить 3 синусоидальные волны, сдвинутые на 120 градусов, что то, что я сею на прицеле, на 180 градусов, я думаю, что это что -то еще, вы не можете сдвинуть 3 фазы на 180 градусов, потому что третий будет таким же, как и первое.

https: // www.Амазонка.CA/переменная-плата ... 2793&PSC = 1

Богданаоан
Сб 19 января 2019 г. 10:00 утра
Я действительно думал, что 180deg был немного странным в таблице, но, как вы говорите, может быть, это относится к чему -то другому.
Спасибо за ссылку за инвертор. Это в значительной степени то, что я пытаюсь построить, но на более высокой частоте. Было бы здорово, если бы я мог найти что -то подобное, которое поднимается до 1 кГц.
Я буду играть с вашим генератором синуса в эти выходные. Я уже пробовал это как есть, и получаю полную синусолюбную волну примерно на 7 кГц, но 3 сигнала не на 120 градусов вне фазы, но я уверен. Первое, что я хотел бы сделать, это посмотреть, если вместо полной синусолюбии я могу произвести только половину
Что -то вроде этого
Изображение
и после фильтрации..
Изображение
Затем... Мне придется переключить другую булавку на каждом «нулевом пересечении» синусоидальной волны.
Что -то вроде этого.
Изображение
Я начну работать над этим сегодня, и, надеюсь, я смогу добиться некоторого прогресса, хотя я должен признать, что я немного напугана внешним видом кода вашего синуса -генератора. (Как я уже сказал.. Я еще не совсем там), поэтому любой совет будет очень признателен.

Тед
Сб 19 января 2019 12:52
Не забывайте упомянутый генератор квадратных волн, он прост и легче принять для ваших потребностей, используя фильтр Max 7410, вы получите хороший синус, пример, как изменить его с ним, так что вы, чтобы применить этот метод для линии переполнения, .......
ViewTopic.PHP?T = 3752
Вам нужно создать алгоритм задержки, потому что он зависит от частоты.

Тед
Сб 19 января 2019 12:56
[Богданаоан - Сб 19 января 2019 г. 10:00] -
Что -то вроде этого.
На самом деле с Max 7410 вы в порядке с любой формой сигналов, просто сдвинули 120 градусов

Богданаоан
Сб 19 января 2019 г. 13:20
Простой квадратный генератор волн не будет работать. Это должен быть модулированный синус. Я показываю только отфильтрованный выход для простоты объяснения и проверить качество синуса, но на самом деле наличие аналоговой синусоидальной волны, подобной фильтрованной, не полезна, так как я должен передать это с помощью гальванического изоляционного барьера и восстановления его водить набор IGBT. Я сделал всю эту работу на своем этапе концепции, но теперь я думаю, что использование реализации DMA, как и ваша, я могу получить максимальную частоту 1 кГц, мне нужно.

Это в конечном итоге то, что я ищу:
Изображение

Два сигнала по сути являются положительными и отрицательными половинками синусоидальной волны. Я получил их, переключив дополнительный штифт в начале каждого прохода через массив «Половина синушни» и передавая его с помощью сигнала из одного из каналов через некоторые логические ворота, как я показал в своем первоначальном посте.

Я пытаюсь понять код в вашем приложении SINE и у меня есть много для чтения, прежде чем я смогу что -нибудь сделать, но было бы полезно, если бы вы могли объяснить конфигурацию в своем коде ниже
timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, PIN_MAP[out1].timer_channel); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0);

Тед
Сб 19 января 2019 г. 13:46
Вы упускают из виду функцию Max = очень хороший фильтр,..............................
Код был собран с использованием существующих программ, и я не прошел подробности.
В моей программе более низкая частота = более высокое качество синуса. Для 7200 Гц у вас есть 100 образцов для 720 Гц 1000 образцов для 360 Гц 2000. Для гальванической изоляции используйте OptoCoupler, потому что его трудно найти линейный, используйте фильтр после изоляции.

Rogerclark
Сб 19 января 2019 г. 20:44
Если ваша основная цель - построить 3 -фазовый генератор частот переменной, вам было бы лучше, используя генератор часов SI5351, чтобы фактически генерировать 3 синусоидальные волны

SI5351 - это IC -генератор часов с 3 выходами, но он генерирует квадратные волны.

Однако некоторая простая аналоговая фильтрация даст достаточно точную, поскольку волна.

Вам по -прежнему понадобится микроконтроллер для настройки и управления SI5351, но основная рабочая нагрузка будет удалена из микроконтроллера

PS SI5351 Модули доступны менее чем за 10 долларов из таких мест, как Aliexpress и даже Adafruit, продают их (но не так дешево)

Если ты не ДОН’Не хочу отфильтровать квадратные волны с Si5351, вы можете использовать 3 модуля AD9850, но они намного дороже, и вам придется выяснить, как почувствовать мастер -часы от одного из модулей в другой, чтобы они, чтобы они были все в фазе

Богданаоан
Сб 19 января 2019 г., 21:22
Спасибо, Роджер,
Проблема с любым видом генератора, который в конечном итоге дает мне аналоговую синусоидлене Синусоидальная волна, которая может быть передана через изоляционный барьер и в водителю для IGBT или, возможно, в MOSFET, так что, на стороне высокого напряжения/питания, если мы установим фильтр с низким проходом высокого напряжения, мы приближаемся к истинной синусоидальной волне. При таком роде напряжений очень важно, чтобы синусоидальная волна была максимально близка к истине, в противном случае будут огромные потери и моторные проблемы. Я изучил некоторые отдельные чипы, подобные тем, которые вы предлагаете ШИОм.

Я весь день работал над этим и сумел добиться некоторого прогресса.

Вот код до сих пор: #include PROGMEM const uint16_t Half_Sine_A[] = { 0 , 26, 53, 80, 107, 133, 160, 186, 212, 239, 265, 290, 316, 341, 366, 391, 416, 440, 464, 488, 512 , 535, 557, 579, 601, 623, 644, 665, 685, 704, 724, 742, 760, 778, 795, 812, 828, 843, 858, 873, 886 , 899, 912, 924, 935, 946, 955, 965, 973, 981, 989, 995, 1001, 1006, 1011, 1015, 1018, 1020, 1022, 1023, 1024, 1023, 1022, 1020, 1018, 1015, 1011, 1006, 1001, 995, 989, 981, 973, 965, 955, 946, 935, 924, 912, 899, 886 , 873, 858, 843, 828, 812, 795, 778, 760, 742, 724, 704, 685, 665, 644, 623, 601, 579, 557, 535, 512 , 488, 464, 440, 416, 391, 366, 341, 316, 290, 265, 239, 212, 186, 160, 133, 107, 80, 53, 26, 0 , 26, 53, 80, 107, 133, 160, 186, 212, 239, 265, 290, 316, 341, 366, 391, 416, 440, 464, 488, 512 , 535, 557, 579, 601, 623, 644, 665, 685, 704, 724, 742, 760, 778, 795, 812, 828, 843, 858, 873, 886 , 899, 912, 924, 935, 946, 955, 965, 973, 981, 989, 995, 1001, 1006, 1011, 1015, 1018, 1020, 1022, 1023, 1024, 1023, 1022, 1020, 1018, 1015, 1011, 1006, 1001, 995, 989, 981, 973, 965, 955, 946, 935, 924, 912, 899, 886 , 873, 858, 843, 828, 812, 795, 778, 760, 742, 724, 704, 685, 665, 644, 623, 601, 579, 557, 535, 512 , 488, 464, 440, 416, 391, 366, 341, 316, 290, 265, 239, 212, 186, 160, 133, 107, 80, 53, 26, }; PROGMEM const uint16_t Half_Sine_B[] = { 886 , 899, 912, 924, 935, 946, 955, 965, 973, 981, 989, 995, 1001, 1006, 1011, 1015, 1018, 1020, 1022, 1023, 1024, 1023, 1022, 1020, 1018, 1015, 1011, 1006, 1001, 995, 989, 981, 973, 965, 955, 946, 935, 924, 912, 899, 886 , 873, 858, 843, 828, 812, 795, 778, 760, 742, 724, 704, 685, 665, 644, 623, 601, 579, 557, 535, 512 , 488, 464, 440, 416, 391, 366, 341, 316, 290, 265, 239, 212, 186, 160, 133, 107, 80, 53, 26, 0 , 26, 53, 80, 107, 133, 160, 186, 212, 239, 265, 290, 316, 341, 366, 391, 416, 440, 464, 488, 512 , 535, 557, 579, 601, 623, 644, 665, 685, 704, 724, 742, 760, 778, 795, 812, 828, 843, 858, 873, 886 , 899, 912, 924, 935, 946, 955, 965, 973, 981, 989, 995, 1001, 1006, 1011, 1015, 1018, 1020, 1022, 1023, 1024, 1023, 1022, 1020, 1018, 1015, 1011, 1006, 1001, 995, 989, 981, 973, 965, 955, 946, 935, 924, 912, 899, 886 , 873, 858, 843, 828, 812, 795, 778, 760, 742, 724, 704, 685, 665, 644, 623, 601, 579, 557, 535, 512 , 488, 464, 440, 416, 391, 366, 341, 316, 290, 265, 239, 212, 186, 160, 133, 107, 80, 53, 26, 0 , 26, 53, 80, 107, 133, 160, 186, 212, 239, 265, 290, 316, 341, 366, 391, 416, 440, 464, 488, 512 , 535, 557, 579, 601, 623, 644, 665, 685, 704, 724, 742, 760, 778, 795, 812, 828, 843, 858, 873, }; PROGMEM const uint16_t Half_Sine_C[] = { 886 , 873, 858, 843, 828, 812, 795, 778, 760, 742, 724, 704, 685, 665, 644, 623, 601, 579, 557, 535, 512 , 488, 464, 440, 416, 391, 366, 341, 316, 290, 265, 239, 212, 186, 160, 133, 107, 80, 53, 26, 0 , 26, 53, 80, 107, 133, 160, 186, 212, 239, 265, 290, 316, 341, 366, 391, 416, 440, 464, 488, 512 , 535, 557, 579, 601, 623, 644, 665, 685, 704, 724, 742, 760, 778, 795, 812, 828, 843, 858, 873, 886 , 899, 912, 924, 935, 946, 955, 965, 973, 981, 989, 995, 1001, 1006, 1011, 1015, 1018, 1020, 1022, 1023, 1024, 1023, 1022, 1020, 1018, 1015, 1011, 1006, 1001, 995, 989, 981, 973, 965, 955, 946, 935, 924, 912, 899, 886 , 873, 858, 843, 828, 812, 795, 778, 760, 742, 724, 704, 685, 665, 644, 623, 601, 579, 557, 535, 512 , 488, 464, 440, 416, 391, 366, 341, 316, 290, 265, 239, 212, 186, 160, 133, 107, 80, 53, 26, 0 , 26, 53, 80, 107, 133, 160, 186, 212, 239, 265, 290, 316, 341, 366, 391, 416, 440, 464, 488, 512 , 535, 557, 579, 601, 623, 644, 665, 685, 704, 724, 742, 760, 778, 795, 812, 828, 843, 858, 873, 886 , 899, 912, 924, 935, 946, 955, 965, 973, 981, 989, 995, 1001, 1006, 1011, 1015, 1018, 1020, 1022, 1023, 1024, 1023, 1022, 1020, 1018, 1015, 1011, 1006, 1001, 995, 989, 981, 973, 965, 955, 946, 935, 924, 912, 899, }; int PhaseA_OUT = PA8; // TIM1_CH1 pwm output for phase A sine wave int PhaseB_OUT = PA9; // TIM1_CH2 pwm output for phase B sine wave int PhaseC_OUT = PA10; // TIM1_CH3 pwm output for phase C sine wave HardwareTimer CarrierTimer(1); void setup() { CarrierTimer.setPrescaleFactor(1); CarrierTimer.setOverflow(1024); pinMode(PhaseA_OUT, PWM); pinMode(PB3, OUTPUT); pinMode(PB4, OUTPUT); pinMode(PhaseB_OUT, PWM); pinMode(PB5, OUTPUT); pinMode(PB6, OUTPUT); pinMode(PhaseC_OUT, PWM); pinMode(PB7, OUTPUT); pinMode(PB8, OUTPUT); } void loop() { for(int i=0; i<240; i++){ pwmWrite(PhaseA_OUT, Half_Sine_A[i]); pwmWrite(PhaseB_OUT, Half_Sine_B[i]); pwmWrite(PhaseC_OUT, Half_Sine_C[i]); if(i>=0 & i<120){ GPIOB->regs->ODR |= (1<<3); //Set pin PB3 High GPIOB->regs->ODR &= ~(1<<4); //Set pin PB4 Low }else{ GPIOB->regs->ODR &= ~(1<<3); //Set pin PB3 Low GPIOB->regs->ODR |= (1<<4); //Set pin PB4 High } if(i>=40 & i<160){ GPIOB->regs->ODR |= (1<<5); //Set pin PB5 High GPIOB->regs->ODR &= ~(1<<6); //Set pin PB6 Low }else{ GPIOB->regs->ODR &= ~(1<<5); //Set pin PB5 Low GPIOB->regs->ODR |= (1<<6); //Set pin PB6 High } if(i>=80 & i<200){ GPIOB->regs->ODR |= (1<<7); //Set pin PB7 High GPIOB->regs->ODR &= ~(1<<8); //Set pin PB8 Low }else{ GPIOB->regs->ODR &= ~(1<<7); //Set pin PB7 Low GPIOB->regs->ODR |= (1<<8); //Set pin PB8 High } delay_us(100); } }

Rogerclark
Сб 19 января 2019 11:30
ХОРОШО

Я думал, что вам нужна чистая синусоидальная волна, но если у вас эффективно усилитель мощности класса C или класса D, я вижу, что вам нужен ШИМ синусоидальной волны, а не синусоидальная волна.

Re: изменение частоты

Это не моя область знаний, но я думал, что существуют стандартные методы изменения частоты синусоидальной волны, полученной из волновой таблицы.

Из памяти один из способов состоит в том, чтобы иметь очень подробную таблицу, и в зависимости от требуемой частоты вы пропускаете один или несколько образцов в таблице.
Но я думаю, что это требует, чтобы значение «пропустить» было рассчитано для каждой выборки, потому что его необходимо сразиться, чтобы производить достаточно гранулярности на частотах, которые могут быть произведены.

Я уверен, что кто -то написал библиотеку (на которую они поставили ссылку здесь), которая сделала некоторую умную обработку, чтобы сделать что -то подобное, но только один канал.

Я уверен, что кто -то мог рассказать вам об этой библиотеке (они, возможно, уже опубликовали ссылку)

Тед
Сб 19 января 2019 г. 11:46
Необычный подход и необычные результаты, в моем квадратном генераторе частота может быть изменена этими двумя линиями pwmtimer3.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer3.setOverflow(100-1);

Тед
Сб 19 января 2019 г. 11:59 вечера
У меня есть где -то русская версия для Arduino Uno, которая делает именно то, что вам нужно. Я буду искать это.

Богданаоан
Солнце 20 января 2019 г. 12:33
Здесь может быть некоторая путаница... Так что просто чтобы уточнить
Здесь есть 2 отдельные частоты. Одним из них является частота самого ШИМ, которая установлена ​​этими двумя линиями CarrierTimer.setPrescaleFactor(1); CarrierTimer.setOverflow(1024);

Богданаоан
Солнце 20 января 2019 г. 12:33
[Тед - Сб 19 января 2019 г. 23:59] - У меня есть где -то русская версия для Arduino Uno, которая делает именно то, что вам нужно. Я буду искать это.
Это было бы здорово
Спасибо

Тед
Солнце 20 января 2019 2:01
Я проверил с осциллографом, независимо от чисел в упомянутых линиях, частота одинаковая все время, SINE 80 Гц, квадратный 40 Гц. Для задержки Nanosec Google = наносекунд задерживает Arduino, STM32 наносекунд задержка и аналогичные.

Тед
Солнце 20 января 2019 2:08
Российская версия, используйте Google Translate, если у вас есть проблемы с этим, я могу помочь.
3 сигнала с регулируемым фазовым сдвигом, регулируемой частотой, регулируемым соотношением обязательств.
void setup() { // подпрограмма инициализации // Serial.begin(9600); //для наладки pinMode(2,OUTPUT); //ножка порта фазы A pinMode(3,OUTPUT); //ножка порта фазы B pinMode(4,OUTPUT); //ножка порта фазы C digitalWrite(2,LOW); //снять сигнал с порта digitalWrite(3,LOW); digitalWrite(4,LOW); //Serial.println("Start"); } void loop() { // подпрограмма основного цикла long PhA = 0; //счетчик-таймер фазы A long PhB = 0; //счетчик-таймер фазы B long PhC = 0; //счетчик-таймер фазы C long TAU = 180*3; //полупериод меандра (уменьшать для увеличения частоты) char GoA = 1; //флаг разрешение работы фазы A char GoB = 0; //флаг разрешение работы фазы B char GoC = 0; //флаг разрешение работы фазы C //long TestTime = 0; //для наладки while(1){ //TestTime += 1; //delay(100); //задержка для последовательного порта и ограничения кол-ва данных в маткад //Serial.print(digitalRead(2));Serial.print(","); //Serial.print(digitalRead(3));Serial.print(","); //Serial.print(digitalRead(4));Serial.print(","); //Serial.println(TestTime); //строка в мониторе имеет вид A,B,C,time, где А, B, C - состояние ножки порта if(GoA) PhA += 1; //начать отсчет по фазе if(GoB) PhB += 1; if(GoC) PhC += 1; if(PhA == 1) {digitalWrite(2,HIGH);} //установить импульс в фазе A if(PhB == 1) {digitalWrite(3,HIGH);} //установить импульс в фазе B if(PhC == 1) {digitalWrite(4,HIGH);} //установить импульс в фазе C if(PhA == TAU) {digitalWrite(2,LOW);} //снять импульс в фазе A (вот здесь изменять длину импульса - число вместо TAU) if(PhB == TAU) {digitalWrite(3,LOW);} //снять импульс в фазе B if(PhC == TAU) {digitalWrite(4,LOW);} //снять импульс в фазе C if(PhA == 2*TAU) PhA = 0; //период фазы = начало нового цикла (360 градусов) if(PhB == 2*TAU) PhB = 0; if(PhC == 2*TAU) PhC = 0; if((PhA > 0.667 * TAU) && (GoB == 0)) GoB = 1; //фазовый сдвиг задавать множителем (например 0.167 ~= 30 градусов) if((PhB > 0.667 * TAU) && (GoC == 0)) GoC = 1; } }

Rogerclark
Солнце 20 января 2019 2:15
Предполагая, что код работает вообще...

Глядя на функцию «while» цикла в цикле цикла (), я был удивлен, что у него не было никакого кода, который, по -видимому, измеряет, сколько времени потребуется инструкция по цифру, чтобы выполнить.

Вы можете обнаружить, что он не работает так же на STM32, что и процессор ARM, а компилятор и инструкция по отделению рук (для IF) может вызвать странную проблему времени.

Конечно, DigitalWrite () не так быстр, и вам, вероятно, будет лучше напрямую добраться до реестра вывода GPIO или регистра BSSR.

Тед
Солнце 20 января 2019 2:24
Этот код должен работать до 1.5 кГц, как я помню, авторские претензии на UNO, STM32 намного быстрее.

Богданаоан
Солнце 20 января 2019 г. 9:34
Спасибо
Я сегодня попробую.
Я искал задержку наносекунд для Arduino и STM32, но устроился коротким. Я попробовал ASM volatile («NOP»), но получил ошибку компиляции. Если у вас есть какие -либо предложения, это было бы здорово.

Тед
Солнце 20 января 2019 12:10
Проблема с частотой
Попробуйте использовать 3 разных таймера = отдельно для каждого канала

Богданаоан
Солнце 20 января 2019 г. 18:42
Я в конце веревки с этим.
Это особенно расстраивает из -за того, что я так близок к тому, что мне нужно, и все еще не совсем там.
То, как я вижу это, если бы я мог обновить 2 переменные в основном цикле, не влияя на скорость обработки, у меня это было бы.
Похоже, что UART с DMA - это решение, но я не знаю, как его реализовать.
Можете ли вы указать мне в направлении примера получения Int через сериал, используя DMA?
Всего наилучшего

Тед
Солнце 20 января 2019 г. 20:04
Корректировка фазы в моей программе = эта строка val2[i] = 50 + amp * sin( stp * i + shift * 6.2831 / 360);

Mrburnette
Солнце 20 января 2019 г. 9:43 вечера
[Тед - Солнце 20 января 2019 г. 20:04] - Корректировка фазы в моей программе = эта строка val2[i] = 50 + amp * sin( stp * i + shift * 6.2831 / 360);

Тед
Солнце 20 января 2019 г. 9:50 вечера
Да босс, лол
Я только что вставил одну строку кода

Богданаоан
Пн 21 января 2019 г. 12:03
Тед,
Генератор синусоидальных волн, который вы поделились, не подходит для моего приложения. Это не только 3 сухожилки, которые я после. Если бы это было, я бы просто использовал специализированный чип. То, что необходимо для этого типа дизайна, составляет 9 сигналов, все синхронизировано с точки зрения фазы. 3 из этих сигналов являются 3 фазами самого синуса (и, поскольку последний сигнал должен быть симметричным по всему GND половина синусороны, более полезен, чем полная волна)
так..
Изображение

то, что было бы отрицательной стороной синуса, была перевернута. Таким образом, центр синуса по -прежнему ссылается на землю, и любой контроль амплитуды работает очень хорошо, а также значительно облегчает разделение этого перевернутого сигнала синусоидального типа на положительный половинный синус и отрицательный половину синуса, используя остальные 6 сигналов, которые необходимы 2 для каждого этапа.

Результат после разделения положительной и отрицательной половины синусов.
Изображение
Примечание CH1 перевернута, чтобы лучше показать форму синуса.

Также я не могу видеть способ запрограммировать сигналы включения для драйверов IGBT, которые были бы в идеальной синхронизации с 3 выходными синалами (я думаю, я мог бы сделать это аналогично с некоторыми триггерами и компараторами Schmitt, но это победило бы цель использования MCU вообще)

Я играл со своим кодом и дизайном, чтобы увидеть симметрию и стабильность выходов, но с помощью только 2 -канала и 6 сигналов, чтобы измерить, что мне пришлось наложить несколько изображений в Photoshop, чтобы показать вывод, который я получаю.
что это..
Изображение

Все работает хорошо, за исключением того факта, что максимальная частота, которую я могу получить, выполняя два аналоговых чтения (одно для амплитуды, а одна для FREQ) - 415 Гц. Если я не делаю никакой АЦП, максимальная частота, которую я получаю, 1.19 кГц, где я надеюсь и молюсь, чтобы я мог каким -то образом использовать DMA для UART, чтобы отправить переменные для FREQ и AMPL в STM32.
Я нашел эту статью, но она выше моего уровня понимания
http: // stm32f4-discovery.net/2017/07/st ... Использование-DMA/
Может кто -нибудь, пожалуйста, помогите мне с этим?
Спасибо

Тед
Пн 21 января 2019 г. 1:05
Я не вижу причин, почему моя программа не может быть симметричной, и почему это важно. Таким образом, вы используете эти 6 дополнительных сигналов для создания полного синуса, вопрос в том, почему не использовать полный синус с начала, проблема с симметрией ?
Бесщеточный двигатель Nidec 22H67 имеет 380 Гц при 2400 об / мин. Можно к вашему 415 Гц. Этого достаточно, если только вы не уделяете гораздо более высокий об / мин.

Я не знаком с связанными вещами.
Может перейти к следующему шагу = igbts и провести тесты с двигателем ?

Сравнение NIDEC (квадратная волна) и двигателя, работающего на MTD6501C-HC1 (синусоидальная волна), второй работает намного более плавнее, но это небольшие двигатели, чтобы Nidec работал лучше, я добавил к нему маховик. В моем случае гладкий был основным фактором (менее 0.1deg Vibration), я не думаю, что вам нужна такая точность.

Богданаоан
Пн 21 января 2019 г. 10:24
Таким образом, вы используете эти 6 дополнительных сигналов для создания полного синуса Нет, я нет. 6 сигналов в сочетании с 3 синусоинусными сигналами необходимы для контроля 6 ворот в 3-фазовом H-мостере.
Изображение
Это также может работать с 3 сигналами, используя другой тип драйвера, я думаю.
Но остается вопрос,
Как я могу сделать это с помощью вашего кода для генератора синуса?
У вас есть схема того, как вы управляете мотором из кода?
Вопрос в том, почему не использовать полный синус с начала, проблема с симметрией ? Потому что полная синусоноводя волна не полезна для прямого ворота/драйверов напрямую. Мне все еще нужно разбить его на отдельные сигналы для высокой стороны и низкой стороны моста H, и для этого мне нужен, по крайней мере, еще один сигнал, который синхронизируется с синусом (я мог бы сделать это аналогично, но, как я сказал , я думаю, что я бы отрицал использование MCU и будет более сложным), кроме того, необходимость симметрии и синхронизации гораздо больше в VFD такого типа, чем, скажем, в BLDC с низким напряжением. (Если есть проблемы, вы получаете нежелательные потери и более низкие RPMS в BLDC, но в двигателе AC 240 В вы в лучшем случае отключите выключатель или в худшем случае начинаете огонь.) Бесщеточный двигатель Nidec 22H67 имеет 380 Гц при 2400 об / мин. Можно к вашему 415 Гц. Этого достаточно, если только вы не уделяете гораздо более высокий об / мин. Мой мотор 3.Мотор переменного тока мощностью 8 кВт с максимальной скоростью 40 000 об / мин
Может перейти к следующему шагу = igbts и провести тесты с двигателем ? Я согласен.

Я надеюсь, что кто -то здесь знает, как получать данные через UART с помощью DMA или, возможно, ADC с помощью DMA??

Стивестронг
Пн 21 января 2019 г. 10:53
Может быть, этот пост интересен для вас: ViewTopic.PHP?F = 18&t = 2743

Богданаоан
Пн 21 января 2019 г. 11:07
[Стивестронг - Пн 21 января 2019 г. 10:53] - Может быть, этот пост интересен для вас: ViewTopic.PHP?F = 18&t = 2743
Спасибо, это выглядит очень умно.
И укрепляет мою веру в то, что DMA - это путь для меня.
Я нашел этот пост ViewTopic.PHP?F = 48&T = 4399&P = 51439&hilit = adc+dma#p51439 Но это немного идет на мою голову.

Стивестронг
Пн 21 января 2019 12:10
Есть некоторые примеры ADC + DMA в мой репо для F4, Вы могли бы перенести их в F1.

Но будьте осторожны, несколько DMA, работающих одновременно, могут в конечном итоге нарушить друг друга.

Тед
Пн 21 января 2019 12:15
Изображение

Тед
Пн 21 января 2019 12:31
Не беспокойтесь о качестве синуса, на осциллографе;
NIDEC имеет искажения на обоих краях квадратной волны, MTD6501C-HC1 похож на трапецию, а не чистый синус.

Сравнение шума, nidec-это шумно (акустический шум), MTD6501C-HC 1 очень тихо = вы не можете услышать почти ничего, даже если вы кладете ухо в тело мотора.

Вы можете это;
ШИМ для оптокуплера > к воротам IGBT > на мотор.
Вам не нужны фильтры высокого напряжения, индуктивность двигателя сделает это.

Тед
Пн 21 января 2019 12:36
Не забудьте большой диод между эмиттером / коллекционером

Богданаоан
Пн 21 января 2019 12:51
[Стивестронг - Пн 21 января 2019 12:10] - Есть некоторые примеры ADC + DMA в мой репо для F4, Вы могли бы перенести их в F1.
Это очень полезно, спасибо.
Я никогда раньше не порвал код, но я буду читать. Это сложная процедура? Я предполагаю, что это в основном об редактировании STM32F4ADC.час?? У вас есть какие -либо советы? или это слишком много для такого новичка, как я?
Но будьте осторожны, несколько DMA, работающих одновременно, могут в конечном итоге нарушить друг друга.
В идеале я хотел бы прочитать два канала ADC, но если это доходит до него, также будет достаточно.

Стивестронг
Пн 21 января 2019 г. 13:05
F4 DMA Porting в/из F1 не совсем тривиальный процесс, так как структуры HW позади разные.
Вы должны копать глубоко, с помощью обоих справочных руководств.

OTOH, примеры DMA можно найти в библиотеке SPI для F1.
Для мягких выводов ШИМ он должен быть вызван таймером, а адрес назначения также должен быть адаптирован.
Если у вас это есть, использование DMA для ADC не должно быть таким трудным, скорее хорошим упражнением.

Но все это вы должны сделать самостоятельно, я не могу сделать это из -за отсутствия времени.

Богданаоан
Пн 21 января 2019 г. 14:33
Я понимаю.
У меня был "посмотрите" через библиотеку. Это, к сожалению, для меня, это больше, чем я могу понять, поэтому я сомневаюсь, что могу перенести код сам. Я буду искать примеры АЦП или UART с DMA для F1.
Я думаю, что еще один вариант - использовать плату F4. Есть ли плата типа Bluepill с чипом F4?

Стивестронг
Пн 21 января 2019 г. 14:43
Маленькие платы F4: https: // stm32duino.com/viewtopic.PHP?F = 39&T = 1977

FCAM1
Вт, 05 марта 2019 г. 14:21
Я не знаю, всегда ли вы ищете пример DMA UART TX, но я сделал это несколько месяцев назад для F103ZET6: https: // www.STM32duino.com/viewtopic.pH ... Искусство#P47489

Богданаоан
Вт, 05 марта 2019 г. 14:38
[FCAM1 - Вторник 05 марта 2019 г. 14:21] - Я не знаю, всегда ли вы ищете пример DMA UART TX, но я сделал это несколько месяцев назад для F103ZET6: https: // www.STM32duino.com/viewtopic.pH ... Искусство#P47489
Спасибо
Я прочитаю.
Вы столкнулись с примером RX в любом месте. В моем случае мне нужно только получить, но я надеюсь, что смогу решить это, используя ваш пример.

FCAM1
Вт, 05 марта 2019 г., 16:51
Вы столкнулись с примером RX в любом месте Некоторые примеры с использованием DMA с ADC: https: // github.com/rogerclarkmelbourne/ ... C/примеры

Дэнниф
Сб 16 марта 2019 г. 12:51
Я опаздываю в дискуссию, но это кажется довольно простой проблемой:

Предполагая, что вам нужен цифровой вывод SINE (= SWM), а не аналоговый синусный выход.

Вот что я бы сделал.

1) Иметь таблицу синусоидальной службы. 256 баллов, например. Используйте фазовый аккумулятор для его индексации.
2) Установите 3-минутные выходные каналы, CH1--3.
3) Настроить прерывание таймера и периодически вызывается.
4) В таймере ISR установите рабочее цикл CH1 на основе таблицы обязательств, индексированной в аккумуляторе; Рабочее цикл CH2, индексируемый для аккумулятора + 256/3, а рабочее цикл CH3 индексирован для аккумулятора + 256*2/3.

С таким подходом ваш главный () цикл пуст.

Если вам действительно нужен аналоговый вывод, поместите LPF на каждый из цифровых выходных каналов.

Дэнниф
Сб, 16 марта 2019 г., 12:52
Кстати, можно также использовать один из каналов ШИМ для времени.

Тед
Сб 16 марта 2019 г. 13:50
[Дэнниф - Сб 16 марта 2019 г. 12:51] -
1) Иметь таблицу синусоидальной службы. 256 баллов, например. Используйте фазовый аккумулятор для его индексации ?
Вы имеете в виду использовать 3 таблицы, две из них сдвинулись ± 120 градусов ?
Я где -то видел что -то подобное.

Дэнниф
Сб 16 марта 2019 г. 14:00
Зачем использовать 3 таблицы, когда 1 может сделать?

Тед
Сб 16 марта 2019 г. 14:36
Потому что с одним столом я вижу, что у парней есть проблема

Дэнниф
Сб 16 марта 2019 г. 15:03
Если вы не можете сделать 1 таблицу, используйте 3 таблицы, тогда.

Тед
Сб 16 марта 2019 г. 15:24
Если одна таблица не может выполнять 3 задачи, используйте 3 таблицы, 1 задача для каждой.
Идея проста, используйте 360 -балльную таблицу, каждая точка составляет 1 град.
Пример для 10 градусов. сдвиг; Снимите 10 первых точек из таблицы и положите их на конец в обратном порядке.

Fredbox
Сб 16 марта 2019 г. 15:42
[Дэнниф - Сб 16 марта 2019 г., 14:00] - Зачем использовать 3 таблицы, когда 1 может сделать?
Много лет назад (вероятно, примерно в 1990 году). Я помню, что программисты использовали только первые 90 градусов одной синусоидварности в таблице, чтобы создать три фазы.