Ну не знаю я в основном сталкивался с таким написанием. Ты же можешь писать мосфИты. Да и какая разница как вещи называть главное чтобы смысл был понятен, а так что под столом (или сталом блин с этим албанским, вчера спорили как писать правильно флаг или флак, бедные училки руского языка, они наше время вспоминают как сказку с нашими "зделоть" и т. д.), что пацталом - все один фиг.
Последний раз редактировалось Master 30 окт 2007, 21:51, всего редактировалось 1 раз.
Master писал(а):Тогда уж лучше повесить N-кодеры на INT0 и INT1, и по переполнению таймера, скажем раз в 1 сек, смотреть скока набежало на каждом колесе. А остальные ресурсы МК бросить на что то более полезное.
По моему быстрые INTы лучше использовать на что нибудь полезное. По моему пара операций выполняемых с частотой в 1-2 кГц два десятка операций выполняемых с частотой порядка 10 Гц Ядро с тактовой 8МГц не перегрузят
контрол обычно две, ну да ладна. на основе таймера сделать часы с точностью Т=0,01 сек или более в зависимости от потребности. каждое срабатывание таймера, то есть чаждые Т секунд анализ датчиков энкодеров 1/0, запоминаем состояние 1/0, текущее время, смотрим изменилось ли состояние энкодера 0/1, если изменилось то надо расчитать время между срабатываниями. вычесть из текущего прошлое, запомнить, сравнить результат левого правого и расчитать поправку для изменения ШИМа. ШИМ тоже не мгновенно изменится значит надо вводить какую нибудь паузу на корректировку. скажем ввели поправку ждем Х*Т тактов на реакцию. можно и остальные задачи также по кругу гонять. мегагерц должно хватить. что скажем?
rig писал(а):шим кстати программный или аппаратный будет
Аппаратный, зачем зря ядро грузить?
rig писал(а):...ШИМ тоже не мгновенно изменится значит надо вводить какую нибудь паузу на корректировку. скажем ввели поправку ждем Х*Т тактов на реакцию. ...
Коэффициент заполнения ШИМа изменится на следующий такт после записи в OCR, так что поправку вводить не надо.
Пока не зарылись в подробности нужно продумать подход с созданию программы в целом. Считаю, что в данном случае достаточно хорошим с точки зрения удобства разработки и дальнейшего усовершенствования, является использование подобия конечных автоматов. Это даст, во-первых, общность подходов к использованию периферии в разных местах программы, а, во-вторых, можно достаточно просто совершенствовать программу, не влияя на уже имеющийся код. Что касается поворотов, то тут нужно прикидывать как будет соотноситься количество импульсов от левого и правого энкодеров, для поворота на определенный угол по определенному радиусу. Например на 2 импульса правого энкодера должен приходиться один от левого. Если это не так, нужно корректировать заполнение. Можно так же и выключать-тормозить один двигатель вообще, чтобы второе колесо довернулось до нужного соотношения импульсов. Может уместно использовать ограниченный набор радиусов поворота и для них теоретически прикинуть соотношение количества импульсов от энкодеров и на практике замерить заполнения ШИМ, которые нужны для таких радиусов поворотов?
Последний раз редактировалось SSG 31 окт 2007, 15:00, всего редактировалось 1 раз.
я баловался только с динамической индикацией на 100Гц, диод плавно зажигался и гас, дискретность в 1 % тоесть 10 КГц заполнение . а вот с моторами как быть, какую частоту опорную делать.
Victorovych писал(а):Коэффициент заполнения ШИМа изменится на следующий такт после записи в OCR, так что поправку вводить не надо.
ту т я имел в виду нечто другое, шим то изменится быстро а насколько быстро изменится скорость вала мотора . вот на изменение скорости и надо делать паузу в корректировках. иначе мы за каждое срабатывание энкодера навводим поравок не учитывая момент инерции вала. тут нужен эксперимент или готовый практик.
Victorovych писал(а):Коэффициент заполнения ШИМа изменится на следующий такт после записи в OCR, так что поправку вводить не надо.
ту т я имел в виду нечто другое, шим то изменится быстро а насколько быстро изменится скорость вала мотора . вот на изменение скорости и надо делать паузу в корректировках. иначе мы за каждое срабатывание энкодера навводим поравок не учитывая момент инерции вала. тут нужен эксперимент или готовый практик.
ну вот шим изменится а мотор по инерции крутится тогда в след раз шим ещё больше уменьшится а мотор продолжает медленно тормозит в итоге он затормозится слишком сильно и будет поправка на увеличение шима в итоге автоколебания
rig писал(а):ту т я имел в виду нечто другое, шим то изменится быстро а насколько быстро изменится скорость вала мотора . вот на изменение скорости и надо делать паузу в корректировках. иначе мы за каждое срабатывание энкодера навводим поравок не учитывая момент инерции вала. тут нужен эксперимент или готовый практик.
При составлении алгоритма было введено предположение что скорость вращения изменяется довольно быстро и блуждание относительно прямой будет незначительным. Если предположить что инерция большая, тогда стоит учитывать разность между имеющейся ошибкой и предыдущей и на основании этих данных увеличивать или уменьшать приращение коэффициента заполнения. В общем, не попробуешь - не узнаешь
Предлагаю сделать проще. Движки работают независимо друг от друга. Скорость задается временем сигналов от энкодера (speed_time): меньше время - быстрей крутится. Энкодер сидит на прерывании, при срабатывании выясняется за какое время пришел сигнал (encoder_time) и после сравнивания с тем, что задано делается коррекция ШИМом скорости. ШИМ корректируется методом Ньютона Грубо, без учета препятствий pwm_new = pwm_old * (encoder_time / speed_time)
То, что использовать в качестве скорости время между импульсами - согласен, но дело в том, что там может быть очень большой диапазон измерений, от мс до единиц секунд.