Перейти к содержанию

Проект Стиральной Машины На Atmega32


kuzmich

Рекомендуемые сообщения

Здраствуйте. Нашел в сети проект стиралки на Atmega32, сделал набросок проекта в Proteus чтоб поглядеть что к чему. Замотался со фьюзами выставлять на внешний кварц 16 мгц в итоге выставил все по дефолту экран зажёгся но в предупреждениях протеуса пишет что то hd44780 controller recived data whilst busy . attempted to read after writing a single nible и на экране ничего нет. Кто поможет?

Ссылка на комментарий
Поделиться на другие сайты

Чтобы поставит диагноз, нужны:

1) скриншот схемы

2) скриншот digital graph с установленными probes на каждом из управляющих выводов индикатора и на шине data

Ссылка на комментарий
Поделиться на другие сайты

Может изза того что частота не верная на микроконтроллере протокол обмена с lcd работает не верно. Тайминги слишком большие и инициализация дисплея должным образом не происходит. Но я сомниваюсь что и это эмулируется. Попробуйте выставить верную частоту. Что мешает это сделать? Заходите в свойсва мк и из выпадающего меню выбираете частоту и выставляете в требуемую.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здраствуйте. Нашел в сети проект стиралки на Atmega32, сделал набросок проекта в Proteus чтоб поглядеть что к чему. Замотался со фьюзами выставлять на внешний кварц 16 мгц в итоге выставил все по дефолту экран зажёгся но в предупреждениях протеуса пишет что то hd44780 controller recived data whilst busy . attempted to read after writing a single nible и на экране ничего нет. Кто поможет?

В протеусе просто укажите частоту в свойствах процессора.

А по существу, ошибки в программе.(файлы для работы с LCD рабочие, сам такими пользуюсь)

Пишите все сами, будет проще чем разобратся с чужой программой.

Изменено пользователем codenamehawk
Ссылка на комментарий
Поделиться на другие сайты

Могу предложить помощь другого характера:

У самого сейчас стоит труп сма самсунг со сгоревшим процессором. Собираюсь собрать свой блок автоматики на меге16+дисплей 16х2+пара тройка светодиодов до кучи. В данный момент разбираюсь с датчиками. Точнее с тахогенератором. Проблем вроде не должно быть - осталось в железе собрать и проверить сколько импульсов он отдает при обороте вала на 360градусов. Потом рассчитаю импульсы на полный оборот барабана - буду котролировать скорость. С остальным проблем вообще нет. Могу держать вас в курсе дел и делиться наработками и прошивками. Скажу сразу планирую сделать в течении месяца, так как занимаюсь в свободное время, а его увыне очень много. Если есть интерес - предлагаю переместться для начала в личку. Одна голова хорошо- а две лучше.может совет какой дадите, может я чем помогу.

Ссылка на комментарий
Поделиться на другие сайты

Это замечательно VipAndrey! Тогда жду в личке у себя файлы которые у вас имеються касательно стиралки. И продолжаем дальнейшее общение там.

Ссылка на комментарий
Поделиться на другие сайты

Могу держать вас в курсе дел и делиться наработками и прошивками... Если есть интерес - предлагаю переместться для начала в личку...

Может быть сюда стоит писать, думаю всем интересно будет.

Ссылка на комментарий
Поделиться на другие сайты

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

Во вторых - с силовой частью разбираться не буду. Т.к. есть уже готовая - т.е. необходимо управлять ею логическими уровнями: т.е. подал лог.1 на вход помпы - она заработала, лог.1 на вход ТЭН - и он заработал. Вообщем все в таком же духе. Если будет интерес и в этой части схемы - чтож - установлю протеус и сделаю там схему.

Силовой блок упраления в моей реализация принимает\передеает следующе

1. Стабилизированные +5В для питания всей низковольтной части (мк, дисплей и тд)

2. Сигнал с термистора в баке.

3. Лог.1 при ключении машинки в сеть - на случай если буду делать дежурный режим и программу отложенной стирки по времени.

4. Лог уровень при перегреве двигателя.

5. Сигнал с Таходатчика.

6. Сигнал с пресостата(уровня воды баке)

Замечу что все сигналы уже в логике 5в.

Принимает же блок следующие комманды (опять в логике):

1. Комманда hi-speed.

2. Сигнал на подачу воды через кран main.

3. Сигнал на запуск помпы(откачку воды).

4. Сигнал к закрытию люда двери.

5. Сигнал к запуску двигателя барабана (управляться будет черезм ШИМ на мк)

6. Сигнал на включение реверса мотора.

7. Сигнал на подачу воды через кран pre valve.

8. Сигнал на включение ТЭНа.

9. Сигнал на включение главного реле - тоесть подключения всех исполнительных устройст к сети - в случае серьезной ошибки можно мгновенно обесточить их все.

10. И сигнал на баззер.(пищалку). Она находится тоже на силовой части.

В дв3х слова: сигналы отвязанны от 5в с помощью транзисторных ключай и реле и с помощью ключа uln20003.

Так что если будут проблемы с созданием силовой части - помогу. Но повторюсь - хотелось бы сделать упор на плату управления с мк. Так как тема здесь именно об этом.

Ссылка на комментарий
Поделиться на другие сайты

Итак, прогресс следующий:

Определился с микросхемой мк, точнее с портами i/o.

Раскидал пока на бумаге будущее назначение выводов:

PORTA - дисплей + PORTA.3 - Вход с термистра.

PORTС

0 - Подсветка дисплея (Обычный транзисторный ключ).

1 - Светодиод (планирую чтобы кнопка старт загоралась при работе машинки в режиме стирки)

2 - Выход на исп. устройство - подача воды предварительной стирки (через первое отделение для взятия порошка)

3 - Выход на исп. устройство - подача воды при основной стирки (через второе отделение)

4 - Выход на исп. устройство - закрыть замок.

5 - Выход на исп. устройство - включить помпу. (откачать воду).

6 - Выход на исп. устройство - включить ТЭН.

7 - Выход на исп. устройство - включить главное реле.

PORTD

0 - Rs232 Rx - пока в резерве - ибо в планах по воздуху передавать состояние процесса стрирки сразу на пк + правка некоторых программ.

1 - Rs232 Tx - аналогично пункту выше ;)

2 - Вход от тахогенератора.

3 - Вход от пресостата (Датчика уровня воды) (У меня он выдает частоту в зависимости от кол-ва воды).

4 - Выход на исп. устройство - включить реверс двигателя.

5 - Выход на исп. устройство - реле hi-speed.

6 - Выход на исп. устройство - спикер.

7 - Вход от датчика перегрева двигателя (лог1 - все ОК, лог0 - перегрев)

PORTB

0 - Вход кнопки №1

1 - Вход кнопки №2

2 - Вход кнопки №3

3 - Выход ШИМ сигнала на двигатель.

4 - Вход кнопки №4

5 - Вход кнопки №5

6 - Вход кнопки №6

7 - Вход кнопки №7

Итак мысли какие: кнопки конечно же можно было повесить на одну линию ADC - Но что-то как то мало доверия - всё-таки повышенная влажность и всё такое - поэтому проще каждую отдельно с резисторами подтяжки на +5В. Стабильнее будет ;)

Про подключение датчиков:

1. Термистор - смотрим прилепленное изображение.

2. Проверка двигателя на перегрев - всё просто - перегрев лог 0. норм работа лог.1.

3. тахо - так же прилепленна схема.

4. уровень воды- пресостат - в моем варианте просто - на крайние из трех концов торчащих из него +-5в а средний выход сразу к мк, + сглаживающие кондеры в 0.1мкф.

Вроде пока как-то так ;)

Теперь надо нарисовать и сделать плату ;)

post-108742-0-84355800-1328113178_thumb.jpg

post-108742-0-39803200-1328113184_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

1. Термистор - смотрим прилепленное изображение.

2. Проверка двигателя на перегрев - всё просто - перегрев лог 0. норм работа лог.1.

Не уверен, но схема кажется странной. По такой схеме всего лишь соединение ноги контроллера с "+" питания через 2 резистора. Причем вне зависимости от номинала на выводе будет лог.1. Логичнее было бы сделать резистивный делитель, подключенный либо к АЦП (точное значение температуры), либо к AIN (точное превышение порога), либо к PIN (неточное превышение порога). Или к одному конденсатору и AIN/PIN (программный АЦП).

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1. Термистор - смотрим прилепленное изображение.

2. Проверка двигателя на перегрев - всё просто - перегрев лог 0. норм работа лог.1.

Не уверен, но схема кажется странной. По такой схеме всего лишь соединение ноги контроллера с "+" питания через 2 резистора. Причем вне зависимости от номинала на выводе будет лог.1. Логичнее было бы сделать резистивный делитель, подключенный либо к АЦП (точное значение температуры), либо к AIN (точное превышение порога), либо к PIN (неточное превышение порога). Или к одному конденсатору и AIN/PIN (программный АЦП).

Типовая схема включения в схеме к сма. Думаю если там контроллер ацп мерил, то и я смогу. Вкрай заменю конденсатор резистором.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Итак проект не встал.

На сегодняшний день сделал несколько шагов вперед.

1. Сделал, запаял плату с контроллером.

2. Пришлось переделывать штатную высоковольтную плату. Ибо при детальном рассмотрении оказалось что гальванической развязки увы небыло. На массе сидит фаза. Сделал новую - развязал через оптопары. moc3162 - помпа, налив1, налив2. moc3023 - двигатель, uln2001- гл. реле, тен, реверс.

3. Спаял обе платы - приступил к написанию кода. пишу в cvavr

4. Очень долго мучался с фазоимпульсным управлением двигателя.Для этого пришлось включить в схему детектор перехода фазы через ноль. Только после этого заработало. Беда в том- что очень долго искал по городу где купить оптопары.

5. 2 дня мучался с пресостатом(датчиком уровня воды) - оказалось - он был сгоревшим. Хорошо в течении 2х часов нашел замену. Теперь умею определить кол-во воды в баке. Погрешность около 100мл.

6. день мучался с алгоритмом измерения скорости: очень большая инерция у барабана с бельем. поэтому просто подать значение мощности на мотор не помогает - при разном кол-ве белья либо барабан не крутиться - либо крутиться но с ускорение и белье прилипает к стенкам. Вообщем вопрос ко всем:

имеем: 1. Значение мощности, которое можем подать на мотор. 2- скорость с таходатчика (рассчитывает кол-во импульсов пришедших за промежуток времени). Теперь как это связать, если например необходимо крутить барабан с заданной скоростью. Что пробовал: отключать вообще мотор при привышении заданных оборотов. Не понравилось - звук у мотора, как будто его насилуют ). Пробовал в зависимости от оборотов играть переменной мощности. Тут сказывается слишком большая инертность. Мощность у меня в 255 градациях. Тоесть может принимать 255 значений. Так вот - пример: мотор стоит(не хватает мощность) - к примеру тек. значение мощности: 180. начинаю поднимать - 179 - стоит - 178 - стоит ... 173 - опа. начал крутиться. через 1-2 сек обороты уже раза в три больше требуемых. В моем втором алгоритме - как только обороты превысят требуемый промежуток - начинаю понижать мощность. по одному. в итоге приходиться понижать опять до 180, чтобы хоть как успокоить мотор. через 1-2 сек- он встает. и так далее... вообщем плюнул: написал третий способ: пришел к выводу, что раскутить легче, чем остановить. поэтому если скорость 0 - прибавляю значение мощности сразу на 5. Если скорость больше на 70 оборотов требуемых - отнимаю сразу 3 единицы мощности. Если больше, но не больше 70 - отнимаю по 1 единице. Если меньше обороты заданных - прибавляю мощность по одной. Работает. Но чтото красоты в коде не вижу, и подозреваю что есть более гуманный вариант. Вот и хотелось бы послушать ваши мысли по этому поводу.

Напишу что осталось: брать показания терморезистора и вычислять температуру воды в баке. тен включить не проблема.

И самое важное - найти в городе реле для реверса двигателя сдвоенное - то что было - при проверке оказалось что не работает одна контактная группа. а надо обе.

Ссылка на комментарий
Поделиться на другие сайты

Сейчас ради интереса вызвал функцию read_adc - и о чудо - пришла температура с терморезистора. Причем насколько я успел понять - значение линейное - и соответствует текущей температуре: холодная вода из под крана - по значению 20 градусов, нагрел теном до значения - 36 - рука разницу не чувствует. до 70 - терпит но не долго. делаю вывод что если и калибровать - то значения не сильно упляшут. надо обзавестись китайским тестером с терморезистором - и по нему откалибровать.

так что осталось только реверс наладить и придумать алгоритм раскладки белья перед отжимом. и можно саму программу стирки писать с настройками самих программ.

Ссылка на комментарий
Поделиться на другие сайты

Вот схема силовой части, по оптопарам отписал какие нужны. симисторы - BT138Х. Остальное вроде сходиться. просто рисовал для себя - на значения внимания не обращал - главное картинка №)

Радиатор только на тот симистор - который крутит мотор- чем больше - тем лучше, и на стабилизатор +5в небольшой.

Вот фото силового блока. Тот что в железе. Радиаторы поставил на все 4 симистра. В будующем один заменю на более мощный - место в корпусе благо есть. Снизу поверх дорожек, по которым идёт 220 напаял проволку, чтобы ток большой держали. Печатку не привожу - каждый сам сделает под свои размеры - если нужно будет.

*** внимание - обнаружил на схеме опечатку. все 3 конца реле идут не на массу - а на +12В. Помню еще на плате дорожку пришлось резать и на +12В закидывать. Перерисовывать влом.

post-108742-0-91497000-1329939755_thumb.jpg

post-108742-0-01529500-1329940309_thumb.jpg

Изменено пользователем VipAndrey
Ссылка на комментарий
Поделиться на другие сайты

Итак, по моему вопросу никто не откликнулся. Так вот в ходе экспериментов протестировал с десяток своих придуманных алгоритмов - ни один не подошел.

Пришлось прибегнуть к литературе.

Начал изучать основы пропорционально-интегрально-дифференциального регулятора.

Оказалось только название страшит, сколько сам алгоритм. К слову сказать идеально подошел для коллекторного мотора с таходатчиком.

После написания его в коде и испробовав - превзошли все мои ожидания. Сейчас попробую описать как действовать при обсчете данного алгоритма.

Итак приступим.

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

Теперь остановимся на просчете самого этого временного промежутка. Плясал я от того - какое максимальное время между импульсами выдает тахогенератор при минимальном вращении барана. Замерил экспериментальным путем. Именно: настроил таймер1 на частоту 125000Кгц. В прерывании от тахогенератора останавливаю таймер - сохраняю значение таймера в переменную, обнуляю таймер и снова запускаю его. В основном цикле программы показываю эту переменную на дисплее. Так же с кнопок могу управлять мотором фазо-импульсным способом. Тоесть либо подавать на него всю мощность, либо 1% мощности с шагом 1. Тоесть в моем управлении 220 градаций с шагом 1Вольт на мотор. Итак... Заливаю в МК. Подключаю. Устанавливаю мощность на моторе кнопками минимальную для минимального вращения барабана. тут один ньюанс: при очень маленьких оборотах сигналы с таходатчика перестают поступать вообще. но такие обороты никогда не понадобяться. Отсюда выставляем такие обороты при которых начинают поступать сигналы. Поступают... Смотрим значение переменной на дисплее. У меня получилось 6000. Это говорит нам о том, что каждые 6000 тиков таймера нам поступаю импульсы с тахогенератора.

Другими словами мы узнали верхний предел отсчета таймера - это 6000 тиков. в hex это 1770.

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

Поэтому будем обсчитывать алгоритм через 5000 тиков таймера запущенного на частоте 125000КГц.

Запомним эти значения.

Теперь необходимо просчитать максимальную скорость мотора при полной приложенной мощности к нему.

Для этого настраиваем таймер1 другим способом.

Таймер тикает на частоте 125000Кгц

Создаем 2 прерывания по совпадению: первое - 0х1388 (в дес. 5000), второе 1770. Сразу вспоминаем откуда я взял эти числа.

В теле прерывания по первому совпадению таймера1 приравниваем к переменной допустим taxo значение переменной imp.

Чуть позже я обьясню что это за переменные, для начала обьявляем их глобальными unsigned int.

В теле прерывания по второму совпадению таймера1 приравнием переменную imp к нулю.

В теле прерывания от тахогенератора инкрементируем переменную imp.

В основном теле программы выводим на дисплей значение taxo.

Как не сложно догадаться - imp - просто счетчик импульсов с генератора, а в taxo один раз за отведенный промежуток скидываются кол-во импульсов, пришедших за этот промежуток - в данном случае за 5000 тиков.

Заливаем в мк. подключаем. выставляем значение мощности мотора на 220 единиц и запускаем мотор.

Ждем пока он раскрутит барабан до максимума и записываем показания taxo с дисплея. В моем случае это было число 73.

Т.о. 73 говорит о том, что мы можем написать аглоритм с 73ю шагами регулировки скорости мотора.

Продолжение следует...

Так же в ходе предыдущего эксперимента нам необходимо замерить время до полной раскрутки барабана. от 0 для полного хода. Никакими точными приборами я не пользовался кроме наручных часов. В моем варианте время полной раскрутки составило около 8 секунд. точность в -+1 секунды не сыграют особой роли.

Итак подведем промежуточные итоги:

Максимальная скорость: 73 условные единицы.

Время полной раскрутки барабана: 8 секунд.

Прем дальше...

Далее необходимо рассчитать все три константы. тоесть пропорционально, интегрального и дифференциального звена.

Пропорциональная константа рассчитывается по формуле (Тм+Тэ)/(Тж*Кдв), где

Тм - время до полного разгона/5.

Тэ = Тм/10

Тж = Тм

Кдв = Uxx/Un, где Un - максимальная величина напрямения(мощности) в условных единицах. В моем варианте это значение 220, а Uxx - максимальная скорость мотора (в моем варианте это 73 условные единицы).

Подставив наши значения в формулу получаем число равное 3.315

Интегральная константа расчитывается:

1/(Tж*Кдв). Все значения имеются. считаем. получилось 1.88

Дифференциальная константа:

(Тм*Тэ)/(Тж*Кдв) - тут всё так-же. подставляем, считаем. получилось 0.48

Продолжение следует...

Ссылка на комментарий
Поделиться на другие сайты

Теперь вернемся к основам алгоритма. Итак мы выяснили, что просчет алгоритма будет происходить каждые 5000 тиков таймера.

Первым действием нам нужно обработать сумматор обратной связи. Он из себя представляет формулу вида:

E=Vзаданная-Vтекущая.

где 2 скорости - первая заданная,вторая текущая на данный момент.

Дописываем в тело прерывания по первому совпадению после taxo=imp;

строчку вида E=skorost-taxo; переменную E обьявляем как signed char в теле прерывания.

Так как она у нас будет принимать значения от -73 до +73. Почему именно так? Мы вычислили, что максимум будет 73 градации скорости. А желаемая скорость может отличаться от фактической как раз на эти 73 условные единицы. Как раз -73 и получается или +73 когда надо экстренно остановить барабан.

Далее будем подключать каждую составляющую отдельно. Итак, чтобы подключить пропорциональное звено вернемся к основам:

Yn = E * Кп, где слева-направо - само значение мощности в у.е., сумматор обратной связи, константа пропорционального звена.

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

мы знаем, что E будет принимать значения от -73 до +73. Знаем константу. Поэтому можем посчитать значение Yn для каждого значения E.

Этим и займемся. но считаем не от -73, а от 0. Итак посчитали. Теперь все, что выше 220(у нас же 220 у.е. мощности) округляем до 220. Все что с точкой - округляем до целого. И заносим всё это в массив. В моем варианте это выглядит сл. образом:

//Константа пропорционального звена.

unsigned char Yn[74]={

0,3,7,10,13,17,20,23,27,30,33,36,40,43,46,50,53,56,60,63,66,70,73,76,80,83,86,

90,93,96,99,103,106,109,113,116,119,123,126,129,133,136,139,143,146,149,152,

156,159,162,166,169,172,176,179,182,186,189,192,196,199,202,206,209,212,215,

219,220,220,220,220,220,220,220};

Готово. Теперь попытаемся подключить само звено в прерывании.

Для этого дописываем код:

if (E<0) {E=0;}

для чего? Если значение отрицательное - то нужно тормозить двигателем меня полярность обмоток. Нас мотор этого не умеет, поэтому максимум что он может - это принять на себя 0% мощности и по инерции остановиться.

Далее приравниваем к переменной мощности наше значение из массива:

speed=Yn[E];

В основном теле программы пишем код, который при нажатии на 2 кнопки будет инкрементировать, либо декрементировать переменную skorost, как как именно её мы выбрали для значения желаемой скорости. но следим, чтобы она не приняла значение больше 73 у.е. и меньше 0. тоесть не кувыркнулась в 255.

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

Продолжение следует...

Ссылка на комментарий
Поделиться на другие сайты

Итак, продолжаем. Подключаем интегральное звено:

Рассчитываем скорость по следующей формуле:

Yi=Ки*t*S, где

Ки - Константа интегрального звена.

t - такт рассчета, у нас он равен 5000, тоесть 5000 тиков при работе таймера на частоте 125000Кгц выполняются за 0,04сек. Думаю сами разберетесь как рассчитать время выполнения тиков.

S - это глобальная переменная со знаком минус signed int S; которая аккумулируется с самого начала работы мотора.

Аккумулируется она до заданных пределов. А именно от -73 до +73. Так же необходимо соблюдать условия, чтобы она не вышла за эти пределы.

Аккумулироваться S будет после обработки интегрального звена следующим способом:

S=S+E;

if (S>73) {S=73;}

if (S<-73) {S=-73;}

тут всё просто.

Итак, все значения формулы нам известны, тоесть мы знаем Ки, время, и значения принимаемые S. Составим так же таблицу, с такими же правилами округления и ограничения до максимальной величины мощности. Мой вариант:

//Константа интегрального звена.

unsigned char Yi[74]={

0,1,2,2,3,4,5,5,6,7,8,8,9,10,11,11,12,13,14,14,15,16,17,17,18,19,20,20,21,22,

23,23,24,25,26,26,27,28,29,29,30,31,32,32,33,34,35,35,36,37,38,38,39,40,41,41,

42,43,44,44,45,46,47,47,48,49,50,50,51,52,53,53,54,55};

signed int S;

//Константа дифференциального звена.

Теперь подключим звено в прерывании.

Для этого стираем нашу предыдущую запись if (E<0) {E=0;}; speed=Yn[E];

и дописываем после E=skorost-taxo;

следующий код:

Ep=E;

if (Ep<0) {Ep=0};

if (S+E>73) {S=73;} else {S=S+E;};

if (S+E<-73) {S=-73;} else {S=S+E;};

if (S<0) {S=0;};

тут мы также не даем S залезть в минус, так как тормозить будем всё также: по инертности.

Да, чуть не забыл, S,Ep,Y так же обьявляем в прерывании как signed int.

после этого дописываем:

Y=Yp[Ep]+Yi;

Компилируем, прошиваем, тестируем...

Работа стала еще лучше. Тоесть барабан крутиться с заданной скоростью. при загрузке бельем либо наливанием воды - он поднимает скорость и продолжает контролировать обороты. Когда белье плюхается вниз а барабан скатывается по инерции ты продолжаем контролировать скорость. Одно до - когда скорость барабана опускается практически до нуля нет резкого старта, а происходит медленный разгон. Тут нам поможет Дифференциальное звено ;))

продолжение следует...

Подключаем мы его по аналогии с теми двумя. поэтому на нем останавливаться не буду:

считаем по формуле:

Yd=(Кд/t)*(E-Eo);

где:

Кд - коэффициент.

t - такт рассчета, уже считали, знаем равен 0,04сек.

Е - проходили ;)

Ео - что-то новенькое ;) Это предыдущие показания E всего навсего ;)

Так же выделяем (Е-Ео) - опять таки ограничиваем границы от -73 до +73.

(Кд/t) считаем - получаем 12.

упрощаем

Yd=12*(E-Ео).

Считаем так же таблицу, мой вариант:

//Константа дифференциального звена.

unsigned char Yd[74]={

0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,220,220,220,

220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,

220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,

220,220,220,220,220,220,220,220,220,220,220,220,220,220};

signed int Eo;

приписываем код в обработчике до:

Y=Yp[Ep]+Yi;

Ei=taxo-Eo;

if (Ei<0) {Ei=0;};

if (Ei>73) {Ei=73;};

Eo=taxo;

и меняем саму Y=Yp[Ep]+Yi; на Y=Yn[Ep]+Yi+Yd[Ei];

вообщем должно получиться:

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

signed char E,Ep;

signed int Y,Ei;

// Place your code here

taxo=imp2;

//Тут у нас обработчик PID

E=skorost-taxo;

Ep=E;

if (Ep<0) {Ep=0};

if (S+E>73) {S=73;} else {S=S+E;};

if (S+E<-73) {S=-73;} else {S=S+E;};

if (S<0) {S=0;};

Ei=taxo-Eo;

if (Ei<0) {Ei=0;};

if (Ei>73) {Ei=73;};

Eo=taxo;

Y=Yn[Ep]+Yi+Yd[Ei];

if (Y<0) {Y=0;};

if (Y>220) {Y=220;};

speed=Y;

}

Прошиваем и радуемся...

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

Ссылка на комментарий
Поделиться на другие сайты

Итак, подведу итоги:

Что же умеет на данном этапе машинка:

1. Наливать с двух кранов.

2. Выливать воду.

3. Измерять кол-во налитой воды с точностью до 100мл.

4. Включать ТЭН.

5. Измерять температуру воды в баке.

6. Крутить барабан с заданной скоростью при любом кол-ве белья.

7. Включать реверс мотора.

Что осталось сделать:

1. В поисках алгоритма по укладке белья перед отжимом. и определении в этом алгоритме - до какой максимально скорости возможно произвести этот самый отжим.

(Если кто-то на этот раз готов помочь - в личку. заранее спасибо. Но сдается мне помощи от данного форума не увидеть.)

Изменено пользователем VipAndrey
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...