Специальные цены   новые товары
Закрытая тема
Страница 32 из 33 ПерваяПервая ... 22 30 31 32 33 ПоследняяПоследняя
Показано с 1,241 по 1,280 из 1300

Открытый проект универсального зарядника

Тема раздела Самодельная электроника, компьютерные программы в категории Общие вопросы; Во FLASH у нас хранится: 1. Все фразы меню и массив указателей на начало каждой строчки меню 2. Все фразы ...

  1. #1241

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Во FLASH у нас хранится:
    1. Все фразы меню и массив указателей на начало каждой строчки меню
    2. Все фразы шаблонов и массив указателей на начало каждой фразы
    3. Все шаблоны и массив указателей на начало каждого шаблона
    4. Ноты музыки
    5. Таблица перекодировки ASCII символов в кодировку ЖКИ

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

    У нас 3 массива указателей: на начало каждой фразы меню, на начало каждой фразы шаблона и на начало каждого шаблона. Эти массивы указателей нужны нам, чтобы, зная их номер, найти их в памяти. Например SH(5) - рисуем пятый шаблон. Программа берет 5тый указатель на шаблон из массива указателей, а указатель это адрес в памяти, значит программа знает откуда из памяти брать байты 5-го шаблона. Программа берет по очереди байты шаблона, пока не наткнется на 255(конец шаблона). И вот встречена команда 16 (напечатать фразу шаблона 95). Опять программа достает 95-тый указатель из массива указателей на фразы шаблона, а этот указатель это адрес первой буквы фразы. И тогда программа берет по очереди все буквы пока не встретится 0(признак того что фраза закончилась)

    Вот таким хитрым образом мы объяснили работу с FLASH, рассказали что мы там храним и немного объяснили второй уровень "низости".

    Теперь EEPROM:

    Зачем нужно было городить огород с тремя видами памяти, знает только производитель АТМЕГА32. Вероятно они руководствовались соображениями экономии денег. По большому счету EEPROM и FLASH это одно и тоже. FLASH вероятно подешевле будет, но количество циклов перезаписи меньше и возможно занимаемое место на кристалле меньше. EEPROM более тормозная, больше циклов перезаписи. Для нас для программистов и то и другое это постоянная память и лучше бы она была одна, а не две.

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

    В EEPROM мы храним:

    1. Настройки химии аккумуляторов. Каждая химия ведет себя одинаково.
    2. Настройки аккумуляторов. Сколько банок и ампер-часов в моих любымых акках.
    3. Настройки интерфейса ЗУ. (Музыка)
    4. Настройки каналов (подстроичные коэффициенты для расчета I,V,T из тех вольт, которые намерены АЦП)

    Все эти данные можно читать и писать, но желательно не часто. И скорость чтения и записи будет не быстрая.
    Поэтому при включении ЗУ или запуске Канала мы все считываем в ОЗУ и с этими данными работаем. Ну при настройке ЗУ запишем подстроечные коэффициенты. Изредка добавим новый аккум. Короче процедуры записи и чтения EEPROM вызываются редко и медленно.
    Последний раз редактировалось R2D2; 09.04.2010 в 12:48.

  2.  
  3. #1242

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Код:
    // Процедуры работы с EEPROM от WinAVR стандартная поставка
    #include <avr/eeprom.h>             // Работа ЕЕПРОМ
    
    // Описание размещения данных (Химия Акки Коэффициенты)
    // На основании его компилятор создает прошивку main.eep для EEPROM
    #include "eeprom.h"                 // Описание содержимого ЕЕПРОМ
    
    // Функции для записи и чтения EEPROM переназванные по человечески
    #define ERB  eeprom_read_byte       // Читаем байт из EEPROM
    #define ERS  eeprom_read_block      // Читаем кусок из EEPROM
    #define EWB  eeprom_write_byte      // Пишем байт в EEPROM
    #define EWS  eeprom_write_block     // Пишем кусок в EEPROM
    
    
    EEMEM BYTE ET1=1; // eeprom.h (0-датчик отсутствует, 1-датчик работает)
    a=ERB(&ET1);      // Прочитали из EEPROM в обычную переменную BYTE ОЗУ
    EWB(&ET1, a);     // Записали обычную переменную BYTE в EEPROM
    
    // float это 4 байта, поэтому читаем его из EEPROM и пишем в ОЗУ переменную
    // т.е. копируем 4 байта начиная с адреса в EEPROM в ОЗУ туда где расположена
    // нужная нам переменная
    EEMEM float E1_k0=-0.302066773176193; // описано в eeprom.h
    
    ERS((BYTE*)&Ch1.k0, (BYTE*)&E1_k0, 4); // Читаем из EEPROM коэфф тока 1 канала
    EWS((BYTE*)&Ch1.k0, (BYTE*)&E1_k0, 4); // Пишем в EEPROM коэфф  тока 1 канала
    Для новеньких в Си:
    Многие функции, как в вышеописанных примерах, для копирования из одного вида памяти в другой вид памяти требуют чтобы им указали адрес откуда куда. Поэтому в Си придуман специальный значок "&" который ставится перед переменной спереди, а компилятор когда делает программу на машинных кодах на место "&переменная" вставляет адрес этой переменной.

    Слово (BYTE*) подсказывает компилятору, что это будет именно адрес последовательности байтов. В нижнем примере мы обязаны добавить это слово потому что сама переменная была описана float, а функция ждет BYTE. Компилятор сразу предполагает что мы сделали ошибку и подсунули ему float вместо BYTE, а мы ему явно говорим: Будь спокоен это то что нужно.
    Последний раз редактировалось R2D2; 09.04.2010 в 14:32.

  4. #1243

    Регистрация
    18.11.2006
    Адрес
    Климовск Московской обл.
    Возраст
    79
    Сообщений
    2
    Господа. А зарядку аккумуляторов А123 этот зарядник поддерживает?

  5. #1244

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    По идее может все.
    max 25v 5a
    Если химию в настройках правильно пропишете работать будет.

    НО, без опыта пайки смд и некоторых знаний...

  6.  
  7. #1245

    Регистрация
    19.02.2009
    Адрес
    Украина, Донбасс
    Возраст
    57
    Сообщений
    39
    А возможно ли в этом зарядном простым способом увеличить максимальную ёмкость заряжаемой батареи?Может где нибудь можно сменить тип переменной?Для автомобильных батарей 25,5А/ч маловато.И по току нестыковка получается:например устанавливаю ёмкость батареи 7А/ч,ток заряда 10%,должно заряжать током 700mA.А заряжает током 630mA. И с разрядом тоже самое.Кто собирал зарядное как у Вас с этим?
    Последний раз редактировалось maksi1; 12.04.2010 в 17:13.

  8. #1246

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Сделать можно все, т.к. все в наших руках.
    Значит необходимо увеличить отображаемую емкость в 2 раза?

    Фактически это надо в программе в нескольких местах добавить коэффициенты 2.
    При чтении настроек из ЕЕПРОМ в переменную емкости, при записи в ЕЕПРОМ переменной емкости.
    И исправить настройки всех остальных аккумов, уменьшив их в 2 раза.
    Программа на большом компе будет врать.
    Только это ухудшит точность задания емкости до 0.2А, т.к. емкость задается одним байтом. 255 будет соответствовать 51 А/ч, а 1 будет соответствовать 0.2 А/ч

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

    Есть еще один путь - на емкость отвести 2 байта, но это более сложный путь.

    Что касается 630 ma это вероятно очередной глюк программы. Посмотрю и исправлю.
    Последний раз редактировалось R2D2; 13.04.2010 в 12:11.

  9. #1247

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Урок №17 (прерывания погружение)
    Не смотря на то, что на дворе 21 век, до сих пор встречаются программы написанные для DOS и такие программы исходят например из ЦБ РФ (SPRAV.MFO). Вероятно еще не вымерли программисты старой закалки. В таких программах опрос клавиатуры производится на частоте процессора. Представьте себе, что процессор 3 миллиарда раз в секунду опрашивает клавиатуру "не нажата ли кнопка какая". Это при том, что юзер за весь день лазанья по инету едва ли 100 кнопок нажал. Даже самые продвинутые секретари набирают не более 10 кБ в день, нажимая кнопки в среднем не чаще 1 в секунду. Но если вдруг юзер заметил, что отклик компа на нажатие задерживается на 1/3 секунды, то говорят что клава тупит. Причем здесь клава?

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

    В АТМЕГА32 есть такие прерывания:
    1. Прерывание при сбросе или включении.
    2. Внешнее прерывание 0,1,2. (Программируется работа 3х ног процессора специальным образом) и при возникновения на ногах процессора +5в или 0в срабатывает прерывание.
    3. Счетчик/таймер 0,1,2. Внутри процессора есть счетчики, которые считают кратно тактовой частоте, при достижении счета определенного числа или при достижении максимального значения (переполнения) срабатывает прерывание.
    4. При работе с последовательной передачей данных (например от ЗУ к большому компьютеру или обратно) возникает необходимость подготовить новые данные для отправки или спрятать в память полученные данные, для этого используются прерывания "пришел последний бит очередного байта", "отправлен последний бит отправляемого байта", "последовательная передача завершена", "байт данных при передаче пуст".
    5. Завершена трансформация Аналогового сигнала в цифровой.
    6. При записи или чтении в ЕЕПРОМ "ЕЕПРОМ готов".
    7. Сравнение аналогового сигнала и моего сторожа(цифрового) завершено.
    8. Передача последовательных данных по 2 проводам ОК.
    9. Запись во ФЛЭШ завершена.

    Как мы уже говорили в первых 40 байтах ФЛЭШ (памяти программы) лежат "вектора прерываний" (адреса подпрограмм обработки). При срабатывании прерывания, выполняется соответствующая подпрограмма.

    Нам конечно же понадобится прерывание "АЦП завершено" и прерывания по передаче и получению байтов в СОМ-порт. Но кроме того у нас есть прерывание циклическое (по переполнению счетчика) для передачи низких команд в ЖКИ. Циклическое прерывание нам надо еще чтобы играть музыку и отсчитывать секунды зарядки.

    Вот магические слова которые описывают прерывания в программе, чтобы компилятор правильно вписал вектора куда следует.
    Код:
    // Описатели прерываний
    #include <avr/interrupt.h>          // Работа с прерываниями
    
    // Прерывание переполнения счетчика 0
    ISR(TIMER0_OVF_vect)
    {
    }
    
    // Прерывание "Преобразование АЦП завершено"
    ISR(ADC_vect)
    {
    }
    
    // Это прерывание обрабатывает поступившие команды с компьютера по COM порту
    ISR(USART_RXC_vect)
    {
    }
    
    // Отправка очередного байта на COM-порт большого компа
    ISR(USART_TXC_vect)
    {                              
    if(iOutBuf)                    // Если обратный счетчик не пуст
      {
      UDR=OutBuf[nOutBuf-iOutBuf]; // Посылаем следующий байт
      iOutBuf--;                   // Уменьшаем счетчик буфера
      }
    else                           // Иначе все уже отправили
      fTran=false;                 // С посылкой последнего байта зак транзакция
    }
    // Сюда будут направлены все неиспользованные прерывания (может быть)
    ISR(BADISR_vect){}
    Все тексты вы можете посмотреть в исходниках. Привожу только текст отправочного прерывания, т.к. он прост и показывает, что в прерывании надо действовать быстро.
    Последний раз редактировалось R2D2; 13.04.2010 в 15:00.

  10.  
  11. #1248

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Урок №18 (ЖКИ)

    ЖКИ - это доисторическое графическое, текстовое (знакогенерирующее) устройство, оказавшееся очень живучим. Уже давно придуманы экраны мобильников, которые могут несравненно больше, стоят дешевле и вообще... И все же ЖКИ до сих пор пользуются популярностью у разработчиков всего мира из-за своей простоты. Можно было бы доработать эту простоту до еще большей простоты, но этого никто не делает. Лучше иметь что-то постоянное, хотя и немного несовершенное. ЖКИ - это стандарт HD44780.

    ЖКИ - это автономный компьютер, в котором есть своя память, свой процессор, свои порты ввода вывода и экран. У ЖКИ есть своя ОЗУ - видеопамять, которая непрерывно отражается на экране аппаратно. ЖКИ работает на частоте 1 МГц. ЖКИ имеет параллельную, 8-ми и 4-х битную шину передачи данных.

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

    Если мы знаем функции (смысл) устройства, то и как им управлять в общих чертах нам тоже ясно, потому что мы такие же разработчики как и другие. Таким образом, не читая инструкций, а просто пофантазировав или разглядывая названия ножек ЖКИ, можно догадаться о работе чужого устройства и всего мира. Это один из способов пробить стену незнания и непонимания, особенно, если инструкцию переводил переводчик а не технарь. Люди с опытом уже не фантазируют, а знают как работают аналогичные устройства. Но конечно, многое, созданное людьми попахивает нарушением логики и наличием ошибок. Ошибки есть у всех, но это не должно останавливать прогресс. Ошибки надо осознать, прощать и исправлять.

    Итак посмотрим что за ножки у ЖКИ:
    1. GND и Vcc питание ЖКИ. Подаем питание и уже ЖКИ работает, правда вместо цивильного теста пол экрана красится в черный цвет пол в белый. Стандарт не предусматривает ни какой тестовой информации а сделать ее было так легко.

    2. V0 - напряжение от 0 до 5в - поляризация (яркость, контрастность) бывает что ярче когда 0, а бывает что когда 5в. По умолчанию притянуто резистором куда надо.

    3. 8 ног данных. Мы не будем использовать все 8 ног, только 4, хотя и будем всегда передавать 8 бит информации за 2 раза. 8 ног это не экономично, это значит будет занято 8 ног от нашего процессора, а мы не можем быть такими расточительными.

    4. RW - (1(5в)-чтение, 0-запись) читаем из ЖКИ или пишем в него. Конечно же мы будем только писать в ЖКИ и не будем контролировать, правильно ли мы вписали, как это предусмотрено стандартом. Мы будем четко и ясно отдавать команды без помех и надеяться что нас услышали. Все это ради экономии.

    5. RS - (0-команда ЖКИ, 1-данные(буквы)) Как работает эта нога подробно описано в протоколе. Всю получаемую информацию ЖКИ воспринимает как команды и данные в зависимости от того какой сигнал на этой ноге. К командам относятся: сброс, очистка экрана, установка курсора, установка типа курсора. К данным относятся сам текст который рисуется на экране.

    6. Е - эта нога сигнализирует ЖКИ что данные/команду можно забирать с шины данных. Обычно такую управляющую ногу называют "строб". Такая нога всегда есть когда данные передаются по параллельной шине (одновременно 2-8 бит информации).

    7. Катод и анод светодиодной подсветки.

    Теперь когда мы описали ноги ЖКИ мы можем рассказать о самом низком уровне передачи данных из прерывания на ЖКИ.

    Как мы говорили выше, есть у нас прерывание переполнения счетчика 0, которое настроено так, что оно срабатывает 7812,5 раз в сек. Если мы передаем 80 символов и каждый символ передаем за 2 вызова прерывания по 4 бита, то мы можем перерисовывать ЖКИ 7812,5/160 раз в секунду. Но это немного не так. На самом деле после передачи каждой буквы или команды иногда надо пропустить несколько вызовов прерывания, в зависимости от того, что мы передали, потому что ЖКИ надо дать время выполнить эту команду.

    Существует 2 массива данных в моей программе:
    V1[8] - низкие команды (понятные ЖКИ, из описания ЖКИ)
    V2[80] - высокие команды (видеопамять) текстовое изображение ЖКИ.
    Когда программа начинает передавать видеопамять в ЖКИ, она преобразует каждую высокую команду в несколько низких, понятных ЖКИ.

    Вот самый низкий уровень передачи данных в ЖКИ. В этом кусочке программы происходит передача одной четверки (тетрады, половинки буквы или команды).

    Код:
    do{                             // Это одинарный цикл на весь ЖКИ для возможности в любой момент из него выпасть, используя break
      if(fv.h)break;                // В данный момент посылка на ЖКИ не работает
      if(wV1){wV1--; break;}        // Если низкая задержка то ждем следующего вызова прерывания
      if(iV1<nV1)                   // Если список низких команд не выполнен
        {
        x=V1[iV1];                  // Это низкая команда для отражения ее на ногах проца
        if(x&0x80){wV1=x<<1;}       // Если старший бит установлен, значит это низкая задержка
        else                        // Все остальные низкие команды
          {                         // превращаются в сигналы на ногах процессора
          sch_RW=bool(x&64);        // Устанавливаем режим чтение/запись
          sch_RS=bool(x&32);        // Команда или данные
          sch_DB4=bool(x&1);        // Младший бит квартета
          sch_DB5=bool(x&2);        // Средний бит квартета
          sch_DB6=bool(x&4);        // Средний бит квартета
          sch_DB7=bool(x&8);        // Старший бит квартета
          sch_E=bool(x&16);         // Фиксация данных (строб)
          }
        iV1++;                      // Переходим к следующей низкой команде
        if(iV1>=nV1){iV1=0; nV1=0;} // Если последняя низкая команда, все обнуляем
        }
      if(iV1<nV1)break;             // Если список низких команд не выполнен все остальные видеодела 
                                    // делать не надо в этом цикле вызова прерывания
    sch_RW, sch_DB4, sch_DB5, sch_DB6, sch_DB7, sch_E - это название из схемы соответствующее ножке процессора и ножке ЖКИ. И при вписывании в этот бит 1 или 0 происходит появление +5в или 0в на соответствующей ноге в схеме. Вот оно чудо! Программа меняет величину напряжения на ноге процессора. Информация управляет реальным миром! Дух управляет телом! Бог есть!

    Все остальное это детали.
    Последний раз редактировалось R2D2; 14.04.2010 в 20:06.

  12. #1249

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Итак программист в разных местах программы обозначает какой шаблон он хочет видеть, подпрограмма рисования шаблонов нарисует шаблон в видеопамяти, прерывание выведет видеопамять на ЖКИ. Для того чтобы экономить время процессора и ЖКИ предусмотрены механизмы не полной прорисовки шаблона, а только изменяемой части и не всех строчек разом, а только указанных. Прерывание и подпрограмма рисования шаблонов один раз написаны и отлажены, далее программист творчески манипулирует простым вызовом шаблонов в нужных местах программы. На этом мы закончим описывать механизм вывода информации на ЖКИ. Более детально смотрите сам текст программы.

    Урок №19 (структуры)

    В нашем ЖКИ есть 2 канала зарядки. Так уж сложилось, что у процессора оказалось достаточно свободных ножек, чтобы подключить 2 канала, не привлекая дополнительной логики. И при выборе "2 канала" или "1 канал и балансир" выбор пал на первый вариант. Два абсолютно одинаковых канала управляются одной программой. Нужно написать подпрограмму работы с одним каналом и передавать ей номер канала. Одним выстрелом двух зайцев. Пишем одну подпрограмму, которую применим 2 раза. Разве это не халява.

    Для того чтобы это сработало, необходимо описать структуру каждого канала. В языке Си есть такое понятие "структура данных" - это удобный механизм описания некоторого объекта, обладающего определенными свойствами. У нас таких объекта два, а структура у них одинаковая. Один раз описываем структуру и используем ее для 2х каналов. Структура каждого из каналов - это все переменные, описывающие свойства канала, это все рычаги управления каналом, это все данные о канале, о его состоянии.
    Код:
    // Вот таким образом мы упрощенно описываем структуру канала
    // Слово struct - это служебное слово Си
    // Слово CHANNEL - это произвольное слово, теперь его можно
    // использовать как тип для описания представителей структуры
    struct CHANNEL 
      {
      float I;
      float V;
      float T;
      };
    
    // А в этом месте мы описываем наши два канала и каждый имеет одинаковую 
    // структуру как указано выше
    CHANNEL Ch1, Ch2;
    
    // А вот так мы будем работать со свойствами канала
    Ch1.I=5;
    Ch2.V=Ch1.V;
    Ch1.T=GetTemperatur();
    А вот описание настоящего канала:
    Код:
    struct CHANNEL              // Структура, описывающая состояние канала в любой момент времени
    {
    BYTE A;                     // Номер подключенного аккумулятора из списка
    long STime;                 // Время старта канала в десятых долях секунды (для вычисления полного времени работы канала)
    long WTime;                 // Время работы канала в десятых долях секунды
    long CTime;                 // Максимальное время выполнения одного цикла зарядки или разрядки в 1/10 сек.
    long SecsT;                 // Для определения скорости роста температуры в каналах
    BYTE Cycl;                  // Текущий цикл (загружается при пуске канала)
            // 0000 - зарядка
            // 0001 - разрядить и зарядить 1 раз
            // 0010 - разрядить и зарядить 2 раза
            // 0011 - разрядить и зарядить 3 раза
    float k0, k1, k2;           // Коэффициенты для расчета тока зарядки
    float kr0, kr1, kr2;        // Коэффициенты для расчета тока разрядки
    float kv0, kv1, kv2;        // Коэффициенты подстройки напряжения
    float Rch;                  // Сопротивление шунта зарядки
    BYTE f1;                    // Флаги алгоритма зарядки 1 (10й байт типа аккума)
    BYTE f2;                    // Флаги алгоритма зарядки 2 (11й байт типа аккума)
    BYTE n;                     // Количество последовательных элементов в аккуме (Кол-во послед. банок)
    WORD
    ftPause:1,                  // Вторая попытка по перегреву
    h:1,                        // Зарядка для хранения
    Zaryd:1,                    // В настоящий момент вообщето вцелом идет заряд иначе разряд
    LZaryd:1,                   // Локально сейчас идет заряд (true-заряд, false-разряд)
                                // Для отслеживания режимов декристаллизации
    C:1,                        // 0-Стоп 1-Старт
    dT:1,                       // 0-Скорость температуры < 2гр./мин. 1-больше (перегрев)
    DP:1,                       // Динамический 0-Нет дельтапика 1-Есть дельта пик
    DPs:1,                      // Статический 0-Нет дельтапика 1-Есть дельта пик
    First:1,                    // 1-только что запустили 0-давно работаем
    Stop:1;                     // 1-получен приказ на выключение 0-не получен
    BYTE Speed;                 // 0-медленно 1-нормально 2-быстро
    WORD Pause;                 // Необходима для стабилизации на тл494 заказанного тока в 1/10 сек.
    BYTE Fasa;                  // Фаза заряда (0-нулевая, 1-основная, 2-капельный или струйный)
    WORD WW;                    // Скорость роста и убывания тока изначально
    WORD W;                     // Скорость роста и убывания тока может убывать при непревышении напряжения
    WORD i;                     // Установленный ток (0-0xfffe) - величина ШИМ
    WORD iDec;                  // Установленный ток (0-0xfffe) - величина ШИМ для локального процесса разрядки
    BYTE sDec;                  // Стадия 0-Зарядка 1-Пауза 2-Разрядка 3-Пауза
    BYTE pDec;                  // Переменная отсчета цикла декристаллизации от ch.PDes до нуля в 1/10 секундах
    BYTE PDec;                  // Константа цикла декристаллизации из свойств типа аккума
    BYTE TDec;                  // Константа цикла декристаллизации из свойств типа аккума
    BYTE Imin, Imax;            // Плавное повышение тока в процессе зарядки
    float I, V, T, Told;        // Реальные измеренные ток, напряжение и температура
    float Tmax, TT;             // Абсолютная температура и скорость роста температуры перегрева
    float Vst;                  // Напряжение статическое
    float Vmax;                 // Используется при заряде для определения DP динамического
    float Vmaxs;                // Используется при заряде для определения DP статического
    float Vmin0;                // Минимальное напряжение для нулевой фазы
    float Vmin1;                // Минимальное напряжение для первой фазы
    float Vh;                   // Напряжение хранения
    float dV;                   // Константа - величина дельтапика (во второй фазе используется для капильного заряда)
    float II;                   // Принято решение установить такой ток
    float IIDec;                // Принято решение установить такой ток для локального процесса разрядки
    float VV;                   // Принято решение не превышать такое напряжение при заряде
    float Z;                    // Емкость Ач
    float InZ;                  // Полученный интегральный заряд Ач подсчитывается еже 1/10 секундно (при выводе надо поделить на 36000)
    BYTE Msg;                   // Код остановки канала
              // 0 - Код не предусмотрен (канал не запускался)
              // 1 - Ток упал до нуля при заряде
              // 2 - Превышение лимита времени
              // 3 - Превышение температуры
              // 4 - Превышение скорости роста температуры
              // 5 - Превышение емкости заряда в 1.2 раза
              // 6 - Напряжение достигло минимума при разряде
              // 7 - Провисло питание до 11 вольт
              // 8 - Обнаружился дельтапик
              // 9 - На заряжаемом аккуме напряжение ниже минимального "это неправильно"
              // 10 - Зашкал тока
              // 11 - Зашкал напряжения
              // 12 - Остановлен пользователем
              // 13 - Напряжение ниже нулевой фазы
              // 14 - Напряжение достигло Vh хранения
              // 15 - Ошибки в настройках типов
              // 16 - Напряжение достигло нужного уровня при заряде
              // 17 - Перегрев схемы
    }Ch1, Ch2;
    А вот так в главном цикле вызывается обработка каждого канала.
    Ищите Ch1 и Ch2.
    Код:
    // Главная программа запускается по ресету
    int main(void)
    {
    fc=255;
    #include "init.cpp"       // Инициализация всего
    #include "zagruzka.cpp"   // Загрузка начальных переменных
    while(true)
      {
      wdt_reset();            // Сброс собаки
      #include "sh.cpp"       // Прорисовка шаблонов
      #include "test.cpp"     // Рассчитываем все переменные по каналам
      if(iK1!=iK0)            // Если есть необработанные кнопки рисуем меню
        {
        #include "menu.cpp"   // Обработка кнопок
        }
      TestMainParam();        // Если какой нибудь канал работает или тестирование
      if(Ch1.C)Go(Ch1);       // Если запущен канал 1
      if(Ch2.C)Go(Ch2);       // Если запущен канал 2
      #include "uart_in.cpp"  // Если надо чтонибудь получить с COM-порта
      #include "uart_out.cpp" // Если надо чтонибудь послать на COM-порт
      }
    }
    Последний раз редактировалось R2D2; 15.04.2010 в 11:14.

  13. #1250

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Как вы увидели в структуре канала есть переменные в которых отражен желаемый ток и желаемое напряжение. Канал не сразу реагирует и выставляет нужное напряжение и ток на аккумуляторе, а с определенной скоростью реакции. Кроме того в настройках канала отражены текущие фазы зарядки. А также отражены результаты, достигнутые каналом. Как это все учесть?

    Основная процедура управлением зарядкой/разрядкой Go() действует следующим образом:
    1. Если это первый запуск Go, то загружаем в настройки канала все что мы знаем об этом аккуме и его химии, обнуляем все что надо и ставим по умолчанию все что надо. Играем музыку старта.
    2. Проверяем все экстренные проверки (зашкалы, проверка на вшивость и т.д.)
    3. Если проверки показали что надо остановиться, то останавливаемся и фиксируем причину. Играем музыку конца.
    4. Если необходима задержка выскакиваем из программы столько раз, пока не истечет задержка, а вызывается Go() более 100 раз в секунду.
    5. Обработка фазы декресталлизации, установка мелкопоместных задач по току, задержки опять ток разрядки или зарядки.
    6. Опять длинная пауза по времени, которая может завершить Go() в этот раз.
    7. Расчет всех токов и напряжений из данных АЦП. Проверка всех условий зарядки, разрядки, достижения требуемых напряжений и токов. Главная цель проверить не конец ли это.
    8. Если закончилась очередная фаза тренировки, то переинициализация для запуска нового цикла.
    9. А вот теперь в зависимости от того что есть в наличии и того чего хочется и от допустимой скорости реагирования, выставляем новый ток через процедуру выставления тока.

  14. #1251

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Вышла новая прошивка и макропрога к ней. http://avrcpp.narod.ru (Все заинтересованные дайте ваших глюков пжлста).
    Статью про Си почистил и причесал кому надо там же.

  15. #1252
    E95
    E95 вне форума

    Регистрация
    16.02.2009
    Адрес
    Макеевка,Украина
    Возраст
    49
    Сообщений
    6
    Очень порадовало что теперь можно заряжать автомобильные аккумуляторы ёмкостью до 100а/ч. Из глюков вижу что пока остались проблемы с установкой тока заряда и разряда.Где-то теряется один процент,например установлен ток заряда 10% от ёмкости,а реально заряжает током 9%
    Программу на компьютере пока запустить не удалось,при нажатии кнопки старт выскакивает такая ошибка:


    Если не сложно,хотелось бы видеть в будущих прошивках на дисплее ёмкость не только в процентах но и в ампер часах.
    Последний раз редактировалось E95; 26.05.2010 в 02:43.

  16. #1253

    Регистрация
    01.01.2008
    Адрес
    краснодар
    Возраст
    45
    Сообщений
    138
    Записей в дневнике
    2
    Цитата Сообщение от E95 Посмотреть сообщение
    не только в процентах но и в ампер часах.
    +1

    и акб выставлять на "ходу" (не из заранее запрограммированных)

  17. #1254
    E95
    E95 вне форума

    Регистрация
    16.02.2009
    Адрес
    Макеевка,Украина
    Возраст
    49
    Сообщений
    6
    и акб выставлять на "ходу" (не из заранее запрограммированных)
    В новой прошивке это реализовано

  18. #1255

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Исправил! Высылайте еще глюков.
    Времени потестить не было.
    Кстати теперь можно накапливать базу поведения различных акков (*.gra) и тем самым сравнивать их графики и оценивать свежесть акков и качество производителя.

  19. #1256

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    Прошился новой прошивкой. Очень порадовала возможность задания в ручную кол-ва банок и емкости. Мелкий глюк, оставшийся еще со времен прошивки 1.5 - в режиме тренировки, когда происходит переход из режима разрядка в режим зарядка на экране вначале "Канал 1 Разрядка", а потом "Канал 1 Зарядкаа" т.е. последняя "а" от "Разрядка" не затирается.
    Сейчас тренировкой пробую восстановить старые аккумуляторы от шуруповерта на 18 В, которые родной зарядкой уже не заряжались. После первого цикла показал 10%, после второго 20%, после третьего - 40%, сейчас уже около 80% от номинальной емкости показывает. В общем, посмотрим, что получится.
    PS: Предложение. Раньше была емкость в процентах, не хватало Ач, а сейчас наоборот - в Ач, но не хватает процентов, поэтому хотелось бы видеть после зарядки емкость и в процентах и в Ач.
    Последний раз редактировалось anton_z; 03.06.2010 в 23:59.

  20. #1257

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    Опять небольшой отчетец после тестов.
    1. Во время тренировки проявился глюк, заключающийся в том, что в момент переключения из режима "Разрядка" в режим "Зарядка" у бп, питающего зарядник срабатывала защита. Решил смоделировать эту ситуацию, подключив вместо акка другой бп и постепенно уменьшая его напряжение получил этот же глюк в момент переключения режимов. Прошился 1.5 прошивкой - тот же глюк, потом увидел, что уже выложена прошивка от 08.06.10, прошился ей, глюк исчез (хотя на жки выводится дата от 27.05.10). Отсюда предложение - создать whatsnew.txt и дописывать его с компиляцией новой прошивкой.
    2. Как я понимаю, режим десульфации так и не доделан. При запуске выдает "Ошибка настроек"
    3. Хорошо бы в макропрограмме сделать быстрое сохранение/восстановление калибровочных коэффициентов. А то после перепрошивки приходится в ручную перебивать все значения.

    Черт, написал, а потом нашел п.1 на сайте, а скачав новую макропрограмму увидел там п.3.
    Чтож, могу только еще раз выразить благодарность автору за столь большой и бескорыстный труд, пожелать успехов не только в данном проекте, но и по жизни. И еще пожелать, чтобы проект двигался только вперед, может быть медленно, но верно.
    Последний раз редактировалось anton_z; 10.06.2010 в 21:15.

  21. #1258

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Спасибо!

    Режим десульфатации не продвигается из-за отсутствия информации. Если у кого есть ссылки на статьи про десульфатацию... ?


    ВНИМАНИЕ! В схеме 1.7 на входе силовых надо ставить 2200мкф, а также на 78м05 на землю и 12в надо сверху напаять 100-200 мкф, а также L2 можно и даже может быть НУЖНО выкинуть и запаять туда перемычку.

    Соответствующие изменения будут в ближайшее время внесены в схему.
    Последний раз редактировалось R2D2; 14.06.2010 в 12:33.

  22. #1259

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    По поводу режима десульфации. Может быть тогда сделать, чтоб можно было задавать 4 параметра: ток заряда, ток разряда, период и скважность. Уже появится возможность что-то потестировать. Или меньше параметров (некоторые фиксированные), чтобы хоть как-нибудь работало. Есть несколько полумертвых акб от упс, скутера и фонаря. Хочется с ними поэксперементировать.

  23. #1260

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    ОК. В ближайшее время сделаю. Мой опытный образец после серии экспериментов немного рассыпался.

  24. #1261

    Регистрация
    14.12.2006
    Адрес
    Люберцы
    Возраст
    36
    Сообщений
    69
    Тут есть инфа по десульфации. У меня акк как раз свинцовый мертвый есть. Пытался оживить его зарядником, но не смог. Хотел просто дать напругу небольшую на него, но т.к ток акк не брал совсем, то происходит срабатывание Vmax.

  25. #1262

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Супер! почитаем.

  26. #1263

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    После упаковки ЗУ в дюралевый корпус http://avrcpp.narod.ru/zu17/zu.html обнаружились новые особенности:

    1. Наводки на контур стабилизации при мощности больше 50 Ватт.
    2. Наводки на шину ЖКИ, что приводит к появлению мусора на экране.

    Как уберечся от такой напасти?

  27. #1264

    Регистрация
    21.10.2006
    Адрес
    Алтай, с. Плоскосёмино
    Возраст
    66
    Сообщений
    227
    Уважаемый R2D2, пажалуйст посмотрите "http://mail.rambler.ru/session/294fe84783edb5a8296609df78277fba/mail/redirect.cgi?url=http%3A%2F%2Fkazus.ru%2Flenta%2Fview%2F0_7261_0.html;href=1", может каким образом приглянется.
    Н.С.П.

  28. #1265

    Регистрация
    14.12.2006
    Адрес
    Люберцы
    Возраст
    36
    Сообщений
    69
    Цитата Сообщение от naumovich Посмотреть сообщение
    Уважаемый R2D2, пажалуйст посмотрите "http://mail.rambler.ru/session/294fe84783edb5a8296609df78277fba/mail/redirect.cgi?url=http%3A%2F%2Fkazus.ru%2Flenta%2Fview%2F0_7261_0.html;href=1", может каким образом приглянется.
    Н.С.П.
     А что в ней? Чисто для литий-ионных, думаю полимерные тоже можно заряжать, ну и свинец пойдет. И еще мега-мини корпус, не каждый сможет припаять. А еще она чисто для детекта протекающего тока, т.е управления процессом зарядки никакой, т.е просто цифровой шунт.

    Цитата Сообщение от R2D2 Посмотреть сообщение
    После упаковки ЗУ в дюралевый корпус http://avrcpp.narod.ru/zu17/zu.html обнаружились новые особенности:
     
    1. Наводки на контур стабилизации при мощности больше 50 Ватт.
    2. Наводки на шину ЖКИ, что приводит к появлению мусора на экране.
     
    Как уберечся от такой напасти?
     Может самый простой способ упаковать в пластиковый корпус?

  29. #1266

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Богатая микросхема, но слишком поздно.
    Посмотрел как решается проблема в B6.
    Колечко задвинуто в угол питания.
    ЖКИ сделано на коротких проводах.
    Никаких экранов.
    Вся измерительная часть в противоположном конце.
    Короче чисто грамотная, умудренная опытом разводка.
    Теперь и я умудрился. Это плюс.
    Опять все переделывать. Это минус.
    Но ведь если бы я послушался умных людей, я бы все равно не верил бы и не понимал бы.
    Еще один плюс попробовать по экранировать помехи.
    А если экранировать дроссель. Что-то мне говорит, что поле полезет во все щели и усилится или гденить чтонить нагреваться начнет с утечками.

  30. #1267

    Регистрация
    14.12.2006
    Адрес
    Люберцы
    Возраст
    36
    Сообщений
    69
    Кстати такие ссылки как naumovich дает, ни в коем разе нельзя давать, в этой ссылке сессионый ключ от вашей почты, и соотв пока он активный можно спокойно вашу почту прочитать, да и ссылка умирает как сессионый ключ таймаутится.
    2 R2D2 а я все пользуюсь старым варинатом зарядки(v1.5) и доволен Еще раз спасибо! Как видно выше у народа, да и по себе сужу, не так нужен этот КПД, как режимы зарядок дописанные. это я про десульфацию, струйный заряд. Жду не дождусь

  31. #1268

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Я полез править логику зарядки и увяз в инфе, наверное будет новая прошивка с сильно переработанной логикой зарядки и добавлением параметров настройки. Малыми улучшениями не получается написать прогу.

  32. #1269

    Регистрация
    29.06.2010
    Адрес
    Спб
    Возраст
    56
    Сообщений
    15
    Наверное уже поздно, но всё же...
    У фирмы ST есть аппнота, где подробно описывается принцип действия, расчёт и выбор компонентов преобразователя напряжения, управляемого от микроконтроллера, такого же как в зарядных устройствах типа iMax B6 и т.п.
    Аппноту с названием "An MCU-based low cost non-inverting buck-boost converter for battery chargers" можно взять тут: http://www.st.com/stonline/products/.../anp/12476.pdf

    Да, и кстати, проект зарядника с таким преобразователем у них тоже есть в другой аппноте тут:
    http://www.st.com/stonline/products/...e/an/12477.pdf
    Последний раз редактировалось Dimonira; 11.07.2010 в 15:53.

  33. #1270

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    В последней версии макропрограммы при калибровке нельзя поменять калибровочную таблицу (кол-во точек, шимин, шимах), а меня параметры по-умолчанию не устраивают.

  34. #1271

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    Собственно, продолжу... калибровочная таблица по-умолчанию не устраивала тем, что при больших значениях ШИМа (4000 и выше) блок питания зарядника уходил в защиту. Поэтому калибровался до 2500..3000 и все работало. Сейчас начал разбираться почему бп (переделанный компьютерный) уходит в защиту и выяснил, что в момент выставления больших значений на ШИМ происходит кратковременный скачек потребляемого тока несколько А в т.ч. и без нагрузки! Проверил, запитав зарядник от лабораторного бп, - то же самое. Если у бп отключить защиту по току, то все работает, хотя это конечно не выход. В общем вопрос - у всех так или только у меня? Если значения ШИМа плавно повышать, например через меню, подключив предварительно низкоомую нагрузку на выход зарядника как для калибровки, то защита по току срабатывает гораздо выше значения 3000

  35. #1272

    Регистрация
    14.12.2006
    Адрес
    Люберцы
    Возраст
    36
    Сообщений
    69
    Давно калибровал, но помню такая трабла была, списал на слабый переделанный БП (компьютерный, 250Ватт).

  36. #1273

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    Вот и я тоже списывал на бп, пока не стал разбираться. Во-первых это все происходит без нагрузки, во-вторых если плавно увеличивать значения ШИМа, то все работает нормально. Будем ждать R2D2.

  37. #1274

    Регистрация
    27.11.2004
    Адрес
    Ярославль
    Возраст
    36
    Сообщений
    418
    to R2D2 у меня есть вопрос(только что добрался до просмотра кода зарядки) весь тест тот что у меня открылся (проект микропрограммы там 20 вроде под файлов) полностью Вы писали?? если так - респект и уважуха.. ) хачу так же много и с понятием писать плюс ко всему имею желание переделать прошивку под железо описанное в ветке Alex@ про цифровой зарядник, ну очень хочеца заряжать больше 3х банок лития

  38. #1275

    Регистрация
    25.03.2009
    Адрес
    Москва
    Возраст
    39
    Сообщений
    17
    Продолжил дальше разбираться с ШИМом. Насколько я понимаю, скачек тока возникает из-за зарядки выходных емкостей. Поэтому решением проблемы видится увеличение тока ступенями до нужной величины. Поправил этот момент в исходнике, а вот скомпилировать нормально не получилось.
    R2D2, какой версией WinAVR собирается микропрограмма? В последней версии (от 10.01.2010) сначала вылез баг с размещением массивов/строк в флеше. С ним разобрался, но прошивка все равно не работает.

  39. #1276

    Регистрация
    31.03.2005
    Адрес
    Красногорск
    Возраст
    51
    Сообщений
    488
    Привет всем.

    Да! При установке сразу больших токов в тестовых режимах происходит уход БП в защиту. Да емкости и да переходные процессы в ТЛ494. Этот момент решен в штатном зарядном режиме: там есть ограничение на рост тока. В тестовом режиме решил не делать, т.к. можно щупать динамику или искать "железное" решение.

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

    Что касается WinAVR: перепробовал несколько компиляторов остановился на WinAVR-20071221rc1-install.exe могу бросить почтой.
    Ближайшая к ней http://sourceforge.net/projects/wina...l.exe/download но не уверен что это она.
    Главный критерий выбора именно этой версии - после компиляции весь код умещался в память. Самые свежие версии не пробовал.
    Вот список всех версий: http://sourceforge.net/projects/winavr/files/

    Что касается написания больших и сложных программ: Там все просто читайте статью про Си на сайте http://avrcpp.narod.ru . Надо написать маленькую свою программу и постепенно добавлять в нее все новые и новые удобства и вот она незаметно разрослась.

    Количество точек настройки добавлю.

  40. #1277

    Регистрация
    08.07.2006
    Адрес
    Барнаул
    Возраст
    40
    Сообщений
    14
    Заметил следующий глюк- с подключенным дисплеем виснет макропрога, без диспла все нормально

  41. #1278

    Регистрация
    14.12.2006
    Адрес
    Люберцы
    Возраст
    36
    Сообщений
    69
    Да все вроде хорошо с дисплеем работает, попробуйте разные прошивки, может поможет или сопля где-то на дорожках или дисплей такой.

  42. #1279

    Регистрация
    05.11.2009
    Адрес
    Санкт-петербург
    Возраст
    47
    Сообщений
    2
    Посмотрел схему и немного ее упростил, должно вроде работать.
    Есть вопрос по работе защиты от превышения V не понятно к чему она цепляется, Vref0 указан в двух местах на схеме и один раз VREF0?
    Если можно по подробнее опишите ее работу!
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: zu.jpg‎
Просмотров: 566
Размер:	110.0 Кб
ID:	437540  

  43. #1280

    Регистрация
    05.11.2009
    Адрес
    Санкт-петербург
    Возраст
    47
    Сообщений
    2
    Еще забыл добавить, неплохо бы в программу внести режим измерения емкости аккумуляторов, что то на подобии: http://radioelectronika.ru/?mod=full_cxema&cxemi_id=513

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

Похожие темы

  1. Продам универсальный зарядник
    от RDoc в разделе Барахолка. Аппаратура
    Ответов: 1
    Последнее сообщение: 10.09.2010, 12:28
  2. Нужен ли новичку универсальный зарядник?
    от kazakov_98 в разделе Аккумуляторы, зарядники
    Ответов: 6
    Последнее сообщение: 28.07.2007, 21:29
  3. Делаем универсальный зарядник (на 3 тока) своими руками.
    от Dimux в разделе Самодельная электроника, компьютерные программы
    Ответов: 21
    Последнее сообщение: 28.06.2002, 02:51

Ваши права

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