dqxl1t0aqaave4 / act-photo Goto Github PK
View Code? Open in Web Editor NEWРегулятор освещенности; схемы, документы, отчеты, код.
Home Page: https://dqxl1t0aqaave4.gitbooks.io/wiki/content/
License: Apache License 2.0
Регулятор освещенности; схемы, документы, отчеты, код.
Home Page: https://dqxl1t0aqaave4.gitbooks.io/wiki/content/
License: Apache License 2.0
Добавить формат вывода PACKET
и переменную ввода PACKET
.
Состав пакета на вывод: <0 ADC1 ADC2 CUR_ERR INT_ERR PWM OCR2>
Здесь 0
-- байт со значением 0, отвечающий за выравнивание пакетов в потоке байтов (для детектирования старта пакета).
Состав пакета на ввод: <KP KI KS>
Требуется для организации визуализации и управления #41.
Требуется разработать программу для упрощения подбора коэффициентов регулятора и просмотра отладочной информации, работая непосредственно с COM-портом.
Программа должна иметь графический интерфейс и удовлетворять требованиям:
Для простоты ранее был предложен протокол общения с программой микроконтроллера (#33, #38), состоящий по большому счету из команд GET
и SET
. Поэтому с ним невозможно качественно реализовать независимые (параллельные) каналы передачи информации. Предлагается оставить все как есть для той же простоты. Переключение режимов вывода производить командой GET
.
Ввиду наличия большого количества промахов при делении потока байтов на пакеты программой controller-gui
, требуется дополнить пакет дополнительными данными.
Предлагается использовать контрольную сумму, расчет которой производить следующим образом:
checksum = delimiter ^ adc1 ^ (cerr & 0xff) ^ ocr2
Для уменьшения количества вычислений на микроконтроллере при подсчете контрольной суммы используются не все байты пакета.
Положить delimiter = 103
, поскольку 0
является "не слишком нейтральным" -- часто встречается в данных и мешает определению начала пакета.
Обнаружены следующие ошибки в коде:
safe_add
.owrite
и iread
в пользовательском коде вместо transmit
и receive
.Задача -- исследовать код на наличие наиболее очевидных ошибок.
Распиновка и преобразование уровней.
Исчерпывающая схема с полной распиновкой.
Включая:
Подведение итогов по аналоговой части.
При тестировании в реальных условиях обнаружилось, что имеется слабость в детектировании старта пакетов. Постоянно происходит срыв при приеме очередного пакета.
При необходимости придется менять протокол передачи данных, где разделитель пакетов, например, уже не будет константой, а будет, скажем, соответствовать номеру передаваемого пакета.
Обнаружена гонка по переменной iobuf_state
.
Причина -- раздельные блокировки во входном и выходном буферах, построенные на управлении прерываниями RX_COMPLETE
(для входного буфера) и DATA_REG_EMPTY
(для выходного буфера).
Пути устранения:
а) Разделение переменной iobuf_state
на ibuf_state
и obuf_state
.
б) Построение критической секции при помощи управления глобальными прерываниями.
Наиболее привлекателен первый путь, поскольку позволяет организовать максимально параллельную работу приемника и передатчика USART.
Инициализация была списана с даташита бездумно, а конкретно значение fosc
. Это подтолкнуло к следующим изменениям.
fosc
(макрос)Baud Rate
(макрос)S-8-P-St
, а не S-8-St
.Для обеспечения большей отказоустойчивости при передачи большого числа данных по интерфейсным портам отказаться от вложенных прерываний, заменив к тому же использование критических секций, построенных над конкретными типами прерываний, меньшими по размеру глобальными критическими секциями.
Распиновка и преобразование уровней.
ПИД-регулятор, Пропорциональный интегрально-дифференцирующий регулятор -- один из простейших статических регуляторов с обратной связью.
Его простейшая форма -- ПИ-регулятор -- представляется уравнением регулятора:
u[n+1] = K_p e[n] + K_p K_i T sum_(m=(n-M)..n) e[m]
где u[n+1]
-- вычисленная величина следующего управляющего сигнала, e[n]
-- текущая статическая ошибка регулирования, определяемая как разность e[n] = f[n] - f[n-1]
, f[n]
-- обратная связь -- текущее значение управляемой величины, M
-- "размер" памяти системы.
Коэффициенты K_p
и K_i
, а также M
-- параметры ПИ-регулятора. В сумме они задают степень "инертности" регулятора, т.е. направленность регулирования в сторону большей чувствительности к мгновенным изменениям значения управляемой величины или в сторону большей чувствительности к общей тенденции изменения величины.
(За уточнением формулы и ее трактовки следует обратиться к ТАУ.)
Основная проблема программной реализации алгоритма заключается в отсутствии в ATmega8A
аппаратной поддержки вычислений с плавающей точкой. Поддержка реализована посредством компилятора, а значит крайне не эффективна. В то время как операции с целыми числами выполняются за один такт, операции с плавающей точкой могут выполняться десятки тактов. Поэтому требуется реализовать алгоритм регулятора в целых числах.
При реализации алгоритма следует помнить о разрядности int
, равной 16, а не 32 бит. Соответственно, диапазон значений int
в ATmega8A
есть -32768..0..+32767
, что есть крайне мало. Для того, чтобы не наступило переполнение типа при суммировании, требуется ограничится достаточно малым M
и достаточно малыми K_p
, K_i
.
Также следует понимать, что допускается понижение точности данных с 10-разрядного АЦП с целью увеличения возможного качества регулирования путем отбрасывания нескольких младших из 10 значимых разрядов получаемого кода (побитовый сдвиг вправо на s+1, что эквивалентно делению на 2^s).
Реализовать алгоритм ПИ-регулирования:
Требуется изменить имеющуюся функциональность для обеспечения записи в буфер массива данных и чтения из буфера массива данных указанной длины.
Пример:
bool receive(void *buf, byte n);
bool transmit(const void *buf, byte n);
byte buf[16];
bool success = receive((void *) buf, 16);
if (success) // input buffer actually contained 16 bytes
const char *buf = "Hello, World!!!!";
bool success = transmit((const void *) buf, 16);
if (success) // output buffer actually has at least 16 bytes free
Реализовать алгоритм последовательной подачи сигналов на ножки микроконтроллера с целью получения правильной осциллограммы с в данный момент действующей ножки и ни с каких других.
Идея -- поочередная десятисекундная подача ~0.1-10kHz на каждую ножку.
При разработке кода была надежда на то, что глобальные прерывания разрешаются автоматически. Но при тестировании выяснилось, что этого не происходит.
Необходимо разрешать прерывания самостоятельно.
Исправить в главном коде и в коде теста.
Все работы по части пайки и монтажа.
Требуется реализовать запросно-ответный механизм по принципу функционирования командной строки.
Программа должна отвечать человекочитаемыми строками на запросные команды. Пример:
> help
hello! usage:
> `help` print this help again
> `get-adc` get the current values measured by ADC per channel
> `get-reg` get register statuses
> `set-coefs k1 k2 k3` set the current coefficients of the PID controller algorithm
> get-adc
adc1=1235 adc2=562
> set-coefs 1 2 3
was 1 4 2
Если команда пришла по SPI, ответ тоже должен уйти по SPI.
По реализации: необходимо добавить обработку команд, лежащих в кольцевых буферах, в цикл обработки сообщений.
Перенести общий код /tools
в act-common
.
Снять направленность буферов только на USART
. Распространить и обобщить.
Грубо говоря, USART API
→ IO API
.
Были обнаружены серьезные ошибки при тестировании controller-gui
с реальным прибором. Пока неизвестно, с чем это связано. Есть предположение, что проблема в коде под микроконтроллер, поскольку при тестировании controller-gui
его работа сомнений и опасений не вызывала.
Вызывает сомнение участок кода, ответственный за формирование пакетов (ссылка):
byte packet[11] = {
103,
adc1,
adc2,
((unsigned int) cur_err) >> 8, cur_err & 0xff,
((unsigned int) int_err) >> 8, int_err & 0xff,
((unsigned int) pwm) >> 8, pwm & 0xff,
OCR2
};
packet[10] = packet[0] ^ packet[1] ^ packet[4] ^ packet[9];
Оно не было протестировано и отлажено. Есть подозрение на то, что проблема заключается в неявном приведении типов.
Также следует пересмотреть код USART API
. Пересмотр войдет в другое давно заведенное #42.
Поскольку доступа к прибору больше нет (а регулятор все-таки был настроен вручную), было решено эту проблему не устранять.
В каждом README.md
должно быть указано полное назначение проекта, его API, если он таковое предоставляет, инструкции по эксплуатации. Либо произведена отсылка к соответствующему разделу WIKI.
Реализовать примерное описание необходимых материалов для реализации платы, приложить схемы, результаты моделирования, дополнительные материалы.
Программно-управляемый обмен информацией необходим в целях:
ATmega8A
не имеет встроенных механизмов отладки)Следует помнить, что USART
-- низкоуровневый небуферизированный протокол, основанный на прерываниях. Поэтому необходима реализация входного и выходного буферов. Предлагается использовать циклические буферы.
USART
Baud Rate - 9600; Frame Format - S+8+1+St
Реализовать переезд общих материалов в надрепозиторий. Включить его в данный в качестве субмодуля. Цель -- переиспользование материалов в других аналогичных проектах.
Еще раз пересмотреть код, осуществляющий управление. Произвести попытку упрощения этого кода.
Timer/Counter
и Waveform Generator
для генерации ШИМ частоты ~5kHzНаписание отчета по проделанной работе.
Требуется подставить уже имеющиеся кольцевые буферы под SPI и I2C. Для этого необходимо снаяала активировать сами эти интерфейсы и поставить их на прерывания.
Обмен по I2C скорее всего можно реализовать в slave-multicast-режиме, отправляя все данные на multicast-адрес, однако это требует уточнения, поэтому лучше завести соответствующий #define
.
В ходе тестирования не было обнаружено ни одного случая потери передаваемых по USART данных. В силу этого формат команд и передаваемых данных можно серьезно упростить.
Требования:
Предлагается следующий протокол обмена данными:
METHOD
: 1 байт, SET
(1) / GET
(0).VARIABLE ID
: 8 байт, номер переменной.VALUE
: 1-2 байта, значение переменной (только при METHOD == SET
).Примеры: 1 7 65535
, 1 0 255
, 0 0
.
При METHOD == GET
приложение само решает, передавать ли значение переменной однократно или непрерывно.
При тестировании работы схемы был выявлен очень низкий уровень поступающего на АЦП сигнала (первый входной канал (PC0
/ADC0
/23-pin
)). Необходимо разобраться в причине.
Предполагалось, что на выходе преобразователя напряжение-ток (цепь Diode-
→R1
→R2
→TL084 Out
, Diode-
→TL084 In-
, GND
→TL084 In+
) будет наблюдаться потенциал ~1V
, а на АЦП он будет поступать усиленный в ~2..3 раза.
На данный момент имеется следующий вариант платы, соответствующий разводке 9e05c59.
Распиновка и преобразование уровней.
Требуется произвести переход от библиотеки C++
DLIB
к библиотеке C
CLIB
.
Соответствующее даташитам на светодиод масштабирование выхода микроконтроллера.
Поскольку коэффициенты в виде степени двойки крайне грубо позволяют задать коэффициенты регуляции, следует предоставить возможность установки коэффициентов регуляции более точно.
Из-за отсутствия в микроконтроллере поддержки чисел с плавающей точкой следует найти компромиссное решение, позволяющее быстро получать требуемый результат.
В качестве такого решения предлагается передавать два числа, M
и d
, и учитывать их следующим образом: R = (S * M) >> d
, где S
-- исходный масштабируемый сигнал, R
-- результат масштабирования. Относительная точность такого подхода будет достаточно велика.
а) Линии на графиках слишком тонкие.
б) Динамически изменяемые пределы рисования вредят качественному отображению.
Описать структуру и назначение репозитория в readme.md
.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.