Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм работы системы управления
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
eugmai86
Добрый день форумчане,

Нужна ваша помощь в составлении алгоритма работы следующей системы на базе MEGA 32.
Система делает следующее:
1. меряет температуру в 3х точках с помощью датчиков DS18B20, и выводит на lcd дисплей, температура никак не обрабатывается и является чисто информационной.
2. меряет температуру 1 датчиком и в зависимости от температуры регулирует обороты двигателя с помощью симистора.
3. меряет температуру 1 датчиком и в зависимости от температуры регулирует мощность ТЭНа 1 с помощью симистора.

Всего в системе 5 датчиков ds18b20. 4 из них имеют разрядность 9 бит, 1 - 12 бит(для ТЭНа).

4. обработка "детектора нуля" и управление 2-мя триаками. (Так как нагрузка активно-индуктивная)
5. вывод значений мощности (ШИМ) тэна и мотора на lcd.


Собственно на данный момент разработана схема, вытравлена и распаяна. Схему не привожу ибо все просто. На данный момент меряю температуру 5-ю датчиками и вывожу на лсд, но процесс считывания занимает уйму времени в контроллере, около 3 с на один цикл для 5и датчиков. Собственно этот вариант не устраивает, так как совсем не остается времени для обработки детектора нуля и управления симисторами. Если кто то сталкивался с подобным, подскажите умную мыслю пожалуйста.

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

kovigor
Цитата(eugmai86 @ Aug 20 2013, 11:11) *
процесс считывания занимает уйму времени в контроллере, около 3 с на один цикл для 5и датчиков

Вы используете готовую библиотеку для работы с датчиками ? Вроде той, что поставляется с CodeVision ? Тогда все понятно. Наверное, придется написать свои функции для обмена с датчиком, такие, чтобы их можно было прерывать, приостанавливая обмен и выполняя какие-то другие задачи, когда это необходимо ...
eugmai86
да, использую стандартную библиотеку CV AVR...
kovigor
Цитата(eugmai86 @ Aug 20 2013, 11:37) *
да, использую стандартную библиотеку CV AVR...

Я не вникал в то, как она устроена, но едва ли ее функции можно прерывать, например, тем же таймером (чтобы выполнить что-то свое). Если можно, все не так плохо. Но вообще я бы сделал наоборот - реализовал бы обмен с датчиками без всяких готовых библиотек, с использованием прерывания от таймера, разместив в его обработчике машину состояний (т.е., цифровой автомат), реализующую обмен. А сами задачи разместил бы или в фоновом процессе, или в других обработчиках ...
MrYuran
1-wire замечательно вешается на свободный UART.
Кстати, как раз для AVR есть готовая аппликуха

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

Вот еще алгоритм по работе детектора нуля и симистора тоже до конца не понятен. Я прошеряю состояние перехода через ноль, в момент перехода, а точнее, за некоторое кол-во милисекунд я получаю импульс с детектора нуля, в этот момент я должен начать отсчет полупериодов, по 10мс на полупериод, и в зависимости от требуемой мощности пропускать например только четные для 50% мощности, или каждый 10 период для 10% мощности. я на правильном пути?
kovigor
Цитата(eugmai86 @ Aug 20 2013, 12:02) *
я на правильном пути?

http://cxem.net/mc/mc3.php
http://www.platan.ru/shem/pdf/brezenhem.pdf
eugmai86
спасибо, буду коварять
ArtemKAD
Цитата(eugmai86 @ Aug 20 2013, 12:02) *
Я прошеряю состояние перехода через ноль, в момент перехода, а точнее, за некоторое кол-во милисекунд я получаю импульс с детектора нуля, в этот момент я должен начать отсчет полупериодов, по 10мс на полупериод, и в зависимости от требуемой мощности пропускать например только четные для 50% мощности, или каждый 10 период для 10% мощности. я на правильном пути?

1) Считайте по два полупериода. Иначе получите постоянку на выходе.
2) Надеюсь ТЭНы маломощные... Иначе начнёт моргать свет.
Tanya
Перестаем засекать пересечение нуля - используем оптроны, которые сами это делают.
Тепловая инерция у Вас (отсюда видно) очень большая. Неизвестно, что лучше - резать синусоиду на куски, получая большие наводки (надо еще сильно заботиться о симметрии) или привыкать к мигающему немного свету.
kolobok0
Цитата(eugmai86 @ Aug 20 2013, 12:11) *
...процесс считывания занимает уйму времени в контроллере, около 3 с на один цикл для 5и датчиков...


при параллельном сканировании датчиков, можно получать температуру с любой точностью с энного кол-ва датчиков (зависит от кол-ва свободных ног) менее чем за 1 секунду. при этом можно фильтровать помехи(если требуется) и оценивать процент помех на линиях.
eugmai86
Цитата(ArtemKAD @ Aug 20 2013, 17:45) *
1) Считайте по два полупериода. Иначе получите постоянку на выходе.
2) Надеюсь ТЭНы маломощные... Иначе начнёт моргать свет.


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

Цитата(Tanya @ Aug 20 2013, 18:09) *
Перестаем засекать пересечение нуля - используем оптроны, которые сами это делают.
Тепловая инерция у Вас (отсюда видно) очень большая. Неизвестно, что лучше - резать синусоиду на куски, получая большие наводки (надо еще сильно заботиться о симметрии) или привыкать к мигающему немного свету.

можно по подробнее про оптроны с детектором нуля, это что то типа MOC306Х Инерция очень большая, поэтому требуется плавная регулировка. А что по поводу симметрии, значит ли это, что нужно симметрично пропускать или обрезать периоды? и в таком случае все равно не избежать помех?

Цитата(kolobok0 @ Aug 21 2013, 13:19) *
при параллельном сканировании датчиков, можно получать температуру с любой точностью с энного кол-ва датчиков (зависит от кол-ва свободных ног) менее чем за 1 секунду. при этом можно фильтровать помехи(если требуется) и оценивать процент помех на линиях.

под параллельным сканированием, насколько я понял, подразумевается сканирование каждого датчика висящего на разных ногах? но 1 с это тоже очень много, я просто не разобрался еще, можно ли обрабатывать прерывания при использовании стандартной библиотеки cvavr для ds18b20. Если можно, то 3 секунды нормально а 1 с еще лучше, а если нельзя использовать прерывание, то я не смогу дрыгать ногой триака, и как писали выше нужна своя функция для обработки датчиков. Для меня это пока оч сложно.
vgo1
Алгоритм Брезенхема более или менее ровномерно распределит периоды включённого состояния ТЭН-ов в общем количестве периодов цикла регулирования и заметно снизит моргание. Алгоритм красивый и простой, я сам когда то его реализал на MEGA8 для получения линейной интерполяции.
eugmai86
Цитата(vgo1 @ Aug 22 2013, 10:51) *
Алгоритм Брезенхема более или менее ровномерно распределит периоды включённого состояния ТЭН-ов в общем количестве периодов цикла регулирования и заметно снизит моргание. Алгоритм красивый и простой, я сам когда то его реализал на MEGA8 для получения линейной интерполяции.

если не трудно, поделитесь реализацией под мегу8
Tanya
Цитата(eugmai86 @ Aug 22 2013, 12:13) *
если не трудно, поделитесь реализацией под мегу8

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

Цитата(eugmai86 @ Aug 22 2013, 11:35) *
можно по подробнее про оптроны с детектором нуля, это что то типа MOC306Х Инерция очень большая, поэтому требуется плавная регулировка. А что по поводу симметрии, значит ли это, что нужно симметрично пропускать или обрезать периоды? и в таком случае все равно не избежать помех?

Если инерция большая, то плавная подача мощности не нужна. Скачки фильтруются тепловой инерцией - теплоемкостью. Если резать синусоиду, то помехи будут независимо от (необходимой) симметрии в момент включения тиристора. Самый плохой вариант - половинная мощность от максимума - когда включение происходит при максимальном напряжении.
kolobok0
Цитата(eugmai86 @ Aug 22 2013, 11:35) *
...каждого датчика висящего на разных ногах? но 1 с это тоже очень много....если нельзя использовать прерывание...


да, на разных ногах.
почти 1 секунда - это время необходимое для интеграции температуры на самих датчиках (почитайте даташит - станет понятнее).
про прерывания: Вы меня не поняли. само сканирование датчиков не на, что не влияет. Оно полностью в бэкграунде происходит. Основные критерии следующии: желательно частоту МК поднять повыше. Минимальная частота выполнения команд(не кварц!!), на мой взгляд (для такого подхода) это 2 и более МГц (x51 серия протаскивает на ура. На AVR ещё просче. На более мощных - совсем просто). Сам протокол топорный, но временные задержки надо соблюсти точно. Самая критичная задержка - это интервал между стробом чтения и считыванием данных слота (от 1 до 6 мкС). всё остальное уже менее критично.
eugmai86
да, все заработало в протеусе, буду пробовать в железе, спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.