Специальные цены   новые товары
Закрытая тема
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 40 из 107

Система автоматического тестирования ВМГ (народный проект)

Тема раздела Коптеры. Комплектующие, сборка, настройка. в категории Квадрокоптеры и мультироторы; Предисловие Не хочу заниматься плагиатом, хотя повторение колеса не является оным, но все же... Хотел бы поделиться идеями с дальнейшим ...

  1. #1

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4

    Система автоматического тестирования ВМГ (народный проект)

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

    Что имеем? Что требуется?
    Нам нужно, как минимум получать три показания с датчиков, это ток, напряжение, тяга. Этого минимума будет достаточно для получения результатов и последующего подбора эффективной ВМГ. В дальнейшем можно будет добавить например датчики для снятия показаний КВ, вибрации и т. д.
    Не плохо бы использовать для этого ардуину, большинство ею пользуется и имеет в наличии. Но имеется небольшое ограничения при использовании данной платформы, а точнее огромный недостаток, это 10 биттный АЦП, проще говоря вес мы сможем измерять в пределах килограмма. Для измерения тока и напряжения ардуины будет нам вполне достаточно, а вот для измерения тяги придется использовать внешний АЦП. В качестве такого внешнего АЦП предлагаю использовать микросхему ADS1232. Данная микросхема уже имеет усилитель и стоимость у нее не большая, пару баксов всего.

    Решение
    В даташите АЦП имеется схема подключения к нему тензо-датчика.



    На просторах интернета были найдены кусочки кода для чтения данных ардуиной для подобной АЦП.
    http://forum.arduino.cc/index.php/topic,128823.0.html
    http://forum.arduino.cc/index.php?topic=196110.0
    Читая ломанный гугло-перевод даташита, добился определенных результатов в чтении данных АЦП с помощью ардуины.

    /*
    ADS1244

    */

    int DATA = 4;
    int SCLK = 5;
    int PWDN = 3;

    void setup() {

    pinMode(DATA, INPUT);
    pinMode(SCLK, OUTPUT);

    Serial.begin(115200);

    // generate a 2.4MHz clock signal on pin 3
    pinMode(PWDN, OUTPUT); //CLK

    // 17.11 Register Description
    TCCR2A = 0x33; // 0011 0011
    TCCR2B = 0x09; // 0000 1001
    OCR2A = 0x06; // 0000 0110
    OCR2B = 0x05; // 0000 0011

    Serial.print("ADS1244\n"); // output 'AADS1244' (?) additional 'A' in front
    delay(100);
    }

    void loop() {

    // Code for reading the data:

    int32_t value = 0;

    digitalWrite(PWDN, HIGH);

    //digitalWrite(SCLK, HIGH); //enter slleep mode
    delay(300);
    digitalWrite(SCLK, LOW); // wake up ADC


    // wait for data ready, stay in while-loop until LOW
    while (digitalRead(DATA) == HIGH);

    value = shiftIn(DATA, SCLK, MSBFIRST);
    value <<= 8;
    value |= shiftIn(DATA, SCLK, MSBFIRST);
    value <<= 8;
    value |= shiftIn(DATA, SCLK, MSBFIRST);

    digitalWrite(SCLK, HIGH); // enter sleep mode
    //digitalWrite(SCLK, LOW); // 25th pulse to keep DATA high till next data ready

    // process as int24_t (two's compliment 24bit)
    value = ((signed long) (value << 8)) >> 8;


    Serial.println(value, DEC);
    Serial.flush();

    }
    Правильно ли я организовал чтение данных, возможно ли оптимизировать код?
    Как я понял, из кода можно выбросить часть с "// generate a 2.4MHz clock signal on pin 3"
    Завести данный код удалось добавлением "digitalWrite(PWDN, HIGH);"
    Правильно ли так оставлять его или следует все таки сбрасывать и в какой момент?

    Набросал на макетной платке предварительную сборочку стенда.



    в качестве датчика тока использую ACS758



    для снятия показаний напряжения буду использовать делитель напряжения на резисторах
    Последний раз редактировалось sulaex; 05.12.2013 в 16:12.

  2.  
  3. #2
    Забанен
    Регистрация
    01.08.2012
    Адрес
    Литва
    Возраст
    36
    Сообщений
    804
    какой тензодатчик планируете использовать?

  4. #3

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    http://www.aliexpress.com/item/80mmx...445102584.html

    линк на похожий, так как покупалось через аукцион

  5. #4

    Регистрация
    11.10.2009
    Адрес
    г.Коломна (Моск.обл)
    Возраст
    53
    Сообщений
    5,990
    Александр, штука эта классная. Без нее долго не полетаешь, если на обум все делать. Но вроде кто-то уже делали подобное. Ну и на всякий случай вот уже готовый вариант http://www.hobbyking.com/hobbyking/s..._100_Amps.html, правда к электронным весам ее сложно прикрутить, но меряет и обороты, ток, напругу, мощность и еще много чего. Все лагирует с нужным интервалом, далее в своей программе рисует графики... считает сразу мини, макси, среднее и т.д. Любой интервал можно масштабировать, анализировать, обрабатывать отдельно, и также сам интревал записи данных настраиваемый.

  6.  
  7. #5

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    это не то, похожее устройство имеется в наличии у меня

    требуется специализированный стенд
    установил ВМГ, крутанул, данные залил в базу

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

    ЗЫ в общем то куски кода имеются, все работает
    идут данные тяги с внешнего АЦП на ардуину, напряжение и ток меряются
    осталось все собрать в кучу, организовать сбор данных, придумать ГУИ
    как выше писал, в программировании не в зуб ногой, буду очень благодарен за помощь в дальнейшей разработке ГУИ
    собственно я могу данные собирать и через терминал, но было бы лучше организовать интерфейс
    если разберусь, возможно и сам, что нить организую, но очень надеюсь на помощь

    ЗЫЗЫ по сравнению с STM32 (делал подобный стенд), на много меньше помех по АЦП у ардуины, как я понимаю это связанно с разрядностью?
    думаю можно будет использовать данные без цифрового фильтра, это огромный плюс, да и 24 биттный внешний АЦП так же приятно работает без особых помех
    очень упрощается программная часть и повышается точность измерений, но это пока догадки, надо собрать все данные в кучу и тогда будет известен результат
    Последний раз редактировалось sulaex; 06.12.2013 в 00:47.

  8. #6

    Регистрация
    11.10.2009
    Адрес
    г.Коломна (Моск.обл)
    Возраст
    53
    Сообщений
    5,990
    Но там ведь данные из E-Logger просто ипортируются в Excel (без проблем) и он уже быстро анализирует. Программа в Excel состовляется за час-два во время просмотра телевизора ( анализ маломерных числовых массивов)

  9. #7
    Забанен
    Регистрация
    01.08.2012
    Адрес
    Литва
    Возраст
    36
    Сообщений
    804
    Цитата Сообщение от delfin000 Посмотреть сообщение
    Но там ведь данные из E-Logger просто ипортируются в Excel (без проблем) и он уже быстро анализирует. Программа в Excel состовляется за час-два во время просмотра телевизора ( анализ маломерных числовых массивов)
    там нет датчика массы а на нем все и завязанно

  10.  
  11. #8

    Регистрация
    11.10.2009
    Адрес
    г.Коломна (Моск.обл)
    Возраст
    53
    Сообщений
    5,990
    Цитата Сообщение от delfin000 Посмотреть сообщение
    правда к электронным весам ее сложно прикрутить
    но все же возможно по той же I2C есть еще и аналоговые

  12. #9

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Для сбора и анализа данных предложенное вами устройство не годится, тем более нет данных тяги.
    Да, его можно использовать для создания подобного описываемому проекту стенда, но потребуются дополнительные затраты, лишние устройства, программы, возня с совмещением данных и многое другое.

    Стоимость собираемого мною стенда будет примерно:
    тензодатчик - 10$
    АЦП - 3$
    ардуина с ФТДИ - 7$ (у большинства она валяется в загашнике)
    датчик тока - 5$
    обвязка и монтажка ну - 10$
    _____________________________
    всего 30 баксов относительно легко повторяемый стенд

  13. #10

    Регистрация
    07.06.2011
    Адрес
    Харьков
    Возраст
    53
    Сообщений
    492
    Записей в дневнике
    4
    Цитата Сообщение от sulaex Посмотреть сообщение
    ... имеется небольшое ограничения при использовании данной платформы, а точнее огромный недостаток, это 10 биттный АЦП, проще говоря вес мы сможем измерять в пределах килограмма.
    Никакой проблемы на самом деле нет. 10 бит в нашем случае более чем достаточно. Точность измерения составляет 0,1%. Скажем, в диапазоне 0..5кг точность будет плюс-минус 5 грамм. Причем, скорость измерения высокая не требуется, поэтому точность можно повысить многократными измерениями.

  14. #11

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Цитата Сообщение от TeHoTaMy Посмотреть сообщение
    Никакой проблемы на самом деле нет. 10 бит в нашем случае более чем достаточно. Точность измерения составляет 0,1%. Скажем, в диапазоне 0..5кг точность будет плюс-минус 5 грамм. Причем, скорость измерения высокая не требуется, поэтому точность можно повысить многократными измерениями.
    вы не учли шумы внутреннего АЦП, а при использовании фильтра уменьшается точность, если делать несколько замеров, падает скорость теста
    к тому же микросхема внешнего АЦП стоит столько же, сколько и усилитель для тензодатчика, но при этом точность замера с тензодатчика возрастает на много больше

  15. #12

    Регистрация
    31.07.2012
    Адрес
    Харьков
    Возраст
    34
    Сообщений
    194
    Записей в дневнике
    2
    а что с этой установкой? RThrust - система автоматического тестирования ВМГ вроде тожесамое - единственное что она "закрытая", а тут будет открытая?

  16. #13

    Регистрация
    07.06.2011
    Адрес
    Харьков
    Возраст
    53
    Сообщений
    492
    Записей в дневнике
    4
    Цитата Сообщение от sulaex Посмотреть сообщение
    вы не учли шумы внутреннего АЦП, а при использовании фильтра уменьшается точность, если делать несколько замеров, падает скорость теста
    Шумы легко фильтруются программным фильтром, а скорость работы внутреннего АЦП на несколько порядков выше, чем требуется для данной задачи.

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

  17. #14

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Цитата Сообщение от vatanuki Посмотреть сообщение
    а что с этой установкой? RThrust - система автоматического тестирования ВМГ вроде тожесамое - единственное что она "закрытая", а тут будет открытая?
    то же самое, только на чипе smt32, но уж слишком затянут проект под предлогом доведения до ума
    данный проект будет открытым, не вижу смысла в закрытии подобных разработок, ведь чем больше народу повторит его, тем больше пользы будет получено в конечном результате

    Цитата Сообщение от TeHoTaMy Посмотреть сообщение
    Шумы легко фильтруются программным фильтром, а скорость работы внутреннего АЦП на несколько порядков выше, чем требуется для данной задачи.

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

    по поводу шумов и легкости фильтрации, хотелось бы взглянуть пример вашей легкости решения проблемы
    про скорость АЦП, полагаю вы ошиблись в термине, да и не в теме того, что имелось в виду в моем сообщении
    ну и на по следок, усилитель, который с легкостью собирается из подручного хлама глянуть бы
    Последний раз редактировалось sulaex; 06.12.2013 в 05:55.

  18. #15

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    подбор делителя на шесть банок с запасом

    Последний раз редактировалось sulaex; 06.12.2013 в 10:42.

  19. #16

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    пример подбора датчик тока для наших целей

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

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



    предположим, что замер тока нашего стенда не будет превышать 50А
    датчик тока в моем распоряжении в нулевом состоянии выдает половину опорного напряжения
    то есть при нулевом значении АЦП будет выдавать значение 512
    причем точность показаний будет 10мВ на 1А - это самое не подходящее значение
    для наших целей лучшим датчиком будет ACS758LCB-050U
    этот датчик измеряет до 50А с точностью 60мВ/1А, самый точный из ACS758 для наших целей
    точность в 6 раз выше используемого мною

    обращайте внимание на буковку U в маркировке датчика, этот датчик меряет ток в одном направлении
    тем самым точность повышается в два раза

    ЗЫ выше описанное является моим пониманием прочтенного, на достоверность не претендую
    если есть замечания или исправления, прошу поправить

  20. #17

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    46
    Сообщений
    1,085
    сейчас полез на Али смотреть тензодатчики ... первое что бросилосЪ в глаза - куча недорогих готовых модулей АЦП изначально заточеных под тензодатчик - hx711 ... ИМХО поддержка таких модулей сильно облегчит повторение конструкции ...
    датчик имеет смысл брать именно на 10 кг или лучне на 5 ???
    еще едут регули , китайская подделка ESC32 ... если разобраться с протоколом то с них можно получать напряжение , ток и обороты ... только нужен будет свободный компорт (проблему решает ардуина мега или леонардо ) ...
    тогда получается для стенда нужны будут только ардуина , регуль ESC32 , плата на hx711 и тензодатчик ...

  21. #18

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Спасибо Юрий за полезную информацию по модулю.
    Отличное готовое решение для модульной сборки и дешевой комплектухи.
    Именно то, что требуется для данного проекта и легкого повторения.
    Имеется библиотека и пример чтения данных с этого модуля.
    Обязательно закажу его и включу в качестве основного модуля в проект.

    Цитата Сообщение от Gapey Посмотреть сообщение
    датчик имеет смысл брать именно на 10 кг или лучне на 5 ???
    Зависит от ваших потребностей, если вы не собираетесь измерять ВМГ с тягой не превышающей пару килограмм, думаю достаточно тензодатчика и в 3 килограмма, точность измерений будет больше.
    Чем больше будет значение, тем меньше будет точность, хотя для АЦП в 24 битта это не особо критично.

    Цитата Сообщение от Gapey Посмотреть сообщение
    тогда получается для стенда нужны будут только ардуина , регуль ESC32 , плата на hx711 и тензодатчик ...
    пошел искать инфу по этим регулям

    ЗЫ добавлено апосля
    не, думаю нет смысла включать в проект данный регуль, слишком он дорогой
    Последний раз редактировалось sulaex; 08.12.2013 в 17:24.

  22. #19

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Формула для расчета значения тока датчика с двухсторонним измерением (буква B в маркировке)
    I=(Count-CountNull)*(ISensor/512)

    Формула для расчета значения тока датчика с односторонним измерением (буква U в маркировке)
    I=Count*(ISensor/1024)

    I - значение тока (результат)
    Count - показания АЦП ардуины
    CountNull - показания АЦП без нагрузки (нулевое значение тока)
    ISensor - максимальный ток измеряемый датчиком (смотрите в таблице)

    по поводу точности датчиков:
    для датчика ACS758ECB-200B шаг измерения 200А/512=0.39А (например для 20А значения всего 50 показаний, маловато)
    для датчика ACS758LCB-050U шаг измерения 50А/1024=0.05А (например для 20А значения 400 показаний, более чем достаточно)

    ЗЫ заметка, надо будет завтра попробовать запитать схему стенда от аккумулятора через стабилизатор
    добиться идеальных нулевых показаний АЦП путем стабилизации опорного напряжения, что бы исключить общую настройку стенда в целом
    Последний раз редактировалось sulaex; 08.12.2013 в 18:37.

  23. #20

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    46
    Сообщений
    1,085
    Цитата Сообщение от sulaex Посмотреть сообщение
    не, думаю нет смысла включать в проект данный регуль, слишком он дорогой
    вы видимо смотрели оригинальную версию которую "из принципа" паяют в европе , ну и цена соответственно 39 евро ...
    я-же взял на Али подделки , 5 штук по $23,29 фришип , что для 40 амперных регулей вполне нормально ...
    как приедут , буду сравнивать их эффективность по сравнению с обычными , насколько стоит с ними связываться ...

  24. #21

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    наброски кода, гляньте, поправьте если есть чего пожалуйста
    прошу строго не судить, раньше в ардуину только заливал скетчи

    тяга и ток калибруются в ноль при включении
    напряжение и остальные калибровки будут позже

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

    Код:
    //объявление переменных
    //подключаемые разьемы на ардуине
    int PWM = 3;  //пин D3 для ШИМ
    int DATA = 4;  //пин D4 подключаем АЦП тяги
    int SCLK = 5;  //пин D5 подключаем АЦП тяги 
    int PWDN = 6;  //пин D6 подключаем АЦП тяги
    #define CurrPin A0  //пин A0 датчик тока
    #define VoltPin A1  //пин A1 датчик напряжения
    //переменные для работы
    float CurrentValue = 0;  //переменная для расчета тока (с плавающей точкой)
    float CurrentValueRes = 0;  //переменная с результатом для расчета тока (с плавающей точкой)
    float VoltageValue = 0;  //переменная для расчета напряжения (с плавающей точкой)
    int32_t Weight = 0;  //переменная для расчета тяги (32 разряда)
    //переменные для нулевых значений
    int32_t WeightNull = 0; //нулевое значение по весу (переменная калибруется при включении)
    int CountNull = 0;  //нулевое значение по току, данная переменная для однонаправленных датчиков ACS758 (с буквой U) не используется (переменная калибруется при включении)
    
    //эти переменные заполняются пользователем
    int ISensor = 200;  //максимальное значение измеряемое датчиком (смотрим даташит по ним)
    
    //инициализация
    void setup() {
      //инициализация I/O
      pinMode(DATA, INPUT);
      pinMode(SCLK, OUTPUT); 
      pinMode(PWDN, OUTPUT);
      digitalWrite(PWDN, HIGH);
      //скорость порта
      Serial.begin(57600);
      //читаем нулевые значения по весу и току
      WeightNull = getSensorValueWeight();
      CountNull = analogRead(CurrPin);
    }
    
    //чтение данных тяги
    int32_t getSensorValueWeight() {
      digitalWrite(SCLK, LOW);  // wake up ADC
      while (digitalRead(DATA) == HIGH);  // wait for data ready, stay in while-loop until LOW
      Weight = shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      digitalWrite(SCLK, HIGH);  // enter sleep mode
      Weight = ((signed long) (Weight << 8)) >> 8;  // process as int24_t (two's compliment 24bit)
      return Weight;
    }
    
    //начало работы в цыкле
    void loop() {
    
      Weight = (getSensorValueWeight() - WeightNull)/204.6615;
      
      //расчет данных напряжения
      VoltageValue = analogRead(VoltPin);  // считываем значение аналогового входа (напряжение)
      VoltageValue = VoltageValue*0.0298217;
      
      //расчет данных тока  
      CurrentValue = analogRead(CurrPin);  // считываем значение аналогового входа (ток)
      CurrentValueRes = (CurrentValue-CountNull)*ISensor/512;  //формула расчета тока для двунаправленнх датчиков ACS758
      //CurrentValueRes = CurrentValue*ISensor/1024;  //формула расчета тока для однонаправленных датчиков ACS758
      
      //выводим результат
      Serial.print(Weight);
      Serial.print("\t");
      Serial.print(VoltageValue);
      Serial.print("\t");
      Serial.println(CurrentValueRes);
      
      Serial.flush();
    
    }
    Последний раз редактировалось sulaex; 09.12.2013 в 13:07.

  25. #22

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    список линков для закупки комплектующих для создания стенда

    как я и писал выше, цель проекта создание стенда для тестирования ВМГ как можно дешевле и проще в повторении
    данный проект можно будет повторить в двух вариантах, модульный и одно-платный, а так же смешанном из этих вариантов
    модульный является самым простым и доступным к повторению, одно-платный будет предоставлен позже и будет самым дешевым

    список модулей (например):

    Arduino Mini Pro



    основой модульного проекта является плата с процессором, в качестве этой борды возможно использовать любой модуль или готовый контроллер на атмеге
    например ардуины UNO, Pro Mini и т. д., так же можно использовать платки полетных контроллеров, Кук, МультиВий, в общем все, в чем имеется атмега (при желании можно и регуль переделать )

    линк - http://www.aliexpress.com/item/2PCS-...242584516.html - 7$
    по данному линку модуль продается с FTDI (следующий по списку, не надо будет отдельно покупать)

    модуль FTDI



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

    линк - http://www.aliexpress.com/wholesale?...20131209215148 - 7$

    готовый модуль АЦП для снятия показаний с тензодатчика



    данный модуль организует снятие аналоговых данных с тензодатчика (датчик тяги, датчик веса) и преобразует эти данные в цифровой вид для последующей обработки на ардуине, именно подобный модуль сподвиг меня на поднятие данного проекта, так как разрядности АЦП ардуины было не достаточно для требуемых расчетов (спасибо Юрию за наводку)

    линк - http://www.ebay.com/itm/400563601604 - 7$

    датчик тяги



    датчик тяги (веса), в большинстве случаев достаточно пяти колограммового, хотя и 10 кг совсем не сколечко не испортит нам данных

    линк - http://www.aliexpress.com/item/1PCS-...192555182.html - 10$

    модуль датчика тока



    выше в этой теме я уже расписал, какой датчик выбрать лучше

    линк - http://www.ebay.com/itm/111040360152...84.m1436.l2649 - 18$
    по линку очень дорогой модуль, можно найти на много дешевле

    не требуется, но для удобства можно использовать синий зуб



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

  26. #23

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    "летим птичка там много вкусного"

    какая прелесть!?

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


  27. #24

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    37
    Сообщений
    4,528
    Записей в дневнике
    9
    Среда эта называется Processing - на её основе как раз и сделана среда Arduino

  28. #25

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Цитата Сообщение от SergDoc Посмотреть сообщение
    Среда эта называется Processing - на её основе как раз и сделана среда Arduino
    ага, догадался уже



    некоторые наработки аля DOS консоль и работа с ШИМ (пока без ремарок)
    на видео показана возможность выбора режима теста и прерывание работы теста любой клавишей на случай возникновения аварийной ситуации,
    прошу не ругаться за мой английский а поправить его

    Код:
    // добавляем библиотеку для работы с сервоприводами
    #include <Servo.h> 
    // для дальнейшей работы назовем 9 пин как servoPin
    #define servoPin 3
    // 544 это стандартная длина импульса при котором сервопривод должен принять положение 0°
    #define servoMinImp 544 
    // 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
    #define servoMaxImp 2400 
    Servo myServo;
    
    int val;                           //здесь будет храниться принятый символ
    int n;
    int error = 0;
    
    void setup()
    {
    myServo.attach(servoPin, servoMinImp, servoMaxImp);
    // устанавливаем пин как вывод управления сервоприводом,
    // а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
    // импульсы с большей или меньшей длиной восприниматься не будут.
    // для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
    // поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
      
      Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
      
      myServo.writeMicroseconds(set_pos(0));
    }
    
    //чтение вводимой строки из терминала
    String readText(int n){
      int i = 0;
      String str;
      
      while (i<n) {
    	while (!(Serial.available()));
            val = Serial.read();
            if (val==13){return str;}
            Serial.print(char(val));
            str += char(val);
            i++;
      }
      return str;
    }
    
    // Функция устанавливает стик газа
    int set_pos(int pos) {
      int tmp=(servoMaxImp - servoMinImp) /100;
      pos = servoMinImp + tmp * pos;
      return pos;
    }
    
    void beginTest(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - begin auto test 50, 65, 75, 85, 100%");
      Serial.println("2 - begin auto test 1-100%");
      Serial.println("3 - begin manual test");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){test(1);}
      if (val==50){test(2);}
      if (val==51){test(3);}
      Serial.println("\n\r stop test return to console");
      return;
    }
    
    int test(int n){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("8 - begin test");
      Serial.println("any key - stop test and return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      if (val==56){
        Serial.println("you select 8");
        Serial.println("\n\r start test");
        Serial.println();
        if (n==1){
          if (delayM(200)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle from 0 to 49%"); for (n=0; n<50; n++){myServo.writeMicroseconds(set_pos(n)); if (delayM(30)==1){myServo.writeMicroseconds(set_pos(0)); return 0;};}
          Serial.println("throtle = 50%"); myServo.writeMicroseconds(set_pos(50)); if (delayM(1000)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle = 65%"); myServo.writeMicroseconds(set_pos(65)); if (delayM(1000)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle = 75%"); myServo.writeMicroseconds(set_pos(75)); if (delayM(1000)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle = 85%"); myServo.writeMicroseconds(set_pos(85)); if (delayM(1000)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle = 100%"); myServo.writeMicroseconds(set_pos(100)); if (delayM(1000)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle = 0%"); myServo.writeMicroseconds(set_pos(0));
        }
        if (n==2){
          if (delayM(200)==1){myServo.writeMicroseconds(set_pos(0)); return 0;}
          Serial.println("throtle from 0 to 100%"); for (n=0; n<100; n++){myServo.writeMicroseconds(set_pos(n)); if (delayM(50)==1){myServo.writeMicroseconds(set_pos(0)); return 0;};}
          Serial.println("throtle = 0%"); myServo.writeMicroseconds(set_pos(0));
        }
      }
      return 0;
    }
    
    int delayM(int m){
      int k;
      for (k=0; k<m; k++){
        if (!(Serial.available())){}else{k = 1; Serial.println("\n\r break"); return k;}
        delay(1);
      }
      k = 0;
      return k;
    }
    
    void beginCalibrate(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - calibration weight");
      Serial.println("2 - calibration voltage");
      Serial.println("3 - calibration curent");
      Serial.println("4 - calibration ESC");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      if (val==49){Serial.println("\n\r 1 ok");}
      if (val==50){Serial.println("\n\r 2 ok");}
      if (val==51){Serial.println("\n\r 3 ok");}
      if (val==52){Serial.println("\n\r 4 ok");}
      Serial.println("\n\r stop calibration return to console");
      return;
    }
    
    void loop()
    {
      Serial.println();
      //Serial.println("Helow my frend!");
      Serial.println("Please type the comands:");
      Serial.println("test, calibration, null, setup");
      Serial.println();
      Serial.print(">");
      while (!(Serial.available()));
      String myString = readText(60);
      if (myString=="test"){Serial.println(); beginTest(); error = 0;}
      if (myString=="setup"){Serial.println("\n\r setup ok"); error = 0;}
      if (myString=="calibration"){Serial.println(); beginCalibrate(); error = 0;}
      if (myString=="null"){Serial.println("\n\r null ok"); error = 0;}
      if (myString==""){Serial.println(); error = 0;}
      if (error==0){error=1;}else{Serial.println("\n\r incorrect command");}
    }


    ЗЫ видео высокого качества следует установить, что бы видеть текст на экране

  29. #26
    Забанен
    Регистрация
    01.08.2012
    Адрес
    Литва
    Возраст
    36
    Сообщений
    804
    думаю над созданием чего-то подобного но за основу решил взять такую платку чтоб еще паралельно на дисплее видеть снимаемые параметры.

  30. #27

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    30
    Сообщений
    1,677
    Записей в дневнике
    6
    http://www.aliexpress.com/item/The-s...759195015.html
    ссылочку тут размещу... за 18 баксов можно получить 5 датчиков на различный вес от 1 до 7кг

  31. #28

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Сырой, но уже работоспособный скетч проекта.

    Полностью готово меню режимов тестирования.

    Имеется три режима тестирования:
    первый - автомат с шагом 50, 65, 75, 85 и 100 процентов (как в магазинных тестах), показания снимаются автоматически
    второй - то же автомат, с шагом в один от 0 до 100 процентов, показания снимаются автоматически
    третий - ручной, вы можете сами набрать процент от 0 до 100 или с помощью +/- подкорректировать требуемый процент, показания снимаются путем нажатии клавиши "r"

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

    Следующая задача, организовать меню и работу калибровок (пока калибровать можно только через изменение скетча).

    Код:
    #include <Servo.h> // добавляем библиотеку для работы с сервоприводами
    
    //объявление переменных
    //подключаемые разьемы на ардуине
    #define servoPin 3 // для дальнейшей работы назовем 3 пин как servoPin
    int DATA = 4;  //пин D4 подключаем АЦП тяги
    int SCLK = 5;  //пин D5 подключаем АЦП тяги 
    int PWDN = 6;  //пин D6 подключаем АЦП тяги
    #define CurrPin A0  //пин A0 датчик тока
    #define VoltPin A1  //пин A1 датчик напряжения
    
    #define servoMinImp 544 // 544 это стандартная длина импульса при котором сервопривод должен принять положение 0°
    #define servoMaxImp 2400 // 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
    
    //переменные для работы
    float CurrentValue = 0;  //переменная для расчета тока (с плавающей точкой)
    float CurrentValueRes = 0;  //переменная с результатом для расчета тока (с плавающей точкой)
    float VoltageValue = 0;  //переменная для расчета напряжения (с плавающей точкой)
    int32_t Weight = 0;  //переменная для расчета тяги (32 разряда)
    
    //переменные для нулевых значений
    int32_t WeightNull = 0; //нулевое значение по весу (переменная калибруется при включении)
    int CountNull = 0;  //нулевое значение по току, данная переменная для однонаправленных датчиков ACS758 (с буквой U) не используется (переменная калибруется при включении)
    
    //эти переменные заполняются пользователем
    int ISensor = 200;  //максимальное значение измеряемое датчиком (смотрим даташит по ним)
    
    Servo myServo;
    
    int val; //здесь будет храниться принятый символ
    int n;
    int error = 0;
    int throttle = 0;
    String strnumber = "0";
    int throttleOld = 0;
    
    //инициализация
    void setup() {
      //инициализация I/O
      pinMode(DATA, INPUT);
      pinMode(SCLK, OUTPUT); 
      pinMode(PWDN, OUTPUT);
      digitalWrite(PWDN, HIGH);
      //скорость порта
      Serial.begin(9600);
      //читаем нулевые значения по весу и току
      WeightNull = getSensorValueWeight();
      CountNull = analogRead(CurrPin);
    
    myServo.attach(servoPin, servoMinImp, servoMaxImp);
    // устанавливаем пин как вывод управления сервоприводом,
    // а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
    // импульсы с большей или меньшей длиной восприниматься не будут.
    // для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
    // поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
    
      
      myServo.writeMicroseconds(set_pos(0));
    }
    
    //чтение вводимой строки из терминала
    String readText(int n){
      int i = 0;
      String str;
      
      while (i<n) {
    	while (!(Serial.available()));
            val = Serial.read();
            if (val==13){return str;}
            Serial.print(char(val));
            str += char(val);
            i++;
      }
      return str;
    }
    
    // Функция устанавливает стик газа
    int set_pos(int pos) {
      int tmp=(servoMaxImp - servoMinImp) /100;
      pos = servoMinImp + tmp * pos;
      return pos;
    }
    
    void beginTest(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - begin auto test 50, 65, 75, 85, 100%");
      Serial.println("2 - begin auto test 1-100%");
      Serial.println("3 - begin manual test");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){test(1);}
      if (val==50){test(2);}
      if (val==51){test(3);}
      //if (val<=48 || val>=52){breakTest();}
      Serial.println("\n\r stop test return to console");
      return;
    }
    
    int test(int n){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("8 - begin test");
      Serial.println("any key - stop test and return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==56){
        Serial.println("\n\r start test");
        Serial.println();
        if (n==1){
          if (delayM(200)==1){return 0;}
          //Serial.println("throttle from 0 to 49%"); for (n=0; n<50; n++){myServo.writeMicroseconds(set_pos(n)); if (delayM(30)==1){return 0;};}
          setthrottle(50, 1); if (delayM(1000)==1){return 0;} printRez(50);
          setthrottle(65, 1); if (delayM(1000)==1){return 0;} printRez(65);
          setthrottle(75, 1); if (delayM(1000)==1){return 0;} printRez(75);
          setthrottle(85, 1); if (delayM(1000)==1){return 0;} printRez(85);
          setthrottle(100, 1); if (delayM(1000)==1){return 0;} printRez(100);
          setthrottle(0, 0);
        }
        if (n==2){
          if (delayM(200)==1){return 0;}
          Serial.println("throttle from 0 to 100%"); for (n=0; n<100; n++){myServo.writeMicroseconds(set_pos(n)); printRez(n); if (delayM(50)==1){return 0;};}
          Serial.println("throttle = 0%"); myServo.writeMicroseconds(set_pos(0));
        }
        if (n==3){
          if (delayM(200)==1){return 0;}
          Serial.println("select throttle percent or press +/- or r for print result");
          error=0;
          while (1){
            while (!(Serial.available()));
            val = Serial.read();
            if (val==61 || val==43){if (error==1){breakTest(); return 0;}else if (throttle<=99){throttle++; setthrottle(throttle, 0);}else{Serial.println("maximal throttle 100%");}}
            else if (val==45){if (error==1){breakTest(); return 0;}else if (throttle>=1){throttle--;  setthrottle(throttle, 0);}else{Serial.println("minimal throttle 0%");}}
            else if (val==13){Serial.println(); error=0; throttle=strnumber.toInt(); if (throttle>=101){breakTest(); return 0;} setthrottle(throttle, 1); strnumber="0";}
            else if (val>=48 && val<=57){Serial.print(char(val)); error=1; strnumber += char(val);}
            else if (val==114){printRez(throttle);}
            else {breakTest(); return 0;}
          }
        }
      }
      return 0;
    }
    
    void setthrottle(int throttle, int x){
      int r = 0;
      if (x==0){
          myServo.writeMicroseconds(set_pos(throttle));
        }else if (throttleOld>=throttle){myServo.writeMicroseconds(set_pos(throttle));
          }else{
          r = throttle - throttleOld;
          for (n=0; n<r; n++){
            myServo.writeMicroseconds(set_pos(throttleOld+n));
            if (delayM(30)==1){return;}
          }
        }
      Serial.print("throttle = ");
      Serial.print(throttle);
      Serial.println("%");
      throttleOld=throttle;
      return;
    }
    
    void breakTest(){
      Serial.println("throttle = 0%");
      myServo.writeMicroseconds(set_pos(0));
      Serial.println("\n\r break");
      throttle=0; strnumber="0"; throttleOld=0;
      return;
    }
    
    int delayM(int m){
      int k;
      for (k=0; k<m; k++){
        if (!(Serial.available())){}else{k = 1; breakTest(); return k;}
        delay(1);
      }
      k = 0;
      return k;
    }
    
    void servaC(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - 100%");
      Serial.println("0 - 0%");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (1){
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){
        myServo.writeMicroseconds(set_pos(100));
        myServo.attach(servoPin, servoMinImp, servoMaxImp);
        Serial.println("\n\r 100% ok");
      }
      if (val==48){
        myServo.writeMicroseconds(set_pos(0));
        Serial.println("\n\r 0% ok");
      }
      if (val==49 || val==48){}else{return;}
      }
    }
    
    void beginCalibrate(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - calibration weight");
      Serial.println("2 - calibration voltage");
      Serial.println("3 - calibration curent");
      Serial.println("4 - calibration ESC");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){Serial.println("\n\r 1 ok");}
      if (val==50){Serial.println("\n\r 2 ok");}
      if (val==51){Serial.println("\n\r 3 ok");}
      if (val==52){servaC();}
      Serial.println("\n\r stop calibration return to console");
      return;
    }
    
    //чтение данных тяги
    int32_t getSensorValueWeight() {
      digitalWrite(SCLK, LOW);  // wake up ADC
      while (digitalRead(DATA) == HIGH);  // wait for data ready, stay in while-loop until LOW
      Weight = shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      digitalWrite(SCLK, HIGH);  // enter sleep mode
      Weight = ((signed long) (Weight << 8)) >> 8;  // process as int24_t (two's compliment 24bit)
      return Weight;
    }
    
    int weightRez(){
      Weight = (getSensorValueWeight() - WeightNull)/204.6615;
      return Weight;
    }
    
    float voltageRez(){
      //расчет данных напряжения
      VoltageValue = analogRead(VoltPin);  // считываем значение аналогового входа (напряжение)
      VoltageValue = VoltageValue*0.0298217;
      return VoltageValue;
    }
    
    float currentRez(){
      //расчет данных тока  
      CurrentValue = analogRead(CurrPin);  // считываем значение аналогового входа (ток)
      CurrentValueRes = (CurrentValue-CountNull)*ISensor/512;  //формула расчета тока для двунаправленнх датчиков ACS758
      //CurrentValueRes = CurrentValue*ISensor/1024;  //формула расчета тока для однонаправленных датчиков ACS758
      return CurrentValueRes;
    }
    
    void printRez(int v){
      //выводим результат
      Serial.print(v);
      Serial.print("\t");
      Serial.print(weightRez());
      Serial.print("\t");
      Serial.print(voltageRez());
      Serial.print("\t");
      Serial.println(currentRez());
      
      Serial.flush();
    }
    
    void loop()
    {
      Serial.println();
      //Serial.println("Helow my friend!");
      Serial.println("Please type the comands:");
      Serial.println("test, calibration, null, setup");
      Serial.println();
      Serial.print(">");
      while (!(Serial.available()));
      String myString = readText(60);
      if (myString=="test"){Serial.println(); beginTest(); error = 0;}
      if (myString=="setup"){Serial.println("\n\r setup ok"); error = 0;}
      if (myString=="calibration"){Serial.println(); beginCalibrate(); error = 0;}
      if (myString=="null"){Serial.println("\n\r null ok"); error = 0;}
      if (myString==""){Serial.println(); error = 0;}
      if (error==0){error=1;}else{Serial.println("\n\r incorrect command");}
    }
    видео пока еще в процессе загрузки


  32. #29

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    46
    Сообщений
    1,085
    Цитата Сообщение от mataor Посмотреть сообщение
    за 18 баксов можно получить 5 датчиков на различный вес от 1 до 7кг
    вот что подумал ...
    чем брать кучу датчиков , может лучше взять один на 10 кг и регулировать чувствительность за счет рычага ??? конструкция как тут
    те один конец датчика крепим к основанию , к второму концу крепим пластину с мотором ... так вот чувствительность можно регулировать длиной пластины ... те расстоянием от крепления датчика до оси мотора ...

  33. #30

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    30
    Сообщений
    1,677
    Записей в дневнике
    6
    я о другом.... о том что во первых дешевле штука, во вторых можно под несколько задач/несколько клонов стендов купить

  34. #31

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Цитата Сообщение от Gapey Посмотреть сообщение
    регулировать чувствительность за счет рычага
    рычаг, это плохо
    проблем в тензодатчике вообще нет никаких
    нет никакой разницы, дорогой датчик или дешевый, любой годится
    лично я ограничил точность стенда в 1 грамм, хотя можно и до одной сотой

  35. #32

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    46
    Сообщений
    1,085
    чтобы не было рычага нужно делать как тут http://www.aliexpress.com/item/Weigh...070639659.html
    те крепить пластину с мотором нужно через прокладку мотором вниз , так чтобы ось мотора была в центре датчика .... если крепить как на фото в 29 посте , что удобнее ,то датчик нужно брать с запасом ... с учетом того что у нас точности с большим запасом , думаю стоит брать датчик ~ 10 кг ...

  36. #33

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    вот такой у меня стенд, никаких рычагов и лишних преград, никакой амортизации и пружин, все жестко закреплено и никаких смещений, единственное свободное смещение это вверх и вниз, пятка луча практически не косается датчика в спокойном состоянии, пропеллер перевернут и дует вверх тем самым прижимая пятку луча к тензодатчику, бывает, что пропеллер тяжелее чем обычно, в начале теста делаю обнуление датчика




  37. #34

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    скетч с ремарками

    Код:
    #include <Servo.h> // добавляем библиотеку для работы с сервоприводами
    
    //объявление переменных
    //подключаемые разьемы на ардуине
    #define servoPin 3 // для дальнейшей работы назовем 3 пин как servoPin
    int DATA = 4;  //пин D4 подключаем АЦП тяги
    int SCLK = 5;  //пин D5 подключаем АЦП тяги 
    int PWDN = 6;  //пин D6 подключаем АЦП тяги
    #define CurrPin A0  //пин A0 датчик тока
    #define VoltPin A1  //пин A1 датчик напряжения
    
    #define servoMinImp 544 // 544 это стандартная длина импульса при котором сервопривод должен принять положение 0°
    #define servoMaxImp 2400 // 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
    
    //переменные для работы
    float CurrentValue = 0;  //переменная для расчета тока (с плавающей точкой)
    float CurrentValueRes = 0;  //переменная с результатом для расчета тока (с плавающей точкой)
    float VoltageValue = 0;  //переменная для расчета напряжения (с плавающей точкой)
    int32_t Weight = 0;  //переменная для расчета тяги (32 разряда)
    int val; //здесь будет храниться принятый символ
    int n; //рабочая переменная
    int error = 0; //так же рабочая переменная
    int throttle = 0; //переменная газа
    String strnumber = "0"; //переменная для временных текствых значаний 
    int throttleOld = 0; //переменная для хранения временных значений газа
    
    //переменные для нулевых значений
    int32_t WeightNull = 0; //нулевое значение по весу (переменная калибруется при включении)
    int CountNull = 0;  //нулевое значение по току, данная переменная для однонаправленных датчиков ACS758 (с буквой U) не используется (переменная калибруется при включении)
    
    //эти переменные заполняются пользователем
    int ISensor = 200;  //максимальное значение измеряемое датчиком (смотрим даташит по ним)
    
    Servo myServo;
    
    //инициализация
    void setup() {
      //инициализация I/O
      pinMode(DATA, INPUT);
      pinMode(SCLK, OUTPUT); 
      pinMode(PWDN, OUTPUT);
      digitalWrite(PWDN, HIGH);
    
      //читаем нулевые значения по весу и току (обнуляем)
      WeightNull = getSensorValueWeight();
      CountNull = analogRead(CurrPin);
    
      Serial.begin(9600); //скорость порта
      
      myServo.attach(servoPin, servoMinImp, servoMaxImp);
    // устанавливаем пин как вывод управления сервоприводом,
    // а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
    // импульсы с большей или меньшей длиной восприниматься не будут.
    // для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
    // поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
      
      myServo.writeMicroseconds(set_pos(0)); //газ в ноль при включении
    }
    
    //чтение вводимой строки из терминала
    //нахождение в цыкле пока не будет нажат ENTER или набранно определенное количество символов
    //возвращает набранную строку
    String readText(int n){
      int i = 0; //временная целая переменная
      String str; //временная строковая переменная
      //собираем заданное количество символов
      while (i<n) {
    	while (!(Serial.available())); //ждем символ
            val = Serial.read(); //дождавшись, читаем его
            if (val==13){return str;} //если нажат Enter, прекращаем ввод символов и передаем набранную строку
            Serial.print(char(val)); //показываем нажатую клавишу на терминале
            str += char(val); //формируем строку
            i++; //наращиваем переменную
      }
      return str; //передаем набранную строку заданной длины
    }
    
    // Функция устанавливает стик газа
    //диапазон желательно указывать от 0 до 100
    int set_pos(int pos) {
      int tmp=(servoMaxImp - servoMinImp) /100;
      pos = servoMinImp + tmp * pos;
      return pos;
    }
    
    //вывод меню для начала теста
    //предоставление выбора типа проводимого теста
    void beginTest(){
      //вывод меню выбора
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - begin auto test 50, 65, 75, 85, 100%");
      Serial.println("2 - begin auto test 1-100%");
      Serial.println("3 - begin manual test");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read(); //ожидание выбора
      Serial.print("you select "); Serial.println(char(val)); //сообщаем, что выбрали
      //по результатам выбора начинаем тест или переходим в консоль
      if (val==49){test(1);} //переход на тест с указанием номера теста 1
      if (val==50){test(2);} //переход на тест с указанием номера теста 2
      if (val==51){test(3);} //переход на тест с указанием номера теста 3
      Serial.println("\n\r stop test return to console"); return; //возвращаем в консоль
    }
    
    //начало теста
    //в зависимости от выбора, запускается тест ВМГ
    int test(int n){
      //ждем нажатие подтверждения начала тестов
      Serial.println("\n\r============= Select action: =============");
      Serial.println("8 - begin test");
      Serial.println("any key - stop test and return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read(); //ожидание выбора
      Serial.print("you select "); Serial.println(char(val)); //сообщаем, что выбрали
      //если подтверждение нажато, начинаем тест, иначе выходим в консоль
      if (val==56){
        Serial.println("\n\r start test"); Serial.println(); //информируем о начале теста
        
        //первый тест
        if (n==1){
          Serial.println("set throttle 50% 65% 75% 85% 100%"); //выводим сообщение
          if (delayM(200)==1){return 0;} //пауза с возможностью прерывания по нажатию любой клавиши
          setthrottle(50, 1, 0); if (delayM(1000)==1){return 0;} printRez(50); //газ плавно доводим до 50%, ждем, выводим результат
          setthrottle(65, 1, 0); if (delayM(1000)==1){return 0;} printRez(65); //газ плавно доводим до 65%, ждем, выводим результат
          setthrottle(75, 1, 0); if (delayM(1000)==1){return 0;} printRez(75); //газ плавно доводим до 75%, ждем, выводим результат
          setthrottle(85, 1, 0); if (delayM(1000)==1){return 0;} printRez(85); //газ плавно доводим до 85%, ждем, выводим результат
          setthrottle(100, 1, 0); if (delayM(1000)==1){return 0;} printRez(100); //газ плавно доводим до 100%, ждем, выводим результат
          setthrottle(0, 0, 1); //газ в ноль
        }
        
        //второй тест
        if (n==2){
          Serial.println("throttle from 0 to 100%"); //выводим сообщение
          if (delayM(200)==1){return 0;} //пауза с возможностью прерывания по нажатию любой клавиши
          for (n=0; n<100; n++){myServo.writeMicroseconds(set_pos(n)); printRez(n); if (delayM(50)==1){return 0;};} //плавный набот газа от 0% до 100% с выводом результата и возможностью прерывания процесса тестирования
          Serial.println("throttle = 0%"); myServo.writeMicroseconds(set_pos(0)); //заканчиваем тест, газ в 0%
        }
        
        //третий тест
        if (n==3){
          Serial.println("select throttle percent or press +/- or r for print result"); //выводим сообщение
          error=0; //обнуляем временную переменную
          //создаем петлю
          while (1){
            while (!(Serial.available())); val = Serial.read();  //ждем нажатия клавиши и читаем ее
            //если нажат + (причем любой) наращиваем значение газа, так же присутствует вывод степени набора газа, ограничение на больше 100% и прерывание процесса тестирования
            if (val==61 || val==43){if (error==1){breakTest(); return 0;}else if (throttle<=99){throttle++; setthrottle(throttle, 0, 1);}else{Serial.println("maximal throttle 100%");}}
            //подобно условию выше для знака +, только теперь для знака -
            else if (val==45){if (error==1){breakTest(); return 0;}else if (throttle>=1){throttle--;  setthrottle(throttle, 0, 1);}else{Serial.println("minimal throttle 0%");}}
            //при нажатии Enter, формируется и устанавливается уровень газа с выводом уровня установленного газа
            else if (val==13){Serial.println(); error=0; throttle=strnumber.toInt(); if (throttle>=101){breakTest(); return 0;} setthrottle(throttle, 1, 1); strnumber="0";}
            //тут мы формируем уровень газа путем нажатия цифровых клавиш, формирование прекращается по нажатию клавиши Enter
            else if (val>=48 && val<=57){Serial.print(char(val)); error=1; strnumber += char(val);}
            //если в процессе работы теста нажать калвишу "r", то произойдет вывод данных датчиков
            else if (val==114){printRez(throttle);}
            //завершаем тест
            else {breakTest(); return 0;}
          }
        }
      }
      return 0; //если нажата не "8", завершаем тест
    }
    
    //установка уровня газа
    //при нулевом значении газ обрабатывается моментально, использовать только для снижения значения
    //при занчении противоположном нулевому, газ будет набираться плавно
    //еще добавлено одно значение для разрешения/запрета вывода результата установленного уровня газа
    void setthrottle(int throttle, int x, int y){
      int r = 0; //обнуляем переменную
      //если значение переменной х равно 0, изменение газа происходит моментально, при любом другом, газ будет наращиваться плавно
      if (x==0){
          myServo.writeMicroseconds(set_pos(throttle)); //моментальное изменение газа
        }else if (throttleOld>=throttle){myServo.writeMicroseconds(set_pos(throttle)); //условие для активации плавного набора газа
          }else{
          r = throttle - throttleOld; //просчитываем разность старого и нового значения газа для счетчика
          //плавное изменение газа
          for (n=0; n<r; n++){
            myServo.writeMicroseconds(set_pos(throttleOld+n)); //изменяем уровень газа
            if (delayM(30)==1){return;} //задержка и возможность прекращение теста по нажатию на клавишу
          }
        }
      if (y==1){Serial.print("throttle = "); Serial.print(throttle); Serial.println("%");} //еслт y имеет значение 1, выводим результаты значения газа
      throttleOld=throttle; //формируем старые показания уровня газа
      return; //выход из подпрограммы
    }
    
    //функция прерывания теста, выводим сообщение о прерывании, ставим значение уровня газа в 0, обнуляем переменные
    void breakTest(){
      Serial.println("throttle = 0%");
      myServo.writeMicroseconds(set_pos(0));
      Serial.println("\n\r break");
      throttle=0; strnumber="0"; throttleOld=0;
      return;
    }
    
    //функция задержки с возможностью прерывания
    int delayM(int m){
      int k;
      for (k=0; k<m; k++){
        if (!(Serial.available())){}else{k = 1; breakTest(); return k;}
        delay(1);
      }
      k = 0;
      return k;
    }
    
    //функция калибровки для уровня газа (еще не готова)
    void servaC(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - 100%");
      Serial.println("0 - 0%");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (1){
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){
        myServo.writeMicroseconds(set_pos(100));
        myServo.attach(servoPin, servoMinImp, servoMaxImp);
        Serial.println("\n\r 100% ok");
      }
      if (val==48){
        myServo.writeMicroseconds(set_pos(0));
        Serial.println("\n\r 0% ok");
      }
      if (val==49 || val==48){}else{return;}
      }
    }
    
    //формирование меню калибровок
    void beginCalibrate(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - calibration weight");
      Serial.println("2 - calibration voltage");
      Serial.println("3 - calibration curent");
      Serial.println("4 - calibration ESC");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){Serial.println("\n\r 1 ok");}
      if (val==50){Serial.println("\n\r 2 ok");}
      if (val==51){Serial.println("\n\r 3 ok");}
      if (val==52){servaC();}
      Serial.println("\n\r stop calibration return to console");
      return;
    }
    
    //чтение данных тяги
    int32_t getSensorValueWeight() {
      digitalWrite(SCLK, LOW);  // wake up ADC
      while (digitalRead(DATA) == HIGH);  // wait for data ready, stay in while-loop until LOW
      Weight = shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      digitalWrite(SCLK, HIGH);  // enter sleep mode
      Weight = ((signed long) (Weight << 8)) >> 8;  // process as int24_t (two's compliment 24bit)
      return Weight;
    }
    
    //результат по тяге
    int weightRez(){
      Weight = (getSensorValueWeight() - WeightNull)/204.6615;
      return Weight;
    }
    
    //результат по напряжению
    float voltageRez(){
      //расчет данных напряжения
      VoltageValue = analogRead(VoltPin);  // считываем значение аналогового входа (напряжение)
      VoltageValue = VoltageValue*0.0298217;
      return VoltageValue;
    }
    
    //результат по току
    float currentRez(){
      //расчет данных тока  
      CurrentValue = analogRead(CurrPin);  // считываем значение аналогового входа (ток)
      CurrentValueRes = (CurrentValue-CountNull)*ISensor/512;  //формула расчета тока для двунаправленнх датчиков ACS758
      //CurrentValueRes = CurrentValue*ISensor/1024;  //формула расчета тока для однонаправленных датчиков ACS758
      return CurrentValueRes;
    }
    
    //выводим результаты датчиков, переменная v для уровня газа
    void printRez(int v){
      //выводим результат
      Serial.print(v);
      Serial.print("\t");
      Serial.print(weightRez());
      Serial.print("\t");
      Serial.print(voltageRez());
      Serial.print("\t");
      Serial.println(currentRez());
      Serial.flush();
    }
    
    //начало программы
    void loop()
    {
      Serial.println();
      //Serial.println("Helow my friend!");
      Serial.println("Please type the comands:");
      Serial.println("test, calibration, null, setup");
      Serial.println();
      Serial.print(">");
      while (!(Serial.available()));
      String myString = readText(60);
      if (myString=="test"){Serial.println(); beginTest(); error = 0;}
      if (myString=="setup"){Serial.println("\n\r setup ok"); error = 0;}
      if (myString=="calibration"){Serial.println(); beginCalibrate(); error = 0;}
      if (myString=="null"){Serial.println("\n\r null ok"); error = 0;}
      if (myString==""){Serial.println(); error = 0;}
      if (error==0){error=1;}else{Serial.println("\n\r incorrect command");}
    }

  38. #35

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    все, закончил
    осталось поставить на стенд и проверить работу
    если получится, протестирую в выходные

    Код:
    #include <EEPROM2.h> //подключаем библиотеку EEPROM2 http://www.freeduino.ru/arduino/files/EEPROM2.zip
    #include <Servo.h> // добавляем библиотеку для работы с сервоприводами
    
    //объявление переменных
    //подключаемые разьемы на ардуине
    #define servoPin 3 // для дальнейшей работы назовем 3 пин как servoPin
    int DATA = 4;  //пин D4 подключаем АЦП тяги
    int SCLK = 5;  //пин D5 подключаем АЦП тяги 
    int PWDN = 6;  //пин D6 подключаем АЦП тяги
    #define CurrPin A0  //пин A0 датчик тока
    #define VoltPin A1  //пин A1 датчик напряжения
    
    #define servoMinImp 544 // 544 это стандартная длина импульса при котором сервопривод должен принять положение 0°
    #define servoMaxImp 2400 // 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
    
    //переменные для работы
    unsigned long volt; //четырех байтная переменная для хранения в памяти
    unsigned long amper; //четырех байтная переменная для хранения в памяти
    unsigned long gramm; //четырех байтная переменная для хранения в памяти
    float grammT = 0;
    int32_t grammM = 0;
    float voltT = 0;
    int32_t voltM = 0;
    float amperT = 0;
    int32_t amperM = 0;
    float CurrentValue = 0;  //переменная для расчета тока (с плавающей точкой)
    float CurrentValueRes = 0;  //переменная с результатом для расчета тока (с плавающей точкой)
    float VoltageValue = 0;  //переменная для расчета напряжения (с плавающей точкой)
    int32_t Weight = 0;  //переменная для расчета тяги (32 разряда)
    int val; //здесь будет храниться принятый символ
    int n; //рабочая переменная
    int error = 0; //так же рабочая переменная
    int throttle = 0; //переменная газа
    String strnumber = "0"; //переменная для временных текствых значаний 
    int throttleOld = 0; //переменная для хранения временных значений газа
    
    //переменные для нулевых значений
    int32_t WeightNull = 0; //нулевое значение по весу (переменная калибруется при включении)
    int CountNull = 0;  //нулевое значение по току, данная переменная для однонаправленных датчиков ACS758 (с буквой U) не используется (переменная калибруется при включении)
    
    //эти переменные заполняются пользователем
    int ISensor = 200;  //максимальное значение измеряемое датчиком (смотрим даташит по ним)
    
    Servo myServo;
    
    //инициализация
    void setup() {
      //инициализация I/O
      pinMode(DATA, INPUT);
      pinMode(SCLK, OUTPUT); 
      pinMode(PWDN, OUTPUT);
      digitalWrite(PWDN, HIGH);
    
    
    
      Serial.begin(9600); //скорость порта
      
      myServo.attach(servoPin, servoMinImp, servoMaxImp);
    // устанавливаем пин как вывод управления сервоприводом,
    // а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
    // импульсы с большей или меньшей длиной восприниматься не будут.
    // для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
    // поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
      
      myServo.writeMicroseconds(set_pos(0)); //газ в ноль при включении
    }
    
    //чтение вводимой строки из терминала
    //нахождение в цыкле пока не будет нажат ENTER или набранно определенное количество символов
    //возвращает набранную строку
    String readText(int n){
      int i = 0; //временная целая переменная
      String str; //временная строковая переменная
      //собираем заданное количество символов
      while (i<n) {
    	while (!(Serial.available())); //ждем символ
            val = Serial.read(); //дождавшись, читаем его
            if (val==13){return str;} //если нажат Enter, прекращаем ввод символов и передаем набранную строку
            Serial.print(char(val)); //показываем нажатую клавишу на терминале
            str += char(val); //формируем строку
            i++; //наращиваем переменную
      }
      return str; //передаем набранную строку заданной длины
    }
    
    // Функция устанавливает стик газа
    //диапазон желательно указывать от 0 до 100
    int set_pos(int pos) {
      int tmp=(servoMaxImp - servoMinImp) /100;
      pos = servoMinImp + tmp * pos;
      return pos;
    }
    
    //вывод меню для начала теста
    //предоставление выбора типа проводимого теста
    void beginTest(){
      //вывод меню выбора
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - begin auto test 50, 65, 75, 85, 100%");
      Serial.println("2 - begin auto test 1-100%");
      Serial.println("3 - begin manual test");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read(); //ожидание выбора
      Serial.print("you select "); Serial.println(char(val)); //сообщаем, что выбрали
      //по результатам выбора начинаем тест или переходим в консоль
      if (val==49){test(1);} //переход на тест с указанием номера теста 1
      if (val==50){test(2);} //переход на тест с указанием номера теста 2
      if (val==51){test(3);} //переход на тест с указанием номера теста 3
      Serial.println("\n\r stop test return to console"); return; //возвращаем в консоль
    }
    
    //начало теста
    //в зависимости от выбора, запускается тест ВМГ
    int test(int n){
      //ждем нажатие подтверждения начала тестов
      Serial.println("\n\r============= Select action: =============");
      Serial.println("8 - begin test");
      Serial.println("any key - stop test and return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read(); //ожидание выбора
      Serial.print("you select "); Serial.println(char(val)); //сообщаем, что выбрали
      //если подтверждение нажато, начинаем тест, иначе выходим в консоль
      if (val==56){
        Serial.println("\n\r start test"); Serial.println(); //информируем о начале теста
        
        //первый тест
        if (n==1){
          Serial.println("set throttle 50% 65% 75% 85% 100%"); //выводим сообщение
          if (delayM(200)==1){return 0;} //пауза с возможностью прерывания по нажатию любой клавиши
          Serial.println("\n\r%\tg\tv\ta"); //формируем шапку для вывода результатов
          setthrottle(50, 1, 0); if (delayM(1000)==1){return 0;} printRez(50); //газ плавно доводим до 50%, ждем, выводим результат
          setthrottle(65, 1, 0); if (delayM(1000)==1){return 0;} printRez(65); //газ плавно доводим до 65%, ждем, выводим результат
          setthrottle(75, 1, 0); if (delayM(1000)==1){return 0;} printRez(75); //газ плавно доводим до 75%, ждем, выводим результат
          setthrottle(85, 1, 0); if (delayM(1000)==1){return 0;} printRez(85); //газ плавно доводим до 85%, ждем, выводим результат
          setthrottle(100, 1, 0); if (delayM(1000)==1){return 0;} printRez(100); //газ плавно доводим до 100%, ждем, выводим результат
          setthrottle(0, 0, 1); //газ в ноль
        }
        
        //второй тест
        if (n==2){
          Serial.println("throttle from 0 to 100%"); //выводим сообщение
          if (delayM(200)==1){return 0;} //пауза с возможностью прерывания по нажатию любой клавиши
          Serial.println("\n\r%\tg\tv\ta"); //формируем шапку для вывода результатов
          for (n=0; n<100; n++){myServo.writeMicroseconds(set_pos(n)); printRez(n); if (delayM(50)==1){return 0;};} //плавный набот газа от 0% до 100% с выводом результата и возможностью прерывания процесса тестирования
          Serial.println("throttle = 0%"); myServo.writeMicroseconds(set_pos(0)); //заканчиваем тест, газ в 0%
        }
        
        //третий тест
        if (n==3){
          Serial.println("select throttle percent or press +/- or r for print result"); //выводим сообщение
          error=0; //обнуляем временную переменную
          //создаем петлю
          while (1){
            while (!(Serial.available())); val = Serial.read();  //ждем нажатия клавиши и читаем ее
            //если нажат + (причем любой) наращиваем значение газа, так же присутствует вывод степени набора газа, ограничение на больше 100% и прерывание процесса тестирования
            if (val==61 || val==43){if (error==1){breakTest(); return 0;}else if (throttle<=99){throttle++; setthrottle(throttle, 0, 1);}else{Serial.println("maximal throttle 100%");}}
            //подобно условию выше для знака +, только теперь для знака -
            else if (val==45){if (error==1){breakTest(); return 0;}else if (throttle>=1){throttle--;  setthrottle(throttle, 0, 1);}else{Serial.println("minimal throttle 0%");}}
            //при нажатии Enter, формируется и устанавливается уровень газа с выводом уровня установленного газа
            else if (val==13){Serial.println(); error=0; throttle=strnumber.toInt(); if (throttle>=101){breakTest(); return 0;} setthrottle(throttle, 1, 1); strnumber="0";}
            //тут мы формируем уровень газа путем нажатия цифровых клавиш, формирование прекращается по нажатию клавиши Enter
            else if (val>=48 && val<=57){Serial.print(char(val)); error=1; strnumber += char(val);}
            //если в процессе работы теста нажать калвишу "r", то произойдет вывод данных датчиков
            else if (val==114){Serial.println("\n\r%\tg\tv\ta"); printRez(throttle);}
            //завершаем тест
            else {breakTest(); return 0;}
          }
        }
      }
      return 0; //если нажата не "8", завершаем тест
    }
    
    //установка уровня газа
    //при нулевом значении газ обрабатывается моментально, использовать только для снижения значения
    //при занчении противоположном нулевому, газ будет набираться плавно
    //еще добавлено одно значение для разрешения/запрета вывода результата установленного уровня газа
    void setthrottle(int throttle, int x, int y){
      int r = 0; //обнуляем переменную
      //если значение переменной х равно 0, изменение газа происходит моментально, при любом другом, газ будет наращиваться плавно
      if (x==0){
          myServo.writeMicroseconds(set_pos(throttle)); //моментальное изменение газа
        }else if (throttleOld>=throttle){myServo.writeMicroseconds(set_pos(throttle)); //условие для активации плавного набора газа
          }else{
          r = throttle - throttleOld; //просчитываем разность старого и нового значения газа для счетчика
          //плавное изменение газа
          for (n=0; n<r; n++){
            myServo.writeMicroseconds(set_pos(throttleOld+n)); //изменяем уровень газа
            if (delayM(30)==1){return;} //задержка и возможность прекращение теста по нажатию на клавишу
          }
        }
      if (y==1){Serial.print("throttle = "); Serial.print(throttle); Serial.println("%");} //еслт y имеет значение 1, выводим результаты значения газа
      throttleOld=throttle; //формируем старые показания уровня газа
      return; //выход из подпрограммы
    }
    
    //функция прерывания теста, выводим сообщение о прерывании, ставим значение уровня газа в 0, обнуляем переменные
    void breakTest(){
      Serial.println("throttle = 0%");
      myServo.writeMicroseconds(set_pos(0));
      Serial.println("\n\r break");
      throttle=0; strnumber="0"; throttleOld=0;
      return;
    }
    
    //функция задержки с возможностью прерывания
    int delayM(int m){
      int k;
      for (k=0; k<m; k++){
        if (!(Serial.available())){}else{k = 1; breakTest(); return k;}
        delay(1);
      }
      k = 0;
      return k;
    }
    
    //функция калибровки для уровня газа (еще не готова)
    void servaC(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - 100%");
      Serial.println("0 - 0%");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (1){
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){
        myServo.writeMicroseconds(set_pos(100));
        myServo.attach(servoPin, servoMinImp, servoMaxImp);
        Serial.println("\n\r 100% ok");
      }
      if (val==48){
        myServo.writeMicroseconds(set_pos(0));
        Serial.println("\n\r 0% ok");
      }
      if (val==49 || val==48){}else{return;}
      }
    }
    
    //формирование меню калибровок
    void beginCalibrate(){
      Serial.println("\n\r============= Select action: =============");
      Serial.println("1 - calibration weight");
      Serial.println("2 - calibration voltage");
      Serial.println("3 - calibration curent");
      Serial.println("4 - calibration ESC");
      Serial.println("any key - return to console");
      Serial.println("==========================================");
      while (!(Serial.available())); val = Serial.read();
      Serial.print("you select "); Serial.println(char(val));
      if (val==49){weightC();}
      if (val==50){voltC();}
      if (val==51){amperC();}
      if (val==52){servaC();}
      Serial.println("\n\r stop calibration return to console");
      return;
    }
    
    void weightC(){
          Serial.println("put standard and set weight"); //выводим сообщение
          error=0; //обнуляем временную переменную
          //создаем петлю
          while (1){
            while (!(Serial.available())); val = Serial.read();  //ждем нажатия клавиши и читаем ее
            //при нажатии Enter
            if (val==13){Serial.println(); error=0; grammT=strnumber.toInt(); strnumber="0"; grammM=((getSensorValueWeight() - WeightNull)/grammT)*1000000; EEPROM_write(15, grammM); return;}
            //тут мы формируем вес путем нажатия цифровых клавиш, формирование прекращается по нажатию клавиши Enter
            else if (val>=48 && val<=57){Serial.print(char(val)); error=1; strnumber += char(val);}
            //завершаем тест
            else {return;}
          }
    }
    
    void voltC(){
          Serial.println("connect standard and set real volt"); //выводим сообщение
          error=0; //обнуляем временную переменную
          //создаем петлю
          while (1){
            while (!(Serial.available())); val = Serial.read();  //ждем нажатия клавиши и читаем ее
            //при нажатии Enter
            if (val==13){Serial.println(); error=0; voltT=strnumber.toInt(); strnumber="0"; voltM=voltT/analogRead(VoltPin)/100*1000000; EEPROM_write(0, voltM); return;}
            //тут мы формируем вес путем нажатия цифровых клавиш, формирование прекращается по нажатию клавиши Enter
            else if (val>=48 && val<=57){Serial.print(char(val)); error=1; strnumber += char(val);}
            //завершаем тест
            else {return;}
          }
    }
    
    void amperC(){
          Serial.println("connect standard and set real current"); //выводим сообщение
          error=0; //обнуляем временную переменную
          //создаем петлю
          while (1){
            while (!(Serial.available())); val = Serial.read();  //ждем нажатия клавиши и читаем ее
            //если нажат + (причем любой) наращиваем значение газа, так же присутствует вывод степени набора газа, ограничение на больше 100% и прерывание процесса тестирования
            if (val==61 || val==43){if (error==1){breakTest(); return;}else if (throttle<=99){throttle++; setthrottle(throttle, 0, 1);}else{Serial.println("maximal throttle 100%");}}
            //подобно условию выше для знака +, только теперь для знака -
            else if (val==45){if (error==1){breakTest(); return;}else if (throttle>=1){throttle--;  setthrottle(throttle, 0, 1);}else{Serial.println("minimal throttle 0%");}} 
            //при нажатии Enter
            else if (val==13){Serial.println(); error=0; amperT=strnumber.toInt(); strnumber="0"; amperM=amperT/(analogRead(CurrPin)-CountNull)/1000*1000000; EEPROM_write(7, amperM); breakTest(); return;}
            //тут мы формируем вес путем нажатия цифровых клавиш, формирование прекращается по нажатию клавиши Enter
            else if (val>=48 && val<=57){Serial.print(char(val)); error=1; strnumber += char(val);}
            //завершаем тест
            else {breakTest(); return;}
          }
    }
    
    //чтение данных тяги
    int32_t getSensorValueWeight() {
      digitalWrite(SCLK, LOW);  // wake up ADC
      while (digitalRead(DATA) == HIGH);  // wait for data ready, stay in while-loop until LOW
      Weight = shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      Weight <<= 8;
      Weight |= shiftIn(DATA, SCLK, MSBFIRST);
      digitalWrite(SCLK, HIGH);  // enter sleep mode
      Weight = ((signed long) (Weight << 8)) >> 8;  // process as int24_t (two's compliment 24bit)
      return Weight;
    }
    
    //результат по тяге
    int weightRez(){
      Weight = (getSensorValueWeight() - WeightNull)/grammT;//204.6615;
      return Weight;
    }
    
    //результат по напряжению
    float voltageRez(){
      //расчет данных напряжения
      VoltageValue = analogRead(VoltPin);  // считываем значение аналогового входа (напряжение)
      VoltageValue = VoltageValue*voltT;  //0.0298217;
      return VoltageValue;
    }
    
    //результат по току
    float currentRez(){
      //расчет данных тока  
      CurrentValue = analogRead(CurrPin);  // считываем значение аналогового входа (ток)
      CurrentValueRes = (CurrentValue-CountNull)*amperT;
      //CurrentValueRes = (CurrentValue-CountNull)*ISensor/512;  //формула расчета тока для двунаправленнх датчиков ACS758
      //CurrentValueRes = CurrentValue*ISensor/1024;  //формула расчета тока для однонаправленных датчиков ACS758
      return CurrentValueRes;
    }
    
    //выводим результаты датчиков, переменная v для уровня газа
    void printRez(int v){
      //выводим результат
      Serial.print(v);
      Serial.print("\t");
      Serial.print(weightRez());
      Serial.print("\t");
      Serial.print(voltageRez());
      Serial.print("\t");
      Serial.println(currentRez());
      Serial.flush();
    }
    
    void nullF(){
      //читаем нулевые значения по весу и току (обнуляем)
      WeightNull = getSensorValueWeight();
      CountNull = analogRead(CurrPin);
      EEPROM_write(23, WeightNull);
      EEPROM_write(31, CountNull);
      Serial.println("\n\r zero value of the set");
    }
    
    //начало программы
    void loop()
    {
      EEPROM_read(0, volt); //читаем из пямяти переменную
      EEPROM_read(7, amper); //читаем из пямяти переменную
      EEPROM_read(15, gramm); //читаем из пямяти переменную
      voltT = (float)volt/1000000;
      amperT = (float)amper/1000000; //Serial.println(amper);
      grammT = (float)gramm/1000000;
      
      EEPROM_read(23, WeightNull);
      EEPROM_read(31, CountNull);
      
      Serial.println();
      Serial.println("\n\r%\tg\tv\ta"); printRez(0);
      Serial.println();
      //Serial.println("Helow my friend!");
      Serial.println("Please type the comands:");
      Serial.println("test, calibration, null");
      Serial.println();
      Serial.print(">");
      while (!(Serial.available()));
      String myString = readText(60);
      if (myString=="test" || myString=="t"){Serial.println(); beginTest(); error = 0;}
      //if (myString=="setup"){Serial.println("\n\r setup ok"); error = 0;}
      if (myString=="calibration" || myString=="c"){Serial.println(); beginCalibrate(); error = 0;}
      if (myString=="null" || myString=="n"){nullF(); error = 0;}
      if (myString==""){Serial.println(); error = 0;}
      if (error==0){error=1;}else{Serial.println("\n\r incorrect command");}
    }
    добавлено калибровка тяги, тока, напряжения и регулей
    установка нулевых уровней для тока и тяги
    все значения сохраняются в энергонезависимую память

    заказал для стенда новую платку АЦП
    и более чувствительный датчик тока

    ЗЫ осталось самое сложное, написать документацию

  39. #36

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    37
    Сообщений
    4,528
    Записей в дневнике
    9
    Код:
    float CurrentValueRes = 0.0f;  // переменная с результатом для расчета тока (с плавающей точкой)
    А то могут и непонятки начаться типа вместо 1 будет 0.999998....

  40. #37

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    результаты пробного тестирования, как и ожидалось, дело осталось за фильтром



    Код:
    %	g	v	a
    0	4	4.33	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 1
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    set throttle 50% 65% 75% 85% 100%
    
    %	g	v	a
    50	471	16.46	3.54
    65	735	16.16	4.73
    75	942	16.13	7.68
    85	1160	16.04	10.34
    100	1451	15.83	15.06
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1451	16.31	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 2
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    throttle from 0 to 100%
    
    %	g	v	a
    0	3	16.43	0.30
    1	4	16.43	0.30
    2	4	16.43	0.30
    3	3	16.43	0.30
    4	3	16.43	1.48
    5	3	16.43	0.59
    6	3	16.34	0.59
    7	4	16.43	0.59
    8	4	16.43	0.89
    9	7	16.43	0.59
    10	11	16.43	0.59
    11	16	16.46	0.89
    12	21	16.43	0.89
    13	26	16.46	0.89
    14	32	16.37	0.30
    15	38	16.43	0.89
    16	44	16.43	0.89
    17	50	16.46	1.18
    18	56	16.34	0.59
    19	63	16.37	0.30
    20	71	16.43	1.18
    21	79	16.34	0.59
    22	87	16.46	0.89
    23	95	16.31	0.59
    24	104	16.46	1.18
    25	113	16.46	1.48
    26	121	16.31	0.89
    27	131	16.46	1.48
    28	142	16.37	1.48
    29	153	16.31	1.18
    30	163	16.37	0.89
    31	173	16.46	1.77
    32	184	16.46	1.77
    33	195	16.43	2.07
    34	207	16.46	2.07
    35	218	16.40	1.18
    36	229	16.46	2.36
    37	241	16.43	2.36
    38	253	16.40	2.36
    39	266	16.49	2.66
    40	279	16.46	2.66
    41	292	16.25	2.07
    42	306	16.28	2.07
    43	321	16.28	2.36
    44	336	16.28	2.66
    45	350	16.31	2.95
    46	364	16.28	3.25
    47	379	16.49	3.54
    48	393	16.22	2.66
    49	409	16.46	3.54
    50	425	16.19	2.66
    51	442	16.22	2.95
    52	457	16.43	3.54
    53	472	16.22	2.95
    54	488	16.46	4.73
    55	505	16.55	5.02
    56	524	16.16	3.54
    57	543	16.28	5.61
    58	558	16.49	5.61
    59	573	16.49	5.61
    60	591	16.49	5.61
    61	608	16.10	4.73
    62	627	16.49	6.50
    63	646	16.16	4.73
    64	666	16.16	5.02
    65	686	16.10	5.61
    66	706	16.52	7.98
    67	725	16.07	5.61
    68	745	16.19	7.09
    69	767	16.10	6.50
    70	788	16.10	6.50
    71	809	16.43	8.57
    72	829	16.10	9.16
    73	848	16.34	6.79
    74	870	16.49	9.75
    75	893	16.07	8.86
    76	914	16.31	7.98
    77	936	16.07	7.98
    78	960	16.49	8.86
    79	984	16.07	10.63
    80	1006	16.04	9.45
    81	1029	16.01	10.04
    82	1051	16.04	10.34
    83	1072	15.98	10.34
    84	1094	16.10	10.63
    85	1118	15.98	10.63
    86	1145	15.95	11.22
    87	1169	16.37	11.52
    88	1187	15.92	11.82
    89	1208	15.89	12.41
    90	1230	15.92	12.41
    91	1252	15.95	12.70
    92	1277	15.89	13.29
    93	1300	16.16	13.88
    94	1319	15.89	14.18
    95	1340	15.89	14.47
    96	1365	15.98	14.47
    97	1390	15.83	15.95
    98	1413	15.89	14.77
    99	1441	15.92	16.54
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1467	16.31	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
     incorrect command
    
    
    %	g	v	a
    0	5	16.43	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 2
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    throttle from 0 to 100%
    
    %	g	v	a
    0	5	16.43	0.30
    1	5	16.43	0.30
    2	4	16.43	0.30
    3	5	16.43	1.18
    4	4	16.43	0.59
    5	4	16.43	0.59
    6	4	16.43	0.59
    7	4	16.43	0.59
    8	5	16.40	0.59
    9	8	16.46	0.89
    10	13	16.46	0.89
    11	18	16.43	0.59
    12	23	16.46	0.89
    13	28	16.46	0.89
    14	33	16.43	0.89
    15	39	16.37	0.30
    16	45	16.43	0.89
    17	52	16.34	0.30
    18	58	16.43	0.89
    19	66	16.43	0.89
    20	73	16.46	1.18
    21	81	16.34	0.59
    22	89	16.46	0.89
    23	97	16.43	1.18
    24	106	16.46	1.18
    25	115	16.37	0.89
    26	124	16.46	1.77
    27	134	16.28	0.89
    28	145	16.31	0.89
    29	155	16.46	1.77
    30	165	16.28	0.89
    31	176	16.37	1.18
    32	187	16.37	1.48
    33	197	15.98	2.07
    34	208	16.28	1.18
    35	220	16.46	2.36
    36	232	16.25	1.18
    37	246	16.46	2.36
    38	259	16.25	1.48
    39	272	16.31	2.07
    40	285	16.43	2.36
    41	300	16.46	2.95
    42	315	16.46	2.95
    43	330	16.43	2.95
    44	344	16.31	2.36
    45	359	16.34	2.66
    46	373	16.28	2.95
    47	387	16.22	2.36
    48	401	16.46	2.36
    49	415	16.46	4.14
    50	430	16.46	4.43
    51	446	16.49	4.14
    52	462	16.49	4.43
    53	477	16.46	4.73
    54	494	16.49	3.84
    55	512	16.16	3.25
    56	530	16.37	4.43
    57	548	16.37	4.73
    58	564	16.13	3.84
    59	582	16.10	4.43
    60	602	16.49	5.91
    61	623	16.10	4.43
    62	642	16.13	4.43
    63	659	16.49	6.50
    64	679	16.13	5.32
    65	699	16.16	5.61
    66	719	16.46	5.91
    67	739	16.10	6.20
    68	759	16.16	7.09
    69	780	16.10	6.50
    70	800	16.10	6.50
    71	821	16.19	7.98
    72	842	16.31	7.09
    73	862	16.13	7.98
    74	883	16.28	7.68
    75	904	16.40	9.45
    76	927	16.07	8.27
    77	947	16.01	8.57
    78	968	16.28	8.86
    79	991	16.07	9.16
    80	1015	16.16	10.63
    81	1038	16.04	10.63
    82	1061	16.49	11.52
    83	1083	16.01	10.34
    84	1108	15.98	10.63
    85	1132	16.01	10.93
    86	1155	16.49	13.00
    87	1177	16.34	12.41
    88	1200	15.95	12.11
    89	1221	15.92	12.41
    90	1241	16.31	12.70
    91	1264	15.89	13.29
    92	1286	16.07	13.59
    93	1309	15.89	13.88
    94	1335	15.92	13.88
    95	1359	16.01	14.47
    96	1382	15.80	15.66
    97	1404	15.83	15.36
    98	1431	16.31	15.06
    99	1464	15.86	15.06
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1474	16.31	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 2
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    throttle from 0 to 100%
    
    %	g	v	a
    0	6	16.40	0.30
    1	6	16.40	0.30
    2	6	16.40	0.30
    3	6	16.43	0.89
    4	6	16.40	0.89
    5	6	16.43	0.59
    6	6	16.40	0.89
    7	6	16.40	0.59
    8	7	16.34	0.30
    9	9	16.31	0.59
    10	13	16.37	0.59
    11	17	16.31	0.30
    12	22	16.40	0.59
    13	28	16.43	0.89
    14	33	16.43	0.89
    15	39	16.31	0.89
    16	45	16.43	0.89
    17	51	16.40	0.89
    18	58	16.34	0.59
    19	65	16.40	0.30
    20	72	16.40	1.18
    21	80	16.37	0.30
    22	89	16.40	0.59
    23	97	16.40	1.48
    24	105	16.40	1.48
    25	113	16.43	1.48
    26	121	16.43	1.77
    27	130	16.28	0.59
    28	138	16.40	1.48
    29	148	16.43	1.77
    30	158	16.25	0.89
    31	168	16.25	0.89
    32	178	16.40	2.07
    33	189	16.37	1.48
    34	199	16.43	2.07
    35	208	16.22	1.18
    36	218	16.31	1.77
    37	230	16.46	2.07
    38	241	16.46	2.66
    39	254	16.43	2.66
    40	268	16.22	1.48
    41	282	16.43	2.66
    42	297	16.19	1.77
    43	312	16.40	2.95
    44	328	16.19	1.77
    45	342	16.19	2.07
    46	354	16.43	3.54
    47	367	16.25	2.95
    48	382	16.19	2.36
    49	397	16.31	2.95
    50	411	16.37	2.95
    51	427	16.19	3.25
    52	442	16.43	4.14
    53	456	16.43	4.14
    54	472	16.46	5.02
    55	489	16.16	3.84
    56	506	16.16	3.54
    57	524	16.16	4.14
    58	541	16.13	4.14
    59	558	16.43	5.61
    60	574	16.07	6.50
    61	591	16.16	5.02
    62	608	16.07	4.73
    63	627	16.19	5.02
    64	649	16.19	6.20
    65	671	16.07	5.32
    66	692	16.46	5.61
    67	713	16.10	5.91
    68	731	16.04	5.91
    69	752	16.46	7.98
    70	772	16.10	7.68
    71	794	16.04	7.09
    72	814	16.04	6.50
    73	835	16.04	7.09
    74	856	15.98	7.98
    75	876	16.10	8.27
    76	895	16.04	8.27
    77	917	16.01	9.75
    78	939	16.28	8.57
    79	961	15.98	8.86
    80	986	16.16	10.34
    81	1012	15.98	9.75
    82	1035	15.89	9.45
    83	1055	15.95	11.52
    84	1076	15.92	12.11
    85	1098	16.28	11.82
    86	1122	15.98	12.41
    87	1144	16.01	12.41
    88	1162	16.10	11.82
    89	1184	15.92	12.11
    90	1205	15.98	13.29
    91	1225	16.13	14.18
    92	1245	16.13	12.70
    93	1269	15.89	13.88
    94	1290	16.22	13.59
    95	1310	15.95	14.47
    96	1330	15.89	14.47
    97	1353	15.92	15.66
    98	1376	15.86	15.06
    99	1404	15.89	15.95
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1433	16.28	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 2
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    throttle from 0 to 100%
    
    %	g	v	a
    0	7	16.37	0.30
    1	7	16.37	0.30
    2	7	16.40	0.30
    3	7	16.40	0.30
    4	7	16.43	0.89
    5	7	16.28	0.59
    6	7	16.37	0.59
    7	7	16.34	0.59
    8	7	16.37	0.59
    9	9	16.40	0.59
    10	13	16.37	0.59
    11	17	16.40	0.89
    12	22	16.40	0.89
    13	27	16.40	0.89
    14	32	16.31	0.59
    15	37	16.31	0.59
    16	43	16.40	0.59
    17	50	16.40	1.18
    18	56	16.40	1.18
    19	63	16.34	0.89
    20	70	16.40	1.18
    21	77	16.40	1.18
    22	85	16.40	0.89
    23	92	16.40	1.18
    24	100	16.40	1.48
    25	109	16.40	1.18
    26	118	16.28	1.18
    27	129	16.40	1.77
    28	139	16.28	0.89
    29	148	16.43	1.77
    30	158	16.40	1.77
    31	168	16.25	0.89
    32	179	16.49	2.07
    33	189	16.25	1.18
    34	199	16.40	1.18
    35	210	16.40	2.07
    36	222	16.37	1.48
    37	234	16.25	1.77
    38	248	16.43	2.36
    39	260	16.25	2.07
    40	274	16.40	2.66
    41	288	16.28	2.66
    42	303	16.43	2.95
    43	318	16.43	3.25
    44	332	16.19	2.36
    45	346	16.43	3.25
    46	360	16.28	2.07
    47	374	16.31	3.25
    48	387	16.43	3.84
    49	402	16.43	4.14
    50	417	16.19	2.66
    51	431	16.40	4.14
    52	447	16.19	3.54
    53	463	16.46	2.95
    54	480	16.19	4.14
    55	496	16.25	4.73
    56	513	16.10	3.84
    57	531	16.19	3.84
    58	549	16.46	5.32
    59	566	16.13	4.14
    60	583	16.43	5.91
    61	599	16.43	6.20
    62	616	16.37	6.50
    63	634	16.43	6.50
    64	654	16.19	5.61
    65	673	16.13	5.91
    66	691	16.10	5.32
    67	710	16.10	7.68
    68	729	16.10	7.98
    69	749	16.10	6.79
    70	770	16.04	6.79
    71	791	16.04	7.09
    72	812	16.22	6.79
    73	834	16.28	7.09
    74	857	16.04	7.38
    75	878	16.07	7.38
    76	899	16.04	8.57
    77	924	16.04	9.45
    78	947	16.13	8.27
    79	967	16.34	8.86
    80	987	15.98	9.75
    81	1007	15.95	9.16
    82	1029	15.98	11.22
    83	1051	15.92	10.04
    84	1073	15.92	12.11
    85	1093	15.95	10.63
    86	1113	15.92	11.22
    87	1136	15.95	11.22
    88	1159	15.89	11.82
    89	1184	15.92	11.82
    90	1205	15.89	12.41
    91	1225	15.89	13.59
    92	1246	15.92	13.88
    93	1263	15.86	13.29
    94	1284	15.89	14.18
    95	1306	15.89	14.47
    96	1330	15.86	14.47
    97	1353	15.83	15.66
    98	1375	15.83	17.43
    99	1406	16.31	15.06
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1435	16.28	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 1
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    set throttle 50% 65% 75% 85% 100%
    
    %	g	v	a
    50	448	16.25	2.95
    65	703	16.10	5.32
    75	904	16.04	6.79
    85	1129	16.01	11.52
    100	1432	15.77	14.77
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1429	16.25	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 1
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    set throttle 50% 65% 75% 85% 100%
    
    %	g	v	a
    50	443	16.34	3.54
    65	705	16.07	4.73
    75	899	15.98	6.79
    85	1109	15.92	10.63
    100	1425	15.77	14.77
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1429	16.22	0.30
    
    Please type the comands:
    test, calibration, null
    
    >t
    
    ============= Select action: =============
    1 - begin auto test 50, 65, 75, 85, 100%
    2 - begin auto test 1-100%
    3 - begin manual test
    any key - return to console
    ==========================================
    you select 1
    
    ============= Select action: =============
    8 - begin test
    any key - stop test and return to console
    ==========================================
    you select 8
    
     start test
    
    set throttle 50% 65% 75% 85% 100%
    
    %	g	v	a
    50	441	16.10	2.36
    65	696	16.01	4.43
    75	892	16.13	8.86
    85	1105	16.34	9.75
    100	1409	15.80	15.66
    throttle = 0%
    
     stop test return to console
    
    
    %	g	v	a
    0	1412	16.19	0.30
    
    Please type the comands:
    test, calibration, null
    
    >
    ЗЫ фильтр будет один из этих, остались с предыдущих моих перлов программирования на STM32
    (найдены на просторах всемирной )

    Код:
    //фильтр простой
    int filter(int y, int r)
    {
            int z=(15*y+r)>>4;
            return z;
    }
    
    //фильтр чуть сложнее
    uint filter_1(uint x1, uint Nb1, uint k1){
      static uint y1 = 0;
      static uint z1 = 0;
      z1 += (x1 - y1);
      return y1 = (Nb1 * z1) >> k1;
    }
    Последний раз редактировалось sulaex; 16.12.2013 в 10:31.

  41. #38

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    37
    Сообщений
    4,528
    Записей в дневнике
    9
    Александр, эт вы на чём тестили двиг/проп - 400гр. тяги на 50%? почти 8гр/ватт

  42. #39

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    Цитата Сообщение от SergDoc Посмотреть сообщение
    Александр, эт вы на чём тестили двиг/проп - 400гр. тяги на 50%? почти 8гр/ватт
    это СанниСкаи 3508 580 с АПЦ 1238

    прикрутил фильтр, требуется помощь по решению проблемы запаздывания у фильтра, у кого есть какие соображения?

    на картинке показания напряжения и тока до (синий) и после фильтра (красный)



    может тупо делать умножение показаний на коэффициент?

    например вот показания тока без множителя и с множителем 1,4

    Последний раз редактировалось sulaex; 16.12.2013 в 13:45.

  43. #40

    Регистрация
    23.06.2011
    Адрес
    Мурманск
    Возраст
    47
    Сообщений
    1,715
    Записей в дневнике
    4
    для показаний фильтра по напряжению тогда такая формула (множителем не обойтись)

    (значение напряжения с фильтра)*(1-(процент газа от 0 до 99)/10000)


Закрытая тема

Похожие темы

  1. Проект FMBC v1.06 или Люминь vs Карбон
    от bearchik в разделе Коптеры. Комплектующие, сборка, настройка.
    Ответов: 125
    Последнее сообщение: 01.12.2014, 01:53
  2. RThrust - система автоматического тестирования ВМГ
    от RaJa в разделе Коптеры. Комплектующие, сборка, настройка.
    Ответов: 79
    Последнее сообщение: 04.12.2013, 15:01
  3. Проект Як-18Т 1:5 и 1:7
    от Ирбиус в разделе Копии, полукопии
    Ответов: 36
    Последнее сообщение: 02.10.2013, 01:25
  4. База для автоматической зарядки мультикоптера
    от itPiligrim в разделе Квадрокоптеры. Общие вопросы
    Ответов: 17
    Последнее сообщение: 15.06.2013, 18:18
  5. Продам систему зажигания rcexl
    от Sergeysgs в разделе Барахолка. Моторы ДВС, топливо и аксессуары
    Ответов: 0
    Последнее сообщение: 17.03.2013, 21:58

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения