реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> STM32F0 + датчик Холла SCM Sunfab
arthedza
сообщение Dec 4 2014, 09:24
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(adnega @ Dec 4 2014, 10:13) *
Мотор - штука инертная, поэтому за 5 мс скорость поменяться не может, и даже если поменяется зубцов не так много, чтобы уловить эти изменения.
Я бы предложил:
1. Запустить 16-разрядный счетчик на непрерывный подсчет импульсов.
2. Раз в 5 мс считывал значение из счетчика и считал дельту с предыдущим считанным значением (аккуратно на переходе 0xFFFF -> 0x0000 !).
3. Полученную дельту помещал в очередь (LIFO) из N элементов, где N*5мс = интервал усреднения/сглаживания.
4. Зная N и общее число импульсов в очереди (сумма всех элементов), можно рассчитать мгновенную (каждые 5 мс) скорость усредненную за большой интервал (N * 5 мс).


5 мс ведь заложили потому, что период управляющего ШИМ-воздействия с контроллера составляет 10 мс. Как я понял, за 10 мс мы должны успеть опросить датчик холла, вычислить частоту вращения, сформировать закон управления по полученной скорости и в соответствии с этим законом выдать ШИМ на выход контроллера.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 4 2014, 09:55
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну при такой частоте у вас ничего просто не выйдет....

вот смотрите вы хотите V1 = 1800 об/ми - это 4.5 импульса

пусть мотор крутиться со скоростью 1700 об/ми
это дает 1700/60*30/1000*5 = 4.25 импульсов
допустим вы ничего не меняете
в первые 5 м секу вы получили 4 импульса - надо увеличить скорость
0.25 осталось на след такт, в след раз будет 4.5, целое снова 4 - надо увеличить скорость
4.75 - целое 4, надо увеличить
5 - опачки перебор, надо уменьшить
а потом опять 4 - надо увеличить....


А теперь представьте что вы выдаете управляющие воздействия, у 5 импульсов на 5 мСек - это скорость 2000 об/мин, 4 импульса - это 1600, то есть в схеме отлова мгновенной скорости 1600 - 2000 оборотов не различимы, а любые попытки управления будут кидать ваш мотор от 1600 до 2000... Система войдет в генерацию и будет пипец.....


вам надо существенно увеличить точность, а это можно сделать только увеличив время выборки....

к примеру мотор вращается с частотой 1700 об/мин, это 4.25 имп в 5 мСек, 0.25 - теряется
если же взять 20 мСек, то это ровно 4.25*4=17 импульсов и потерь нет... если собирать за 50 мСек то вы сможете обрабатывать с точностью до 0.1 на те же 5 мСек...

не важно как быстро вы можете изменить ШИМ, важно насколько точно вы можете вычислить изменение... При работе с тактами 5 мСек, вам придется делать очень плавные интеграционные коэффициенты и нулевые пропорциональные, и что в итоге? получите очень медленное регулирование, хоть и с частыми поправками, то есть фильтр перейдет не на измерение, а на регулирование....


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

Импульсы заводите на клок таймера, выход таймера заводите на капчу второго таймера... Задаете первому таймеру интервал счета 5 (например), а второй таймер запускаете просто вперед на максимальной частоте от клока проца.

Как это будет работать....

импульсы идут и заставляют считать первый таймер, как только таймер досчитает до 5, он закапчит сигнал второго таймера и в итоге, вы получите сколько тактов проц пошло на 5 импульсов. То есть вы будите знать время за которое прошло 5 импульсов с точностью +-1 клок проца, что значительно выше чем число импульсов за 5 мСек с точностью +-1 импульс...

надо предусмотреть обработку переполнения 2 таймера, а так же надо учесть если 5 импульсов не поступят за какое-то понятное время, что мотор стоит, возможно для этого нужен еще таймер, или проверять время от времени счетчик 1 таймера в общем цикле, и если ничего не меняется бить тревогу... проверку можно делать с вашими любимыми 5 мСек интервалами...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 4 2014, 10:16
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(Golikov A. @ Dec 4 2014, 11:55) *
ну при такой частоте у вас ничего просто не выйдет....

Я предлагаю такое решение, которое здорово повысит точность...


Спасибо за исчерпывающий ответ! Ушел разбираться с инфой.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Dec 6 2014, 17:13
Сообщение #34


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(arthedza @ Dec 4 2014, 12:16) *
Спасибо за исчерпывающий ответ! Ушел разбираться с инфой.

Я почитал предыдущих ораторов. Мне кажется, точность можно существенно повысить, а точнее - она появится сама собой, - если тупо:
- считать мгновенную скорость вращения путем измерения интервала между двумя зубцами,
- корректировать ШИМ с указанной периодичностью в 5мс.

При максимальных оборотах в 5200/мин время между соседними зубцами (их 30) будет 1/2600Hz=384.1мкс. Это просто вечность! За это время при частоте процессора 24MHz таймер насчитает число 9230. То есть, скорость будет измеряться с точностью почти 0.01%. При медленном вращении в 1 оборот в минуту будет 9230 х 5200 < 48мио. тактов таймера, то есть это явно вписывается в 32-бита. Счетчик нужен 32-х разрядный, что можно организовать, считая переполнения 16-ти битного таймера в прерывании от него.

Каждый импульс от датчика вырабатывает прерывание, в котором вычисляется мгновенная скорость на основании разницы между текущим и предыдущим значением составного 32-х битного числа. Нужно в этом прерывании лишь подсуетиться в том плане, чтобы составное 32-х битное число из значения таймера и старшего 16-битного слова переполнения было "цельным" (ключевое слово - "атомарная" операция). И вот с этим числом можно потом спокойно работать в 5мс тактах: вычислений с частотой 200Hz для механики мотора более достаточно.

Кстати, в качестве таймера достаточно использовать и SysTick, в прерывании от которого и "создается" 32-х битный счетчик. Если SysTick настроен, скажем, даже на 1ms, то его значение (при 24MHz CPU) будет бегать от 0 до (24000-1). Пусть в прерывании от SysTick будет выполняться SysTickCnt++. Тогда 32-х битный счетчик (в тактах CPU) составляется как

Код
volatile uint32_t cnt32 = 0, cnt32_last = cnt32;

void SysTick_Handler(void)
{
       static uint32_t SysTickCnt = 0;

       uint32_t
       b = SysTick->LOAD;

       SysTickCnt++;

       cnt32 = (SysTickCnt * (b + 1)) + (b - SysTick->VAL);
}

Время между импульсами датчика (точнее, количество тактов, которые потом пересчитываются в скорость):

Код
   uint32_t
   cnt = cnt32,
   diff = cnt - cnt32_last;
   cnt_last = cnt;

При этом, как многократно обсуждалось в темах, не нужно суетиться по поводу, что cnt и cnt32_last могут быть по разную сторону от нуля.

Сообщение отредактировал KnightIgor - Dec 6 2014, 17:30
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 6 2014, 18:01
Сообщение #35


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Вот появился еще такой вопрос: как можно смоделировать работу МК? Есть ли решения для STM32 типа Proteus|Multisim?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 6 2014, 18:09
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а чем симулятор то не годиться?

в IAR, KEIL есть возможность запустить программу в симуляторе, и подавать воздействия...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 6 2014, 18:15
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(Golikov A. @ Dec 6 2014, 20:09) *
а чем симулятор то не годиться?

в IAR, KEIL есть возможность запустить программу в симуляторе, и подавать воздействия...


Дело в том, что работаю в CoIDE
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 6 2014, 18:22
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



работайтеsm.gif вы скачайте триальную версию на 30 дней, и проверьте как оно там....

легче купить старкит, типа дискавери за 10 баксов, и все на нем проверить, у вас же периферия стандартная. А симуляторы - это от лукавого ИМХО...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 6 2014, 18:24
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(Golikov A. @ Dec 6 2014, 20:22) *
работайтеsm.gif вы скачайте триальную версию на 30 дней, и проверьте как оно там....

легче купить старкит, типа дискавери за 10 баксов, и все на нем проверить, у вас же периферия стандартная. А симуляторы - это от лукавого ИМХО...


Так дискавери и купил) Генератор импульсов какой-то к ней присобачить, чтоб в железе посмотреть?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 6 2014, 18:33
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



кнопку тактовую и нажимайте рукой...
или с одной ножки подайте на другую

в работе с железом самое первое это поднять интерфейс с компьютером типа RS232, по которому слать отладочную информацию. Можно слать сколько намерено времени между импульсами, и формировать их хоть руками
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 6 2014, 18:36
Сообщение #41


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(Golikov A. @ Dec 6 2014, 20:33) *
кнопку тактовую и нажимайте рукой...
или с одной ножки подайте на другую

в работе с железом самое первое это поднять интерфейс с компьютером типа RS232, по которому слать отладочную информацию. Можно слать сколько намерено времени между импульсами, и формировать их хоть руками


Слать нужно в какой-то терминал же? Или куда?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 6 2014, 21:01
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



да я в терминал шлю. Раньше был гипертерминал, сейчас в новой винде его нет, шлю в Terminal
http://www.gaw.ru/html.cgi/txt/interface/rs232/start.htm
смотрите в конце есть описание

Насколько помню в дискавери вроде ком порт не распаян, есть просто выход на уарт, можно паять преобразователь уровня в ком порт, но есть готовые решения типа
UART<->USB, очень советую обзавестись, если занимаетесь разработкой, то это очень удобное средство, и отладка в порт очень эффективна. Позволяет смотреть работу в динамике, надо следить чтобы не засрать порт сообщениями, конечно, но это по мне лучше чем остановки с житагом...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 9 2014, 08:13
Сообщение #43


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(Golikov A. @ Dec 4 2014, 11:55) *
Я предлагаю такое решение, которое здорово повысит точность...


Немного погуглил в свободное время и нарыл чуток информации.
Для измерения частоты существует 2 метода: метод захвата и метод "временных ворот".
Для метода захвата достаточно одного таймера, имеющего прерывания по захвату и по переполнению. Числом переполнений определяется требуемое время измерения, а захватами -- начало и конец счета (программным счетчиком) целого числа периодов измеряемой частоты.
Метод "временных ворот" реализуется на двух таймерах. Один для формирования базы времени, другой для счета периодов измеряемой частоты. В этом случае нужно как можно точнее формировать "временные ворота". Для МК минимальная ширина "временных ворот" ограничена машинным циклом, т.е. периодом через который CPU может опрашивать состяние входного вывода.
Каким методом считать импульсы проще?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 9 2014, 09:06
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



проще временными воротами
точнее методом захвата...
при условии что частоту импульсов меньше частоты процессора

кстати добавив прерывание на переполнение, можно расширить и ограничение времени счета
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 9 2014, 09:49
Сообщение #45


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-12-14
Пользователь №: 83 922



Цитата(Golikov A. @ Dec 9 2014, 11:06) *
проще временными воротами
точнее методом захвата...
при условии что частоту импульсов меньше частоты процессора

кстати добавив прерывание на переполнение, можно расширить и ограничение времени счета


Поговорил со своим куратором. Как я понял, надо делать так:
на ножку подается пульсирующий сигнал, по нарастанию фронта -- уходим в прерывание. Соответственно, каждый период будет срабатывать прерывание, нам остается только подсчитывать их количество за 5мс.

Цитата(Golikov A. @ Dec 9 2014, 11:06) *
проще временными воротами
точнее методом захвата...
при условии что частоту импульсов меньше частоты процессора

кстати добавив прерывание на переполнение, можно расширить и ограничение времени счета


Как мне уже написали:
Цитата
"При максимальных оборотах в 5200/мин время между соседними зубцами (их 30) будет 1/2600Hz=384.1мкс."
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016