Создание собственной системы стабилизации
так получается система не универсальная. под каждый приемник настраивать надо
Ну в вообщем-то да, вся настройка выглядит вот так:
int main(void)
{
STM32* mk = STM32::getInstance();
Clock* clc = Clock::getInstance();
PWM* pwm = PWM::getInctance();
// Инициализируем железо
mk->Init();
// Настраиваем системный таймер
clc->Setup();
pwm->Setup(PB7, TIM4, CH_2, INPUT, 50); // приемник
pwm->Setup(PA0, TIM2, CH_1, OUTPUT, 50); // мотор
while(1)
{
pwm->Write(TIM2, CH_1, pwm->Read(TIM4, CH_2)); // передаю на мотор сигнал с приемника
}
}
Это полный текст главного цикла, где с одного канала ( с приемника) получаю ШИМ и передаю на другой ( на мотор).
Цифра 50 - это и есть частота ШИМ.
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
Видимо у 407-го (не смотрел) есть настройка на оба фронта, а у меня F303 только “или”-“или”…
Вы посмотрите, - есть ли аппаратная возможность сброса счетчика по первому фронту (в моем кажется есть, сейчас как раз копаюсь), тогда все проблемы отпадут…
Видимо у 407-го (не смотрел) есть настройка на оба фронта, а у меня F303 только “или”-“или”…
Вы посмотрите, - есть ли аппаратная возможность сброса счетчика по первому фронту (в моем кажется есть, сейчас как раз копаюсь), тогда все проблемы отпадут…
А сбрасывать ведь нельзя…
Если к этому таймеру подключены еще 3 канала ШИМ ?
Вы ведь сбросите счетчик таймера для все каналов он же единый…
И если на одном получите правильное значение, то для всех остальных будет “мусор”
Я бы тогда конечно сбрасывал по второму фронту и проблем бы с переполнением не было.
А сбрасывать ведь нельзя…
.
Согласен…, затупил , к тому же “разул глаза” благодаря Вам, и на моем можно по обеим фронтам настроить…, будем думать…
Однако имейте в виду (проверено) что в реальном времени импульсы всех каналов разнесены и не пересекаются (они из PPM вырезаны), так что насчет сброса еще подумать надо…
Согласен…, затупил , к тому же “разул глаза” благодаря Вам, и на моем можно по обеим фронтам настроить…, будем думать…
Однако имейте в виду (проверено) что в реальном времени импульсы всех каналов разнесены и не пересекаются (они из PPM вырезаны), так что насчет сброса еще подумать надо…
Впринципе, можно проверить, подключить к лог. анализатору 4 канала и посмотреть временые диаграмы.
Ну все равно риск некоторый есть мне кажется, чуть задержался в прерываниях, пришел импульс с другого канала и все, пиши пропало.
чуть задержался в прерываниях, пришел импульс с другого канала и все, пиши пропало.
на то они и прерывания чтобы в них не задерживаться
и все, пиши пропало.
Вот и я всю голову изломал, даже всерьез подумываю слепить преобразователь на простеньком Avr-e в PPM и тогда получим: 1 нога STM под приемник ! ПДП на чтение всех каналов ! никаких прерываний !
на то они и прерывания чтобы в них не задерживаться
Ну имелось в виду не само прерывание как таковое, а функция его обработки.
Пока обработываешь, пришло другое прерывание, значение счетчика изменилось, а мы его сбросили… Потому сбрасывать его не желательно. ИМХО.
Вообщем, проверять это все дело надо.
Вот и я всю голову изломал, даже всерьез подумываю слепить преобразователь на простеньком Avr-e в PPM и тогда получим: 1 нога STM под приемник ! ПДП на чтение всех каналов ! никаких прерываний !
Вот уж не знаю, стоит ли шкурка выделки…
По мне так лучше как сейчас, 1 канал таймера - 1 канал приемника.При таких настройках моторы вчера гонял весь вечер, проблем не было.
Однако имейте в виду (проверено) что в реальном времени импульсы всех каналов разнесены и не пересекаются
Увы, не во всех приемниках так. В некоторых они как раз одновременно идут
Вот пример картинки с сайта Эксперта
Вот-вот, тем более даже если взять 1-ю картинку, то по ней спад 1 канала совпадает с фронтом 2-го. Даже в этом случае расчитывать на сброс счетчика уже опасно, пока считаешь первый канал, со второго пришло прерывание. И не факт что сбросить счетчик успеешь до прихода прерывания со второго канала.
А если учесть что на 1 таймере весит аж 4 канала управления, игра в рулетку какая-то получается.
Увы, не во всех приемниках так.
Странно… не знал, ведь в радиосигнале информация не может быть параллельна, как же это они так “измудрились” к одному фронту привязать все каналы, хотя … пути господни…
Получается, что все алгоритмы летят к “… бабушке”.
И не факт что сбросить счетчик успеешь до прихода прерывания со второго канала.
действительно, что делать если прерывание следующего канала сработает сразу с завершением фронта предыдущего? как успеть записать значение шима???
Странно… не знал, ведь в радиосигнале информация не может быть параллельна, как же это они так “измудрились” к одному фронту привязать все каналы, хотя … пути господни…
Это же цифровой сигнал, приходит пакет, приемник его декодирует и выставляет значения каналов, к примеру.
Это же цифровой сигнал.
У меня futaba PCM (типа “цифра”) но импульсы всеж разнесены причем с “зазором”, как и в реале…
Вот rcopen.com/forum/f123/topic264377/49 простая ловилка PWM на tiny 2313 сам сейчас с такой летаю, как пишет автор, там ссылка есть на первоисточник, работает с любыми выходами приёмника…
I have used it without problems with my mikrokopter. It works without skipping frames on my Corona CR8D type 2 receiver (all servo channels output simultaneously). It should work fine on type 1 receivers also (servo channels output sequentially), but I don’t own any so I can’t test it.
действительно, что делать если прерывание следующего канала сработает сразу с завершением фронта предыдущего? как успеть записать значение шима???
Если сделать как у меня, то ничего страшного в этом не будет, я же не сбрасываю значение счетчика. А вот если сбрасывать, тогда да, будут проблемы.
У меня futaba PCM (типа “цифра”) но импульсы всеж разнесены причем с “зазором”, как и в реале…
А зазор какой, сколько есть времени на обработку?
А зазор какой, сколько есть времени на обработку?
0.3 мили/сек
простая ловилка PWM на tiny
Вот, а я еще хочу скажем в RS232 преобразовать (не проблема) тогда прям в USART заливай 16 байт (8х2), ПДП, и вперед…
Провел эксперимент.
Вот сигнал с 3-х каналов приемника.
Аппа Турнига 9х
Как видно, фронт идет сразу по всем каналам.
И сразу назревает проблема.
2 канала я еще более-менее успеваю обрабатывать, а вот уже не 3-х происходит сбой. Счетчик же тикает, пока до 3-го канала добираюсь, половину скважности ШИМ успевает обрезать.
Про 4 канала уже и говорить не хочется…
Значит, по фронту необходимо данные заносить сразу во все 4 канала, а уже по спаду в каждый канал свое значение…
Зато теперь знаю как избавится от слеек, сбрасывать счетчик по фронту. 😃
И сразу назревает проблема.
“Простая задача” оказалась не простой (хорошо, что я плату еще не начал делать), даааа…
Спасибо за эксперимент… (у меня только футабы есть), не знал…
Нашел решение, как обрабатывать все правильно.
Делать надо так:
сначала ловим переход из 0 в 1. Сбрасываем счетчик таймера.
Далее проводим переинициализацию таймера, чтобы он ловил переход из 1 в 0.
Записываем значения. снова проводим перенастройку. чтоб ловил из 0 в 1 и т.д. по кругу.
Таким образом ничего нигде не обрезается и все данные по всем 4-м каналом на 1-м таймере соответствуют действительности.
Плюс к этому избавляемся от переполнения счетчика таймера.
И к 303 камню как раз подходит! 😃
Код нужен ?
“Простая задача” оказалась не простой (хорошо, что я плату еще не начал делать), даааа…
Спасибо за эксперимент… (у меня только футабы есть), не знал…
Возможно для футабы придется писать код отдельно, также как для спектрумов…
Получаем вот такую ровную картину.
Все каналы кроме 3-го в центре, 3-й в минимуме.
Поторопился я, произошла небольшая ошибка.
Данные то считывал не напрямую с приемника, а уже с контроллера.
Напрямую с приемника сигналы выглядят вот так, со смешением. Между спадом и фронтом соседних каналов (величина смещения) 2мкс.
Со сбросом счетчика по фронту прекрасно работает. Значит этот способ будет работать в обоих вариантах, хоть по одному фронту сигналы приходят, хоть со смешением.
Плюс к этому экономим на памяти, так как хранить нужно всего 1 значение, вместо 3-х, как раньше.
В Вашем проекте нашел функции по ДЕинициализации петли ДУСа, каково их применение ?
отключение петли нужно для изменения настройки ДУС штатной функцией Ф3Дисковери.
И еще, я так понял, что для чтения акселя и магнетометра ПДП не применяется (?).
Нет, и2ц замороченный протокол и читается 6 байт, для организации ПДП накладных расходв больше.
произошла небольшая ошибка.
Оно и к лучшему 😃 , я чуть “на измену” не подсел… (рад что все срослось)
Оно и к лучшему 😃 , я чуть “на измену” не подсел… (рад что все срослось)
Да самому неудобно, что напугал зря! 😃
Прям целый детектив получился.
Зато в итоге разобрались как и что, избавились от всех проблем, что были в начале.
Всуну свои пять копее, это если фронт одновременный - сбрасываем счётчик, а по спаду генерим прерывания - по нужному каналу, не сбрасывая счётчик, пока по всем каналам не просмотрим ? а ещё лучше - сброс счётчика по фронту первого канала, и дальше прерывания и по фронту и по тылу, не сбрасывая счётчик до - опять же фронта первого канала, - и расчитать длительноть по каждому, тогда в любом случае сработает? может и глупость сморозил, я сейчас бумажными самолётиками для сына занят, из книжки “От идеи до модели”…
Всуну свои пять копее, это если фронт одновременный - сбрасываем счётчик, а по спаду генерим прерывания - по нужному каналу, не сбрасывая счётчик, пока по всем каналам не просмотрим ? а ещё лучше - сброс счётчика по фронту первого канала, и дальше прерывания и по фронту и по тылу, не сбрасывая счётчик до - опять же фронта первого канала, - и расчитать длительноть по каждому, тогда в любом случае сработает? может и глупость сморозил, я сейчас бумажными самолётиками для сына занят, из книжки “От идеи до модели”…
По первому варианту кода больше. Придется смотреть по всем каналам фронт или не по всем одновременно. Зачем делать лишнее действие?
По второму варианту получаем переполненние счетчика если фронт не одновременный, что ведет к “склейке” 2-х периодов между собой. Тоже не красиво. И также 3 переменные, вместо одной. Плюс к этому лишнее арифметическое действие на вычисление разницы между фронтом и спадом.
А вот когда счетчик сбрасываем по каждому фронту, получается на каждый канал свой счетчик таймера., максимальное значение которого 20000. Таким образом избавляемся от проблемы переполнения, экономим память, решение получается проще и быстрее по времени выполнения, так как значение счетчика сразу запоминаем, ничего вычислять не надо.
Такой вариант работает при любом приходе фронтов, хоть при одновременном, хоть при раздельном.