Giter Club home page Giter Club logo

act-photo's People

Contributors

kalaider avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

act-photo's Issues

Дополнить протокол обмена данными по USART

Добавить формат вывода PACKET и переменную ввода PACKET.

Состав пакета на вывод: <0 ADC1 ADC2 CUR_ERR INT_ERR PWM OCR2>

Здесь 0 -- байт со значением 0, отвечающий за выравнивание пакетов в потоке байтов (для детектирования старта пакета).

Состав пакета на ввод: <KP KI KS>

Требуется для организации визуализации и управления #41.

Разработать программу для упрощения подбора коэффициентов регулятора

Требуется разработать программу для упрощения подбора коэффициентов регулятора и просмотра отладочной информации, работая непосредственно с COM-портом.

Программа должна иметь графический интерфейс и удовлетворять требованиям:

  1. Выбор COM-порта из списка доступных и его автоматическое конфигурирование.
  2. Ввод коэффициентов регуляции, их пересчет и отправка на микроконтроллер. Получение ответа.
  3. Вывод выбранных графиков, текущих значений выбранных параметров.

Для простоты ранее был предложен протокол общения с программой микроконтроллера (#33, #38), состоящий по большому счету из команд GET и SET. Поэтому с ним невозможно качественно реализовать независимые (параллельные) каналы передачи информации. Предлагается оставить все как есть для той же простоты. Переключение режимов вывода производить командой GET.

Разводка схемы

  • Микроконтроллер
  • Входной каскад
  • Выходной каскад
  • Интерфейсные выводы
    • RS-232
    • SPI
    • I2C

Изменить формат пакета передаваемых с микроконтроллера данных

Ввиду наличия большого количества промахов при делении потока байтов на пакеты программой controller-gui, требуется дополнить пакет дополнительными данными.

Предлагается использовать контрольную сумму, расчет которой производить следующим образом:

checksum = delimiter ^ adc1 ^ (cerr & 0xff) ^ ocr2

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

Положить delimiter = 103, поскольку 0 является "не слишком нейтральным" -- часто встречается в данных и мешает определению начала пакета.

Ошибки в коде

Обнаружены следующие ошибки в коде:

  1. Некорректный метод safe_add.
  2. Использование owrite и iread в пользовательском коде вместо transmit и receive.
  3. Некорректная операция представления результата для ШИМ.

Задача -- исследовать код на наличие наиболее очевидных ошибок.

Разработка полной схемы аналоговой части

Исчерпывающая схема с полной распиновкой.

Включая:

  • Входные каскады
  • Выходные каскады
  • Усилители из корпусе
  • Интерфейсы
  • Обвеска всех чипов (микроконтроллер, драйвер RS232, корпус с усилителями)

Подведение итогов по аналоговой части.

Улучшить алгоритм приема пакетов controller-gui

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

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

Гонка по переменной состояния кольцевых буферов USART

Обнаружена гонка по переменной iobuf_state.

Причина -- раздельные блокировки во входном и выходном буферах, построенные на управлении прерываниями RX_COMPLETE (для входного буфера) и DATA_REG_EMPTY (для выходного буфера).

Пути устранения:
а) Разделение переменной iobuf_state на ibuf_state и obuf_state.
б) Построение критической секции при помощи управления глобальными прерываниями.

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

Неверная инициализация USART

Инициализация была списана с даташита бездумно, а конкретно значение fosc. Это подтолкнуло к следующим изменениям.

Задача

  • Реализовать возможность смены частоты fosc (макрос)
  • Реализовать возможность смены Baud Rate (макрос)
  • Установить формат фрейма: S-8-P-St, а не S-8-St.

Исключить использование вложенных прерываний и раздельных блокировок в USART API

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

Реализация ПИД-регулятора

Данные

ПИД-регулятор, Пропорциональный интегрально-дифференцирующий регулятор -- один из простейших статических регуляторов с обратной связью.

Его простейшая форма -- ПИ-регулятор -- представляется уравнением регулятора:

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).

Задача

Реализовать алгоритм ПИ-регулирования:

  • Инициализация работы АЦП
  • Чтение очередного отсчета сигнала с АЦП
  • Вычисление очередного отсчета регулирующего сигнала
  • Пересылка его в блок выработки ШИМ в требуемом масштабе ( #11 )
  • Отладочный вывод текущего отсчета сигналов, ошибки регулирования, а также нового отсчета регулирующего сигнала в соответствии с выработанным протоколом передачи данных ( #10 )
  • Применение введенных коэффициентов регулятора к расчетам, а также отладочный вывод сигнала об их успешном получении и применении ( #10 )

Модификация кольцевых буферов для приема/передачи порций данных

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

Пример:

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 на каждую ножку.

Разрешить глобальные прерывания

При разработке кода была надежда на то, что глобальные прерывания разрешаются автоматически. Но при тестировании выяснилось, что этого не происходит.

Необходимо разрешать прерывания самостоятельно.

Исправить в главном коде и в коде теста.

Реализовать shell-подобную вещь на SPI и I2C-интерфейсах

Требуется реализовать запросно-ответный механизм по принципу функционирования командной строки.

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

> 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.

По реализации: необходимо добавить обработку команд, лежащих в кольцевых буферах, в цикл обработки сообщений.

Ошибки в совместной работе прибора и `controller-gui`

Были обнаружены серьезные ошибки при тестировании 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

В каждом README.md должно быть указано полное назначение проекта, его API, если он таковое предоставляет, инструкции по эксплуатации. Либо произведена отсылка к соответствующему разделу WIKI.

"Смета" по печатной плате

Реализовать примерное описание необходимых материалов для реализации платы, приложить схемы, результаты моделирования, дополнительные материалы.

Реализация обмена информацией по USART

Данные

Программно-управляемый обмен информацией необходим в целях:

  1. Отладки (ATmega8A не имеет встроенных механизмов отладки)
  2. Передачи команд на микроконтроллер, в частности команд установки коэффициентов ПИД-регулятора

Следует помнить, что USART -- низкоуровневый небуферизированный протокол, основанный на прерываниях. Поэтому необходима реализация входного и выходного буферов. Предлагается использовать циклические буферы.

Задача

  • Инициализировать USART
    • Установить стандартные параметры: Baud Rate - 9600; Frame Format - S+8+1+St
  • Реализовать циклические буферы ввода-вывода
    • Размер буфера должен задаваться
    • Необходима проверка на переполнение буфера
    • Размеры буферов на вход и на выход могут существенно разниться и зависят от объема и скорости передачи данных
    • Работа с буфером в прерываниях должна задействовать возможный минимум процессорного времени
  • Определить бинарный протокол приема-передачи данных (команд)
    • Обеспечить ввод параметров регулятора
    • Обеспечить вывод входных и выходных параметров регулятора, сигнальный вывод

Отчет

Написание отчета по проделанной работе.

Реализовать буферизированные SPI и I2C

Требуется подставить уже имеющиеся кольцевые буферы под SPI и I2C. Для этого необходимо снаяала активировать сами эти интерфейсы и поставить их на прерывания.

Обмен по I2C скорее всего можно реализовать в slave-multicast-режиме, отправляя все данные на multicast-адрес, однако это требует уточнения, поэтому лучше завести соответствующий #define.

Модификация протокола обмена данными

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

Требования:

  1. Дружелюбность и простота интерфейса обмена данными
  2. Командно-ориентированный подход

Предлагается следующий протокол обмена данными:

  1. METHOD: 1 байт, SET (1) / GET (0).
  2. VARIABLE ID: 8 байт, номер переменной.
  3. VALUE: 1-2 байта, значение переменной (только при METHOD == SET).

Примеры: 1 7 65535, 1 0 255, 0 0.

При METHOD == GET приложение само решает, передавать ли значение переменной однократно или непрерывно.

Входной фильтрующий каскад неработоспособен

При тестировании работы схемы был выявлен очень низкий уровень поступающего на АЦП сигнала (первый входной канал (PC0/ADC0/23-pin)). Необходимо разобраться в причине.

Дополнительные данные

  1. Предполагалось, что на выходе преобразователя напряжение-ток (цепь Diode-R1R2TL084 Out, Diode-TL084 In-, GNDTL084 In+) будет наблюдаться потенциал ~1V, а на АЦП он будет поступать усиленный в ~2..3 раза.

  2. На данный момент имеется следующий вариант платы, соответствующий разводке 9e05c59.

ad5e0efa-29dd-11e7-939e-28378d9818b8
layout

Изменить формат ввода коэффициентов регулятора

Поскольку коэффициенты в виде степени двойки крайне грубо позволяют задать коэффициенты регуляции, следует предоставить возможность установки коэффициентов регуляции более точно.

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

В качестве такого решения предлагается передавать два числа, M и d, и учитывать их следующим образом: R = (S * M) >> d, где S -- исходный масштабируемый сигнал, R -- результат масштабирования. Относительная точность такого подхода будет достаточно велика.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.