Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: частотник на stm32f0

Вт дек 21, 2021 13:01:50

Я же сказал - это шутка, но, к примеру, на F100 с размером флеша 128кБат вполне реализуем.
F100 - это Cortex-M3 что-ль? На нём тем более таблицы глупо использовать. Потому как по формуле синусоиду генерить - однозначно быстрее.

А вы пытаетесь туда затрамбовать 65536 отсчетов.
Максиму что таймер возьмет 65536/10000 = 6,5536
Ничего не понятно... Что такое "65536/10000"? Причём тут оно. Зачем что-то куда-то "трамбовать"?
Складывается впечатление что вы не понимаете как работает ШИМ.... :dont_know:

Еще раз, коэффициент гармоник для ступенчатой функции не зависит от количества точек таблицы, единственное что меняется, это дискретность таблицы, градусов.
Так по сколько градусов будут скачки вашей синусоиды по таблице размером 128 отсчётов?
Разницу между скачками 360/128 градусов (у вас) и 360/65536 градусов (у меня) понимаете?
Если для вас нет разницы между ними?

Re: частотник на stm32f0

Вт дек 21, 2021 13:43:46

jcxz писал(а):Складывается впечатление что вы не понимаете как работает ШИМ....
Ну дык объясни.
Объясни мне, не понимающему, как в таймер, принимающий 10000 отсчетов, запихать 65536 отсчетов с генерированных
jcxz писал(а):по формуле синусоиду генерить - однозначно быстрее.
jcxz писал(а):Разницу между скачками 360/128 градусов (у вас) и 360/65536 градусов (у меня) понимаете?
Вопрос не уместен, пока на выше вопрос не ответите.

Re: частотник на stm32f0

Вт дек 21, 2021 14:01:42

Объясни мне, не понимающему, как в таймер, принимающий 10000 отсчетов, запихать 65536 отсчетов
Нет, не смогу. Так как не знаю ни что такое "таймер принимающий 10000 отсчётов", ни что такое эти "отсчёты" и зачем они нужны для генерации синусоиды? :shock:
Вроде любой вменяемый человек должен знать, что синусоида генерится по формуле y=sin(x); где x - угол изменяющийся со скоростью генерируемого синуса. И вызывается эта функция с частотой ШИМа.
У меня угол (x) имеет точность = 16 бит. Результат sin(x) - тоже 16 бит. Отсюда и качество генерируемой синусоиды.

Re: частотник на stm32f0

Вт дек 21, 2021 14:15:16

Вот уже кое что
jcxz писал(а): И вызывается эта функция с частотой ШИМа.
А частота ШИМ, к примеру, 10кГц.
jcxz писал(а):Результат sin(x) - тоже 16 бит.
Мы об этом уже говорили
jcxz писал(а):Разрешение ШИМ определяется соотношением = частота_тактирования_таймера/частота_ШИМ
Ну и, хочу шим 10кГц 16БИТ
Dimon456 писал(а):FFFF*10кГц = 655МГц

Re: частотник на stm32f0

Вт дек 21, 2021 14:49:17

Ну и, хочу шим 10кГц 16БИТ
Dimon456 писал(а):FFFF*10кГц = 655МГц
Вы похоже не понимаете что такое ШИМ, что такое "частота ШИМ-а". Советую почитать специальную литературу.

А вот так генерится синусоида с хорошей точностью по частоте и с максимально возможной точностью по амплитуде (для данного ШИМ-таймера). Без всяких таблиц и прочей чуши:
Код:
#define F_TIM 16000000 //[Гц] частота тактирования таймера
#define F_PWM 10000    //[Гц] частота ШИМ-а
#define F_SIN 15       //[Гц] частота синусоиды

#define B16 0x00010000ul
#define divRound(a, b) (((a) + (b) / 2u) / (b)) //деление a/b с округлением до ближайшего целого
#define PHASE_STEP (divRound((u64)F_SIN << 32, F_PWM)) //шаг фазы генератора; формат U0.32
#define PERIOD_TIM (F_TIM / F_PWM)                     //период таймера ШИМ

//Sinus. {x} == angle[rad] / PI * 2^15
//return: {-2^15+1...+2^15-1} == {-1...+1}
s16 Sine(s16 x) { ... }

u16 magnitude = ...;  //должно быть в диапазоне 0...PERIOD_TIM

void Gen() //выполняется с частотой F_PWM
{
  static u32 phase;
  phase += PHASE_STEP;
  u16 x = phase >> 16;
  u16 ccr0 = ((u32)((s32)sin(x + B16 * 0 / 3) * magnitude) >> 16) + PERIOD_TIM / 2;
  u16 ccr1 = ((u32)((s32)sin(x + B16 * 1 / 3) * magnitude) >> 16) + PERIOD_TIM / 2;
  u16 ccr2 = ((u32)((s32)sin(x + B16 * 2 / 3) * magnitude) >> 16) + PERIOD_TIM / 2;
  //ccr0,ccr1,ccr2 - значения, записываемые в регистры сравнения таймера для всех 3-х фаз
}
Изучайте.

Примерно так у меня и реализовано. Частоту можно менять плавно, амплитуду - тоже. Никаких дёрганий и вибраций на любой скорости вращения.
Естественно - это только псевдокод. В реале у меня он оптимизирован (вычисляется не один сэмпл за раз, а массив сэмплов; из которого потом ISR ШИМ-а пихает значения в регистры сравнения таймера). И вычисления все оптимизированы под STM8.
И в реале у меня F_SIN - не константа, а также может плавно меняться, для плавного разгона/торможения. Точнее - плавно меняется производная от неё величина - PHASE_STEP.

Re: частотник на stm32f0

Вт дек 21, 2021 18:00:24

jcxz писал(а):Вы похоже не понимаете что такое ШИМ, что такое "частота ШИМ-а".
Возможно и не понимаю.
Из приведенного вами кода вижу следующее:
В основе кода лежит dds синтез
Код:
  static u32 phase;
  phase += PHASE_STEP;
  u16 x = phase >> 16;
32 разрядный сумматор, на stm32 операция бы выполнялась за один так, ну или около того +-.
Сдвиг на 16 бит приводит результат к 16 битам.
Что далее:
Код:
F_PWM 10000    //[Гц] частота ШИМ-а
Код:
#define PERIOD_TIM (F_TIM / F_PWM)                     //период таймера ШИМ
Период таймера ШИМ составляет 16000000/10000 = 1600
Было бы 1023 я бы сказал что 10 битный ШИМ, 2048 - 11 битный ШИМ, 1600 - что-то между 10 и 11 бит. Но всяко ШИМ не 16 бит.
Отсюда следует что в регистр ARR таймера должно быть записано PERIOD_TIM.

Что далее: синус мне не удалось посчитать и сравнить, скорее всего используется компилятор с++, так как sin(x) принимает тип float.
Остается загадкой
Код:
//Sinus. {x} == angle[rad] / PI * 2^15
хотя возврат
Код:
//return: {-2^15+1...+2^15-1} == {-1...+1}
и что это
Код:
s16 Sine(s16 x) { ... }
возможно какая-то таблица создается на этапе компиляции.
Одним словом...

Но все таки я посчитал синус и сравнил
Просто, ради интереса, какой компилятор используется и сколько полностью код выполняется?

Re: частотник на stm32f0

Вт дек 21, 2021 19:04:46

и вот же зараза какая, да же с десятичными знаками циферка в циферку совпадает.
Во всех 511 точках между каждой из 128 совпадает?

Re: частотник на stm32f0

Вт дек 21, 2021 22:57:13

VladislavS, это частный случай, на каких-то кратных частотах.
Этот друг полином считает, сразу бы сказал, только что точнее будет
и с другой стороны, а как насчет такого фикса?

Re: частотник на stm32f0

Чт дек 23, 2021 12:48:24

Было бы 1023 я бы сказал что 10 битный ШИМ, 2048 - 11 битный ШИМ, 1600 - что-то между 10 и 11 бит. Но всяко ШИМ не 16 бит.
И что? Главное - синус считается с точностью 16 бит. А фаза (угол) - вообще с точностью 32 бита. Это и даёт точность выходного сигнала по частоте и уровню.

скорее всего используется компилятор с++, так как sin(x) принимает тип float.
Вы исходники си-шные читать умеете? Где вы там видите sin(float ...)? Вы видите там объявление функции Sine()? Как она объявлена и комментарий к ней прочитали? Там совершенно явно указаны типы аргумента и результата функции. Перечитйте ещё раз.
Кроме того - ранее я уже писал что большая часть кода - на ассемблере. Тот исходник, что я привел - псевдокод, иллюстрирующий алгоритм вычислений (так как если даже си тут похоже мало кто понимает, то ассемблер STM8 боюсь вообще никто не сможет понять :dont_know: ). В реальности код этот у меня написан на ассемблере.

возможно какая-то таблица создается на этапе компиляции.
Да уж.... похоже неизлечимый случай.... У вас какая-то зацикленность на таблицах. :dont_know: 4-й раз повторяю: Я НЕ ИСПОЛЬЗОВАЛ ТАБЛИЦ. Никаких.

Вспоминайте школьный курс математики и вычисление функций при помощи полиномов. Синус прекрасно аппроксимируется полиномом 7-го порядка. Ещё раз: совершенно без таблиц! И с точностью лучше 16 бит.

и вот же зараза какая, да же с десятичными знаками циферка в циферку совпадает.
Теперь возьмите квадрат, измерьте его от 1-го угла до 3-го, а потом от 2-го до 4-го. Результаты совпали? Совпали. Получили = X. Теперь возьмите окружность диаметром = X, измерьте её диаметр. Равен X. Вот же зараза - и у квадрата тоже по всем сделанным измерениям получили X! Означает ли это, что квадрат полностью аналогичен окружности? :)))
Означает ли это, что если колёса сделать квадратными, то телега будет ездить так же, как на круглых? :)))
Вот это примерно то же самое, что вы сделали.

Просто, ради интереса, какой компилятор используется и сколько полностью код выполняется?
Компилятор - IAR (на 8К он даже бесплатен, старые его версии), 2-й вопрос - неясен. Очевидно, что код выполняется от момента включения контроллера до его выключения. :dont_know:

Добавлено after 7 minutes 27 seconds:
это частный случай, на каких-то кратных частотах.
Ещё раз читаем пример про круг и квадрат. И пытаемся постигнуть смысл аллегории....

Re: частотник на stm32f0

Чт дек 23, 2021 15:08:01

jcxz писал(а): 4-й раз повторяю: Я НЕ ИСПОЛЬЗОВАЛ ТАБЛИЦ. Никаких.
Dimon456 писал(а):Этот друг полином считает, сразу бы сказал
Мне не удалось найти в инете готового решения
Код:
{-2^15+1...+2^15-1}
единственное что нашлось
Код:
{-2^14 ... 2^14}
Вам удалось создать "инвертор" с чистым синусом
jcxz писал(а):Синус прекрасно аппроксимируется полиномом 7-го порядка.
У меня комповый бесперебоник есть с полиномом 3-го порядка.
jcxz писал(а):Очевидно, что код выполняется от момента включения контроллера до его выключения.
Имелось ввиду сколько времени тратится на расчет одной точки. Я привел пример 16,25us.

Но вы забыли одно, dds-синтез таит в себе один минус, и чем частота ШИМ ниже, тем этот минус больше становится.
Но это, в принципе, не важно.

Для частотных приводов ШИМ лежит в районе 4кГц, а "восмикрут", который уже куча людей собрало и продемонстрировало, использует таблицу всего в 18 точек.

Вашим способом довольно трудно получить
не нравится таблица в 128 точек, и есть куча флеш памяти, используйте таблицу в 256 точек, 512 точек, до хоть в 32кБайта, и с любым разрешением ШИМ, хоть 8 бит, хоть 10 бит, хоть ваши 1600.

PS. Тут в одном проекте, для вывода на ws2812, использовали таблицу в 2048 байт, и не че, хотя можно было бы и на лету рассчитывать, сэкономили бы 2 кило флеша и + потратили бы насколько лишних десятков тактов.

Все, дискуссия на эту тему закончена.

Re: частотник на stm32f0

Чт дек 23, 2021 23:08:28

Мне не удалось найти в инете готового решения
За инет ничего не скажу, я последние ~15 лет использую такой код:
Код:
//Синус. Аргумент R0 == угол[радиан] / PI * 2^31
//Результат: R0{-2^31+1...+2^31-1} == {-1...+1}
s32 sine(s32 x)
{
  static s32 const sineT[] = {
    -248273015,  //A6=-0.9248890576
    845095976,   //A5=3.1482278419
    -53406011,   //A4=-0.1989528976
    -1377768453, //A3=-5.1325874557
    -830572,     //A2=-0.0030941259
    843345115,   //A1=3.1417053758
    -266};       //A0=-0.0000009929
  s32 const *p = sineT;
  s32 i, y;
  if ((i = x << 1) < 0) i = -i;
  i >>= 1;
  y = *p++;
  do y = (s32)((s64)y * i >> 31) + *p++;
  while (p != sineT + ncell(sineT));
  if ((y <<= 2) < 0) y = -y;
  if (y >> 30) y = B30 - 1;    //ограничим диапазоном 0...2^30-1
  if (x < 0) y = -y;
  return y << 1;
}

На STM8 портировал его на 16 бит и перевёл в асм. Если интересно - могу закинуть.

Имелось ввиду сколько времени тратится на расчет одной точки. Я привел пример 16,25us.
Железа готового под рукой нет, а вручную считать лень. Но думаю у меня конечно значительно больше загрузка CPU. Если не изменяет память, то загрузка CPU при работе мотора была 80-90%. Правда это суммарно - туда ещё работа с UART-ами входит и пр., но львиная доля это конечно генерация синусоид.

Вашим способом довольно трудно получить такого рода формы сигнала
На STM8? Так красный - это же обычная синусоида. Она у меня как раз и получается.
Синий - похож на векторную модуляцию. Тоже непонятно почему "трудно получить"? На STM8 я его не реализовывал, а на Cortex-M как раз с помощью той же sine() и получаю. Причём для него нужно ещё меньше - всего 2 вызова sine() на квант, а не 3 (как в синусной модуляции), правда с дополнительной математикой.
И опять - без таблиц! 8)
Причём на Cortex-M у меня в коде 2 варианта работы векторного модулятора: 1)табличный; 2)с использованием 2-х sine(). И 2-й всего примерно на 0.5%-1% больше грузит CPU, чем 1-й (144МГц, ШИМ=10кГц). Всего то...
Остальные графики не узнаю кто это.

Re: частотник на stm32f0

Вс дек 26, 2021 21:13:22

и нахрена вам таблица нужна ? U/F= const. вот и всё решение
а вектор , тута полный разброд , нет обратной связи значит говнокод

Re: частотник на stm32f0

Сб янв 01, 2022 14:41:12

вариант частотника на базе stm8s003.
энкодер пока подключен напрямую, защита от кз ещё не работает (потому что до конца не собрано) и не проверялась (возможно с 817_ми оптронами быстродействие будет недостаточно, надо ещё сделать защиту по скорости изменения напряжения на шине 310V).
в этот раз собрал выпрямители вспомогательного ип из диодов 1N4148, не так компактно зато совсем не греются.
регулирование частоты сделано примерно так же как и в прошлых конструкциях - переключение таблиц + манипуляции с регистрами ARR и RCR.
в качестве эксперимента введена компенсация дедтайма и напряжения на шине DC_310.

прошивка, код, схема, pcb -
https://www.upload.ee/files/13758598/3ph_STM8S.zip.html
Вложения
схема_stm8_od.gif
(103.69 KiB) Скачиваний: 153
test_0.jpg
(69.56 KiB) Скачиваний: 130

Re: частотник на stm32f0

Вс янв 02, 2022 19:49:49

2SC5587 я так понял , это тормозной резистор ? если так то ждите салюта , вот вам проверенная схема
https://youtu.be/fppsJjcryuM

Re: частотник на stm32f0

Пн янв 03, 2022 23:15:20

это не тормозной резистор.

подключил к схеме на stm8 однофазный конденсаторный двигатель с двумя одинаковыми обмотками (от дренажного насоса). потеря момента заметна но не очень велика, обороты регулируются, реверс работает. а вот ещё один конденсаторный двигатель с разными обмотками хотя и регулируется но совсем не тянет.

Re: частотник на stm32f0

Ср янв 05, 2022 07:10:16

Здорово, что на STM8 одноразовой сделали.

"надо ещё сделать защиту по скорости изменения напряжения на шине 310V"

Просто феноменально крутая идея. Кстати, сам думал о защите силовой части во время отладки с помощью электронного предохранителя на IGBT в цепи +310В. Как Вы думаете насчет этого? По сути, такой предохранитель можно устанавливать временно в процессе отладки, а управлять им классическим трансформатором тока.

Добавлено after 31 minute 7 seconds:
А это не хотите попробовать.
Если X1 (в схеме) управлять микросхемой PFC то получиться стабилизатор тока. А тиристоры можно переключать с частотой 0-400 Гц всего. Преимущество в том, что шина постоянного тока стабилизирует именно ток, двигатель возьмет столько ЭДС сколько ему нужно и вычислять V/F просто не нужно как и вычислять синус его вычислит сам двигатель когда будет крутиться. Переключай себе тиристоры неспешно и всего то. Для выключения тиристоров ток от X1 PFC можно временно прервать на 63 мкс.

Re: частотник на stm32f0

Ср янв 05, 2022 09:18:20

Astrahard писал(а):Здорово, что на STM8 одноразовой сделали.

раньше может и да, а теперь не удивлюсь если stm8s003 стоит сопоставимо с какой нибудь RPi или ESP32.
Astrahard писал(а):Просто феноменально крутая идея.

если не ошибаюсь у "восьмикрута" защита от кз по такому принципу работает.
Astrahard писал(а):с помощью электронного предохранителя на IGBT в цепи +310В.

если до конденсаторов то бесполезно, если после то конфликтует с необходимостью иметь конденсаторы поближе. плюс потери на предохранителе. и не защищает от замыкания на корпус.
Astrahard писал(а):А это не хотите попробовать.

Вы эту схему несколько лет назад предложили насколько я помню. неужто за столько времени не попробовали её собрать?

Re: частотник на stm32f0

Ср янв 05, 2022 11:57:54

Я ее собрал в Микрокапе. А насчет предохранителя на IGBT, то конечно после конденсатора. А после IGBT предохранителя конденсатор 20-50нФ*630В. Маленький конденсатор не сожжет транзисторы потому, что его энергия как раз соответствует пределу терпимости MOSFET (IGBT) в режиме КЗ.


Да, кстати

Таким образом можно сделать частотник вовсе без микроконтроллера.

Re: частотник на stm32f0

Чт янв 06, 2022 17:20:37

чтож, сделайте. возможно это будет интересно.
а я пожалуй доработаю самую первую схему.
Вложения
pcb.jpg
(66.72 KiB) Скачиваний: 120
схема.gif
(72.38 KiB) Скачиваний: 112

Re: частотник на stm32f0

Вс янв 16, 2022 11:24:55

Я понял что говорил Dimon456!!!
В случае с stm8 имеем частоту тактирования 16МГц. Частоту ШИМ желаем 10кГц. Отсюда следует что счетчик будет считать до 16000000/10000 = 1600. Таким образом в ШИМ регистр счетчика можно запихнуть значения от 1 до 1600 (может от 0 до 1599 к этому придираться не стоит). ШИМ будет генерироваться с точностью 1/1600. И не более. В счетчик не засунешь 15.45, а только 15. Отсюда следует что проводить вычисления с точностью более 1/1600 можно, но бесполезно. Тогда и считать синус с точностью 16бит не требуется, ибо все равно придется округлять до точности в 1/1600 в конце. Можно считать с меньшей точностью. Как минимум можно не считать полином 7 степени, а взять степень поменьше. Ну или вообще использовать таблицу и DDS.
Я профан в приводе, поэтому не могу сказать куда можно использовать освободившееся время процессора.

p.s.
Для stm32f0 имеем 48МГц и при 10кГц ШИМ будем иметь максимальное значение счетчика уже 4800 и точность в 1/4800 соответственно.
Можно еще прикинуть неточности от пульсации напряжения после конденсатора и выпрямителя. После этого 0.1% точности в шиме покажутся идеалом.
Ответить