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

 
 
> STM32F0 + датчик Холла SCM Sunfab
arthedza
сообщение Dec 1 2014, 16:57
Сообщение #1


Участник
*

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



Доброго времени суток всем! Товарищи, нужна ваша помощь.
Буду краток. В универе проходил курс АВРок, настало время диплома. Диплом делаю на предприятии (и кураторы тоже от предприятия), в виду этого приходится на ходу осваивать STM32F0. Да и в универском курсе ни разу не сталкивался с датчиками. Пока имеется один вопрос, с остальным вроде разобрался. Он заключается в следующем: как мне подключать сей
датчик скорости на эффекте Холла к СТМке? В программе MicroXplorer есть такой пунктик интересный — XORED Inputs Hall Sensor Interface (3 ноги под это дело заводится, 3 канала таймера). Что, все три ноги датчика на таймер МК подавать? Или лучше просто задействовать один канал таймера в режиме input capture? Если нужна дополнительная инфа — пишите, я укажу все, что знаю. Вот что написано в инсайдерском руководстве:

Цитата
5.1.4.2.2. Интерфейс датчика Холла
Каждый из таймеров, в т.ч. и расширенный, разработан с учетом простоты
подключения к датчику Холла, предназначенного для измерения угловой частоты
вращения электродвигателя. Первые три вывода захвата каждого таймера можно связать
с каналом 1 через логический элемент "исключающее ИЛИ". В этом случае, по мере
вращения двигателя и прохождения возле каждого датчика, в канале будет
генерироваться событие захвата. Это приведет к копированию текущего состояния
таймера в регистр захвата канала, а также к сбросу таймера. Таким образом, значение
счетчика, которое окажется в регистре захвата, можно пересчитать в частоту вращения
электродвигателя.
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 49)
Golikov A.
сообщение Dec 1 2014, 17:29
Сообщение #2


Гуру
******

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



ну просто если брать мотор для которого положение определяют по датчику хола, то от него идут 3 датчика хола, мож потому и 3 ноги?

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

Доложите нам пожалуйста какой сигнал выходит с датчика, и что он означает и какие показания вы ожидаете получать и регистрировать с датчика и в какой ситуации

Потому что как вы сами, надеюсь понимаете, с помощью датчиков на эффекте Холла можно намерить от тока в проводнике до положения севера на земле...
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 1 2014, 17:33
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(arthedza @ Dec 1 2014, 20:57) *
Что, все три ноги датчика на таймер МК подавать?

У него две ножки, а не три. Фазовый сдвиг между ними указывает на направление вращения (см. даташит, на который вы сослались). Если нужно определять частоту вращения, то вполне можно подключить эти ножки к Capture - входам таймера ...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 1 2014, 18:01
Сообщение #4


Участник
*

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



Цитата(Golikov A. @ Dec 1 2014, 19:29) *
ну просто если брать мотор для которого положение определяют по датчику хола, то от него идут 3 датчика хола, мож потому и 3 ноги?

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

Доложите нам пожалуйста какой сигнал выходит с датчика, и что он означает и какие показания вы ожидаете получать и регистрировать с датчика и в какой ситуации

Потому что как вы сами, надеюсь понимаете, с помощью датчиков на эффекте Холла можно намерить от тока в проводнике до положения севера на земле...


С датчика идет 4 провода: питание, земля и два информационных (разные направления вращения, 30 импульсов за оборот)

Цитата(kovigor @ Dec 1 2014, 19:33) *
У него две ножки, а не три. Фазовый сдвиг между ними указывает на направление вращения (см. даташит, на который вы сослались). Если нужно определять частоту вращения, то вполне можно подключить эти ножки к Capture - входам таймера ...


Направление вращения в конкретной задаче не важно, реализации реверса не требуется
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 1 2014, 18:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(arthedza @ Dec 1 2014, 22:01) *
Направление вращения в конкретной задаче не важно, реализации реверса не требуется

Тогда на Capture - входы подключайте. А если все же направление потребуется (в будущем), то можно подать сигнал параллельно на две обычных ножки любого порта. Но вполне возможно, что средствами Capture удастся определить также и направление вращения ...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 1 2014, 18:26
Сообщение #6


Гуру
******

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



Цитата
С датчика идет 4 провода: питание, земля и два информационных (разные направления вращения, 30 импульсов за оборот)


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



эх... обломали образовательный процесс, ну да ладно...

Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 1 2014, 18:39
Сообщение #7


Участник
*

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



Цитата(Golikov A. @ Dec 1 2014, 20:24) *
по описанию похоже больше на энкодер, возможно магнитный на датчике холла, чем на датчик холла...


Ну, его "обозвали" датчиком скорости на эффекте Холла. Он двухканальный. Как я понял, датчик скорости этот контролирует зубцы шестерни гидромотора и содержит в себе магнит и ,собственно, датчик Холла в одном корпусе (смотри рисунок). Датчик Холла и магнит размещаются вблизи зубьев шестерни, как только зуб шестерни проходит вдоль устройства — магнитное поле между магнитом и датчиком усиливается, в результате чего на выходе блока формируется импульс. 30 зубьев = 30 импульсов за оборот.

Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 1 2014, 19:28
Сообщение #8


Гуру
******

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



Вот.... теперь вопрос
в датчике стоят 2 магнита и 2 датчика холла, на расстояние в пол. зубца шестерни или там просто стоит 2 датчика на 2 шестерни? Что вы понимали под 2 канальностью?

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

1. можно по 1 проводу ловить импульсы, мерить время между импульсами и определять скорость вращения по этой величине. Вы получаете тут время на путь длинной в 1 зуб.
2. Если второй канал смещен на ползуба, то можно мерить время между 2 импульсами и определять скорость вращения по этой величине. Вы получаете время на путь длинной в 0.5 зуба.
3. Можно за определенное время накапливать импульсы и по этому параметру определять скорость вращения. Вы получаете сколько зубцов проходит мимо датчика за определенное время.

так какое решение выбираете вы?
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 1 2014, 19:51
Сообщение #9


Участник
*

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



Цитата(Golikov A. @ Dec 1 2014, 21:28) *
Вот.... теперь вопрос
в датчике стоят 2 магнита и 2 датчика холла, на расстояние в пол. зубца шестерни или там просто стоит 2 датчика на 2 шестерни? Что вы понимали под 2 канальностью?

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

1. можно по 1 проводу ловить импульсы, мерить время между импульсами и определять скорость вращения по этой величине. Вы получаете тут время на путь длинной в 1 зуб.
2. Если второй канал смещен на ползуба, то можно мерить время между 2 импульсами и определять скорость вращения по этой величине. Вы получаете время на путь длинной в 0.5 зуба.
3. Можно за определенное время накапливать импульсы и по этому параметру определять скорость вращения. Вы получаете сколько зубцов проходит мимо датчика за определенное время.

так какое решение выбираете вы?


Давайте я завтра постараюсь уточнить на счет структуры датчика и двухканальности, а потом отпишусь
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2014, 07:27
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(arthedza @ Dec 1 2014, 21:51) *
Давайте я завтра постараюсь уточнить на счет структуры датчика и двухканальности, а потом отпишусь
А еще почитайте (для общего ознакомления) о квадратурных энкодерах. Любой инженер - электроник должен иметь представление о принципе работы таких энкодеров, также как любой инженер должен иметь представление о логарифмах. Увидите много общего между своим датчиком и таким энкодером. У STM32 некоторые таймеры имеют специальный режим для прямой работы с такими энкодерами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 2 2014, 07:30
Сообщение #11


Участник
*

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



Цитата(Golikov A. @ Dec 1 2014, 21:28) *
Вот.... теперь вопрос
в датчике стоят 2 магнита и 2 датчика холла, на расстояние в пол. зубца шестерни или там просто стоит 2 датчика на 2 шестерни? Что вы понимали под 2 канальностью?

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

1. можно по 1 проводу ловить импульсы, мерить время между импульсами и определять скорость вращения по этой величине. Вы получаете тут время на путь длинной в 1 зуб.
2. Если второй канал смещен на ползуба, то можно мерить время между 2 импульсами и определять скорость вращения по этой величине. Вы получаете время на путь длинной в 0.5 зуба.
3. Можно за определенное время накапливать импульсы и по этому параметру определять скорость вращения. Вы получаете сколько зубцов проходит мимо датчика за определенное время.

так какое решение выбираете вы?


Конструктивное решение принято уже до меня: канал используется только один, обратного направления вращения нет в реализации. Так что будет использоваться 1 провод. Как мне сказали, двухканальность никого не интересует. Считать зубцы будем одним датчиком
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2014, 07:34
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(arthedza @ Dec 2 2014, 09:30) *
канал используется только один, обратного направления вращения нет в реализации.
Значит задача измерения скорости сводится к задаче определения частоты поступающих импульсов, к построению частотомера. Вот вам и еще одно ключевое слово для поисков: "измерение частоты".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 2 2014, 07:39
Сообщение #13


Участник
*

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



Цитата(Сергей Борщ @ Dec 2 2014, 09:27) *
А еще почитайте (для общего ознакомления) о квадратурных энкодерах. Любой инженер - электроник должен иметь представление о принципе работы таких энкодеров, также как любой инженер должен иметь представление о логарифмах. Увидите много общего между своим датчиком и таким энкодером. У STM32 некоторые таймеры имеют специальный режим для прямой работы с такими энкодерами.


Да на днях поверхностно ознакомился с энкодерами

Цитата(Сергей Борщ @ Dec 2 2014, 09:34) *
Значит задача измерения скорости сводится к задаче определения частоты поступающих импульсов, к построению частотомера. Вот вам и еще одно ключевое слово для поисков: "измерение частоты".


Это тоже я гуглил) Даже нарыл некий фрагментик:

CODE
#include "iostm8l152c6.h"
#include "lcd.h"

long int count;
//описываем прерывание
#pragma vector=EXTI1_vector
__interrupt void Pin1_interrupt(void)
{
unsigned char ch = 'с';
TIM1_CR1_bit.CEN ^= 1;
PE_ODR_bit.ODR7 ^= 1;
if ( !TIM1_CR1_bit.CEN )
{
LCD_eWrite_Int( &count, 1, 5, 4 );
LCD_Write_Char( &ch, 0, 0, 6 );
count = 0;
}
EXTI_SR1_bit.P1F = 1; //сброс флага прерывания, чтобы вернуться в код
}
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVF(void)
{
count++;
TIM1_SR1_bit.UIF = 0; //Сброс флага прерывания
}
void timinit( void )
{
CLK_PCKENR2_bit.PCKEN21 = 1; //Включаем тактирование таймера 1
TIM1_PSCRH = 0;
TIM1_PSCRL = 7; //Делитель на 8
TIM1_ARRH = (1000) >> 8; //Частота переполнений = 8М / 8 / 1000 = 100 Гц
TIM1_ARRL = (1000)& 0xFF;
TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
TIM1_EGR_bit.UG = 1; //Вызываем Update Event
TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
}
void main( void )
{
unsigned char text[7] = " READY";
CLK_SWCR_bit.SWEN = 1;
CLK_SWR = 0x04;
CLK_CKDIVR = 0x00; //ядро работает на 8 МГц
PC_DDR_bit.DDR1 = 0;
PE_DDR_bit.DDR7 = 1;
PE_CR1_bit.C17 = 1;
PC_CR1_bit.C11 = 1;
PC_CR2_bit.C21 = 1;
EXTI_CR1_bit.P1IS = 2;//реагировать на спад, т е нажатие кнопки
ITC_SPR3_bit.VECT9SPR = 3;
timinit();
LCD_Init();
LCD_Contrast(7);
LCD_Write_String( text );
asm("RIM"); //глобальное разрешение прерываний
while( true );
}


Сообщение отредактировал IgorKossak - Dec 2 2014, 19:40
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 2 2014, 08:34
Сообщение #14


Гуру
******

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



Ну тут достаточно применить смекалку:

у вас осталось 2 варианта

1. Определение мгновенной скорости, то есть измерение времени прошедшего между 2 зубцами
2. Подсчет числа зубцов прошедших мимо датчика за определенное время

Реализация этого может быть такие
1. Прерывание по импульсу от проходящего зубца. В прерывании вы считываете значение таймера, сбрасываете его и запускаете бежать вперед без остановок. Первый интервал после остановки будет определен криво, дальше все поедет как надо.
2. Завести таймер на определенный интервал, 1 секунда, например. Завести сигнал от датчика как клок другого таймера, каждый импульс таймер будет прибавлять по 1 в счетчик. Как пройдет секунда, по прерыванию можете считать сколько насчитал 2 таймер, и сбросить это число. Таким способом вас реже дергают в прерывание, и получается некая фильтрация по времени, но теряется оперативность.

Так же можно завести сигнал и обратный сигнал на 2 капча таймера, и определять разницу между фронтами. Можно по 1 капчу, если у проца есть такой режим таймера. Можно как вариант 2 заставить таймер тактируемый внешним сигналом считать до какого то числа и по прерыванию как он досчитал забирать время системного таймера, определяя сколько времени прошло за Н зубцов.
Можно придумать еще вариантики.

А фрагменты не ищите, если понять задачу она реализуется за полдня, а если не понять то будет как в начале темы, заведете 2 сигнала на какие то ножки а потом выясниться что 1 сигнала нет, а ножки не совсем подходят потому что от датчика ждали другого.... Вообще на вопрос куда завести датчик Холла, я бы ответил на компаратор или АЦП, так что постановка и понимание задачи очень важно!
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 2 2014, 09:23
Сообщение #15


Участник
*

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



Цитата(Golikov A. @ Dec 2 2014, 10:34) *
...


А к какому варианту посоветуете склониться лично мне, как начинающему? Естесственно, желательно "что полегче"

Цитата(arthedza @ Dec 2 2014, 11:04) *
А к какому варианту посоветуете склониться лично мне, как начинающему? Естесственно, желательно "что полегче"


Просмотрел внимательно ТЗ, опрос датчика скорости должен производиться с периодичностью в 5мс

Сообщение отредактировал IgorKossak - Dec 2 2014, 19:41
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 2 2014, 11:08
Сообщение #16


Участник
*

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



Следовательно, подходит вариант второй: подсчет числа зубцов прошедших мимо датчика за определенное время
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 2 2014, 19:24
Сообщение #17


Гуру
******

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



ну строго говоря надо еще понять какого уровня изменения возможны за этот интервал. То есть возможно шестерня крутиться так медленно что несколько 5 мСек интервалов попадут на 1 зуб и вам ничего делать не надо, просто тупо раз в 5 мСек опрашивать состояние входа и если оно изменилось из 0 в 1, считать импульс, и ждать изменения из 1 в 0.

Если же скорость вращения выше, или импульсы коротки и есть шанс их пропустить с 5 мСек опросами, то надо их заводить на ногу клока таймера, и пусть он их считает. А вы раз в 5 мСек спрашиваете сколько он насчитал....

Одна хитрость остается, это сброс таймера.
Если вы раз в 5 мСек будете забирать значение и сбрасывать таймер, существует вероятность что вы сбросите сразу после импульса, и отсчет потеряется.
то есть вы вошли в прерывание
берете из таймера значение Н (в этот момент проходит импульс и таймер становится Н+1)
вы пишите в таймер 0, и 1 импульс потерялся.

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

Вот как бы и все. Так что заводите ваши сигналы на источник клока таймера и дерзайте
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2014, 21:00
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



А еще обратите внимание на вот это сообщение: http://electronix.ru/forum/index.php?s=&am...st&p=234466

Там описан более точный вариант измерения на основе комбинации описанных выше двух методов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 2 2014, 23:31
Сообщение #19


Гуру
******

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



Спасибо, интересная тема. Правда пришлось несколько раз перечитать первые страницы прежде чем в их попытках измерения длинны органов разглядел суть.

Смысл поста такой
можно относительно частоты проца считать импульсы измеряемой частоты и получить их с точностью +-1.
А можно так вывернуться что относительной измеряемой частоты считать импульсы частоты проца, получить их опять с точность +-1.

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

Но на самом деле метод что предлагал, когда с равными интервалами относительно частоты проца забираются разницы счета измеряемой величины в мгновенном варианте дает погрешность +-1, а в дальней перспективе значительно выше. Те остатки такта, что были не учтены на текущем интервале перейдут на следующий, и выразятся в дрожании значения, которое после фильтрации (а ее все равно по уму надо делать) как раз даст доп точность....
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 3 2014, 08:03
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(arthedza @ Dec 2 2014, 13:23) *
Просмотрел внимательно ТЗ, опрос датчика скорости должен производиться с периодичностью в 5мс

Странное ТЗ. В ТЗ не нужно писать _как_делать, а нужно описать _что_делать_.

Формулировка в виде:
- Диапазон измеряемых скоростей от 5 зуб/с до 300 зуб/с.
- Время реакции на изменение скорости не более 1 с.
(цифры разумеется должны быть из вашей задачи).

сократит число вариантов решения и постов в этой теме)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 3 2014, 08:49
Сообщение #21


Гуру
******

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



периодичность опроса и время реакции системы также нормальные требования ТЗ, особенно если это ТЗ на блок, и оно учитывает общую загрузку системы...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 3 2014, 10:34
Сообщение #22


Участник
*

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



Цитата(adnega @ Dec 3 2014, 10:03) *
Странное ТЗ. В ТЗ не нужно писать _как_делать, а нужно описать _что_делать_.

Формулировка в виде:
- Диапазон измеряемых скоростей от 5 зуб/с до 300 зуб/с.
- Время реакции на изменение скорости не более 1 с.
(цифры разумеется должны быть из вашей задачи).

сократит число вариантов решения и постов в этой теме)


Частота вращения будет изменяться в диапазоне 0..5200с^-1. 1 оборот=30 зуб.
Хотя для объекта управления (гидроклапан) указана частота шим 100гц (10мс) с точки зрения обеспечения устойчивости такт решения задачи производительности гидросистемы необходимо сделать в 5мс. Т.е каждые 5 мс нужно обрабатывать частоту вращения и считать фильтры. Частота выдачи упр. сигнала должна соответствовать частоте ШИМ-сигнала. формировать значение упр. сигнала можно и каждые 5 мс но ШИМ будет менять свою скважность каждые 10мс. Т. е сигнал ШИМ с заданной скважностью должен пройти полностью

Цитата(Golikov A. @ Dec 3 2014, 10:49) *
периодичность опроса и время реакции системы также нормальные требования ТЗ, особенно если это ТЗ на блок, и оно учитывает общую загрузку системы...

написал выше
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 3 2014, 11:12
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(arthedza @ Dec 3 2014, 14:34) *
Частота вращения будет изменяться в диапазоне 0..5200с^-1. 1 оборот=30 зуб.
Хотя для объекта управления (гидроклапан) указана частота шим 100гц (10мс) с точки зрения обеспечения устойчивости такт решения задачи производительности гидросистемы необходимо сделать в 5мс. Т.е каждые 5 мс нужно обрабатывать частоту вращения и считать фильтры. Частота выдачи упр. сигнала должна соответствовать частоте ШИМ-сигнала. формировать значение упр. сигнала можно и каждые 5 мс но ШИМ будет менять свою скважность каждые 10мс. Т. е сигнал ШИМ с заданной скважностью должен пройти полностью

Считаем число импульсов от датчика за 5мс.
Имеем число от 0 до 780 импульсов. Разрешающая способность 6.(6) об/сек.
При времени реакции 5мс и скоростях ниже 6 об/сек имеем ситуацию, когда на выходе измерителя будет ШИМ:
5 мс скорость будет равна нулю, а в следующие 5 мс = 6.(6) об/сек.
На низких оборотах скорость нужно усреднять с большим интервалом.
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 3 2014, 11:48
Сообщение #24


Участник
*

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



Цитата(adnega @ Dec 3 2014, 13:12) *
Считаем число импульсов от датчика за 5мс.
Имеем число от 0 до 780 импульсов. Разрешающая способность 6.(6) об/сек.
При времени реакции 5мс и скоростях ниже 6 об/сек имеем ситуацию, когда на выходе измерителя будет ШИМ:
5 мс скорость будет равна нулю, а в следующие 5 мс = 6.(6) об/сек.
На низких оборотах скорость нужно усреднять с большим интервалом.


А если низкие обороты будут только при пуске/останове, а основная частота, к примеру, будет составлять 1000-1500 с^-1?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 3 2014, 13:05
Сообщение #25


Гуру
******

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



1000-1500 - это 150 - 225 импульсов в 5мСек
6.666666 оборотов в секунду - это 1 импульс в 5 мСек

получается что у вас 1000 оборотов в секунду не отличимо от 1001, 1002, 1003, 1004, 1005, 1006, но вот 1007 уже отличается это 151 импульс
так что если вы шимом будете стараться поддержать обороты, то вы это сможете сделать с точностью до 6 оборотов в 5 мСек.
Но обычно системы несколько более инертны, и можно использовать показания за несколько 5 мСек периудов, и получить разрешение повыше, ценой потери оперативность регулировки. Но думаю что мотор все равно мгновенно скорость не поменяет, наверняка будет там какой то ПИД, который все сгладит...
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 3 2014, 14:16
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Golikov A. @ Dec 3 2014, 17:05) *
Но думаю что мотор все равно мгновенно скорость не поменяет...

Поэтому возникает вопрос целесообразности 5 мс интервала.
Усреднять можно и в течение секунды, а мгновенные выборки делать хоть каждые 5 мс.
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 4 2014, 07:11
Сообщение #27


Участник
*

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



Цитата(adnega @ Dec 3 2014, 13:12) *
Считаем число импульсов от датчика за 5мс.
Имеем число от 0 до 780 импульсов. Разрешающая способность 6.(6) об/сек.
При времени реакции 5мс и скоростях ниже 6 об/сек имеем ситуацию, когда на выходе измерителя будет ШИМ:
5 мс скорость будет равна нулю, а в следующие 5 мс = 6.(6) об/сек.
На низких оборотах скорость нужно усреднять с большим интервалом.


Простите, не то написал. Обороты в минуту, а не в секунду. Выходит:
5200 об/мин * 30 = 156000 имп/мин
156000/60 = 2600 имп/сек
2600/1000*5 = 13 импульсов в 5 милисекунд при 5200 об/мин.

Сообщение отредактировал arthedza - Dec 4 2014, 07:19
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 4 2014, 07:15
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(arthedza @ Dec 4 2014, 11:11) *
Простите, не то написал. Обороты в минуту, а не в секунду. Выходит:
5200 об/мин * 30 = 156000 имп/мин
156000/60 = 2600 имп/сек
2600/1000*5 = 13 импульсов в 5 милисекунд.

Что ж - стало хуже ровно в 60 раз)
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 4 2014, 07:25
Сообщение #29


Участник
*

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



Цитата(adnega @ Dec 4 2014, 09:15) *
Что ж - стало хуже ровно в 60 раз)


Всего будет три режима работы:
V1 = 1800 об/мин = 4,5 имп/5мс
V2 = 3000 об/мин = 7,5 имп/5мс
V3 = 5200 об/мин = 13 имп/5мс

Делать мгновенные выборки через каждые 5 мс в несколько тактов, а потом усреднять? Или как?

Сообщение отредактировал arthedza - Dec 4 2014, 07:42
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 4 2014, 08:13
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(arthedza @ Dec 4 2014, 11:25) *
Или как?

Мотор - штука инертная, поэтому за 5 мс скорость поменяться не может, и даже если поменяется зубцов не так много, чтобы уловить эти изменения.
Я бы предложил:
1. Запустить 16-разрядный счетчик на непрерывный подсчет импульсов.
2. Раз в 5 мс считывал значение из счетчика и считал дельту с предыдущим считанным значением (аккуратно на переходе 0xFFFF -> 0x0000 !).
3. Полученную дельту помещал в очередь (LIFO) из N элементов, где N*5мс = интервал усреднения/сглаживания.
4. Зная N и общее число импульсов в очереди (сумма всех элементов), можно рассчитать мгновенную (каждые 5 мс) скорость усредненную за большой интервал (N * 5 мс).
Go to the top of the page
 
+Quote Post
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
Golikov A.
сообщение Dec 9 2014, 14:52
Сообщение #46


Гуру
******

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



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


скажите своему куратору что на электрониксе не одобрили. Это самое прямое решение в лоб, просто грубая сила, никакой изюминки...

вы будете получать результат с точностью +- 1 импульс, на ваших рабочих частотах вращения +-1 импульс от 4.5, то есть точность данного метода +-25% И чего вы хотите срегулировать таким образом?

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




Цитата
Как мне уже написали:
Цитата

"При максимальных оборотах в 5200/мин время между соседними зубцами (их 30) будет 1/2600Hz=384.1мкс."

переполнение определяет максимальное время ожидания, так что интересует время между зубцами на минимальной скорости, но у вас там всяко 5 мСек раньше наступит...
Go to the top of the page
 
+Quote Post
arthedza
сообщение Dec 10 2014, 06:38
Сообщение #47


Участник
*

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



Цитата(Golikov A. @ Dec 9 2014, 16:52) *
на ножку подается пульсирующий сигнал, только на ножку капча таймера который просто бежит вперед с максимальной частотой проца. По прерыванию капча вы запоминаете новое значение и считаете дельту с прошлым.
Все собранные дельты вы суммируете, и усредняете за 5 мСек, в результате вы получите точность +-0.5 импульса, только не вашего а проца. То есть длительность вы определите на несколько порядков точнее...


Правильно ли я понял: всего на одну ножку таймера в режиме input capture, который настроен на счет вперед с максимальной частотой CPU, поступают импульсы от датчика скорости. По фронту импульса уходим в прерывание, запоминаем значение, которое набежало в таймере, считаем разницу с предыдущим значением. Уже вне подпрограммы обработки прерывания усреднить дельты за 5мс.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 10 2014, 07:16
Сообщение #48


Гуру
******

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



да.
в прерывании вы только определяете интервалы...
можете этот таймер что будет капчить запустить считать не до переполнения а до 5 мСек. Тем самым получить еще одно прерывание в котором будете организовывать обработку 5 мСек интервалов, причем там можно просто флаг выставлять, а обрабатывать в главной петле.

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





Цитата
По фронту импульса уходим в прерывание, запоминаем значение

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

я бы сделал массив из 20 элементов чтобы наверняка,
каждое прерывание полученный интервал клал бы в очередную ячейку.
а когда получал бы 5 мСек прерывание ставил бы флаг, на обработку этого массива и его сброс


А может быть я положил бы простенький фильтр который усреднял бы интервалы на каждое получение, и вообще отказался бы от 5 мСек интервалов. Обычная экспонента
y = Xold - (Xold - Xnew)/2, дает неплохую фильтрацию и реализуется сдвигом. Вместо 2 могут быть и другие константы, которые можно рассчитать и заменить на умножение. Можно работать в целых числах и сдвигах. Вариантов много...


Цитата
всего на одну ножку таймера в режиме input capture

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


Участник
*

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



Цитата(Golikov A. @ Dec 9 2014, 16:52) *
Все собранные дельты вы суммируете, и усредняете за 5 мСек, в результате вы получите точность +-0.5 импульса, только не вашего а проца. То есть длительность вы определите на несколько порядков точнее...


В итоге, я получу время между импульсами датчика (период сигнала датчика, это выйдет 1/30 оборота) в тактах МК. И если я умножу полученное число тактов на 30 -- получу длительность в системных тактах одного оборота. Учитывая, что тактирование будет производиться от кварца 8.000MHz, смогу узнать, сколько пройдет оборотов в секунду, а домножив на 60 -- узнаю и обороты за минуту, так?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 10 2014, 11:33
Сообщение #50


Гуру
******

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



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

Но в целом логическая цепочка вернаяsm.gif... другое дело зачем вам это знать? Вы как я понимаю строите систему регулирования, на входе в систему обычно подается величина ошибки, а я уверяю (утверждаю) что период между импульсами пропорционален частоте вращения, потому для системы регулирования разница между ошибкой входной частоты и ошибкой входных периодов - это всего навсего коэффициент.

То есть я предлагаю делать систему регулирования которая поддерживает не заданные обороты, а поддерживает заданный период между импульсами. Вот и все...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:39
Рейтинг@Mail.ru


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