Прошивка (скетч) ЛБП на Ардуино

Тема в разделе "Лабораторный блок питания на Arduino", создана пользователем Gupic, 3 мар 2018.

  1. Oleg_D

    Oleg_D Интересующийся

    Всем доброго времени суток.
    Адаптировал под mcp4725 выложенный ранее пользователем sashokc дополненный скетч. Все дополнения обозначил как //----------, для прослеживания изменений. Добавил только самое необходимое, косметику уж сами..Сам скетч можно прилично подчистить. Многое из таймеров ШИМ в шапке становится ненужным. Для использования mcp4725 вынужденно освобождаем 4 и 5 пины (SDA и SCL), а также переводим дисплей на шину i2c. При этом освобождаются пины D2, D3,D4,D5,D6,D11 (по схеме 2.3). А также D9 , бывший выход ШИМ, уже тоже свободен. Принцип работы остался тот же: МК крутит уровень DAC туда-сюда, в пределах 0-4095, пока на выходе БП не получит установленные значения. Обращение к ЦАП происходит, можно сказать, напрямую, без всяких левых библиотек. В даташите пишут про поддержку скорости шины 400кГц ( по умолчанию 100кГц) . Думаю, можно попробовать в будущем разогнать I2C до 400, после подчистки таймеров, а то там винегрет получится. Также в скетч внес код для тепм. датчика ds18b20. Опрос датчика (1000мс) идет независимо от исполнения основного кода, с помощью библиотеки OneWıre. Подключение по 3 проводам, никакого паразитного питания не требуется, и так работает и не нагревается. Пин data естественно физически подтянуть к 5в 4к7 резистором. Выход шим для для вентилятора назначил на D9. Температуру включения и уровни ШИМ работы вентилятора меняйте по вкусу. Кстати Ардуина способна регулировать ШИМ 4 пинового вентилятора от процессоров интел( другие не проверял). Есть поле для деятельности с подсчетом оборотов, подключив и тахометр вентилятора тоже. Подключать надо его к пину с аппаратным прерыванием, т. е. к D2 либо к D3. Но это уже для особо пытливых. Обычный же вентилятор можно подключить через мосфет напрямую к пину D9 ардуино ( готовые модули на али также в наличии), но лучше через/с оптопару pc817. Можно через транзистор bc547, но будет работать только в режиме вкл-выкл.
    Индикацию температуры настройте уже сами по вкусу, заменив или добавив переменную temperature в соответствующие пункты дисплея. Не забудьте также проверить наличие всех библиотек в шапке скетча.
    Источник
    П.С Изначально думал использовать mcp4725 совместно с STM, т.к. там АЦП тоже 12 бит , но "хотелки" поменялись:). Успел испытать их вместе, и они прекрасно ужились. Дисплей по I2C и mcp4725 подсоединил к 5В, STM посадил на 3.3В, Все на одной шине I2C ужились без ошибок в работе. Так что, согласование уровней не потребовалось. Желающим на заметку.;)
    П. П. С. Переназначил светодиоды : синий с А5 на А3, красный с А4 на А2.
     

    Вложения:

    Последнее редактирование: 13 фев 2019
    avramenkoal, ra6fqq и AHA нравится это.
  2. AHA

    AHA Новый пользователь

    :good:
     
  3. krakus

    krakus Новый пользователь

    В железе пробовали прошивку?
     
  4. Oleg_D

    Oleg_D Интересующийся

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

    Vlad-mod Новый пользователь

    а где строки кода которые поднимают частоту шима?
     
  6. Oleg_D

    Oleg_D Интересующийся

    Строчки:

    void setup() {
    cli();
    DDRB |= 1<<1 | 1<<2;
    PORTB &= ~(1<<1 | 1<<2);
    TCCR1A = 0b00000010;
    //TCCR1A = 0b10100010;
    TCCR1B = 0b00011001;
    ICR1H = 255;
    ICR1L = 255;
    sei();
    int pwm_rez = 13;
    pwm_rez = pow(2, pwm_rez);
    ICR1H = highByte(pwm_rez);
    ICR1L = lowByte(pwm_rez);

    Если просто нужно поднять частоту шима , это можно сделать еще следующим образом:
    После void loop(), не внутри:

    /* Configure digital pins 9 and 10 as 16-bit PWM outputs. */
    void setupPWM16(float error) {
    DDRB |= _BV(PB1) | _BV(PB2); /* set pins as outputs */
    TCCR1A = _BV(COM1A1) | _BV(COM1B1) /* non-inverting PWM */
    | _BV(WGM11); /* mode 14: fast PWM, TOP=ICR1 */
    TCCR1B = _BV(WGM13) | _BV(WGM12)
    | _BV(CS10); /* no prescaling */
    ICR1 = error*0.996; /* TOP counter value = 1000; +/- 10 bit resolution @ 15 kHz*/
    }

    /* 16-bit version of analogWrite(). Works only on pins 9 and 10. */
    void analogWrite16(uint8_t pin, uint16_t val)
    {
    switch (pin) {
    case 9: OCR1A = val; break;
    case 10: OCR1B = val; break;
    }
    }
     
    gera1964 нравится это.
  7. Vlad-mod

    Vlad-mod Новый пользователь

    я вроде смортел что частоту можно поднять до 60 khz
     
  8. Oleg_D

    Oleg_D Интересующийся

    А слона и не заметил.. Вы же про частоту. Так а зачем? Здесь этого не требуется, да и не надо это. От пульсаций это не спасёт.
     
  9. Vlad-mod

    Vlad-mod Новый пользователь

    Хочу переделать под импульсный режим
     
  10. Oleg_D

    Oleg_D Интересующийся

  11. Oleg_D

    Oleg_D Интересующийся

    Всем привет.
    Поднял частоту mcp4725 до 800кГц. Как оказывается, этот ЦАП кроме заявленных 100 и 400 кГц без перехода в режим High Speed mode
    может работать и на 800 и 888 кГц(предел работы шины I2C у atmega328) . Остановился на 800кГц, т. к. на граничных частотах возможны ошибки. Т. к. дисплей 16х2 поддерживает только 100 кГц, перед отправкой данных на ЦАП переключил шину на 800кГц помощью функции Wire.setClock(800000L); , а сразу после отправки обратно на 100 кГц, т. е. Wire.setClock(100000L);, иначе дисплей виснет.
    И немного теории. 800кГц это скорость линии шины. Чтобы установить какое-то напряжение на ЦАП mcp4725 понадобится отправить 29 битов. Назовем это полным тактом. То есть теоретически частота полных тактов будет 800000/29=27586 Гц. Добавьте время для обработки инструкций и попутных процессов, которое занимает половину от этого, реально выйдет около 14 кГц тактов смены напряжения. В общем, как мне кажется, неплохо.
    Доработанный скетч во вложении.
     

    Вложения:

    AHA и ra6fqq нравится это.
  12. Yuraword

    Yuraword Новый пользователь

    Ребята, у меня одного проблемы с энкодером?
     
  13. Valeriy

    Valeriy Интересующийся

    У меня с энкодером тоже проблема. Проблема появляется только тогда, когда захожу в меню, при прокрутке какие-то глюки происходят, нужно много оборотов энкодера сделать чтобы перейти в следующий пункт меню или вообще кручу вперед, а оно назад листает или перепрыгивает!
    Но когда напряжения выставляю (регулирую) то все отлично работает!
    Как-то можно эту проблему программно устранить?
     
  14. Yuraword

    Yuraword Новый пользователь

    У меня регулировка постоянно работает неадекватно, во всех режимах, я в ардуино вообще не соображаю, но мне кажется что то не то с библиотекой энкодера
     
  15. Oleg_D

    Oleg_D Интересующийся

    В скетче нет библиотеки для энкодера.
    Когда для энкодера используются 2 аппаратных прерывания (пины 2 и 3) - это высокий уровень надёжности. Когда одно аппаратное и один цифровой пин, отличный от 2 и 3, - средний уровень надёжности. Когда оба обычных цифровых пина, как в данном проекте - низкий уровень надежности. Выход : уменьшить дребезг контактов энкодера, зашунтировав эти пины конденсаторами 0.01 - 0.1 мкф, как в готовых китайских модулях энкодера. Или применить программную фильтрацию дребезга , чего тоже не сделано. Ардуино просто постоянно считывает пины энкодера на предмет изменения состояния и сравнивает с предыдущим. То есть применён самый простой алгоритм обработки. Чего от него хотеть. Крутите помедленнее что-ли, что ещё посоветовать. Ещё бывают энкодеры такие - дребезжащие , или старые. Можно конечно переделать скетч, ИМХО легче написать новый. Попробуйте поиграться со временем считывания, самое простое.
     
    Последнее редактирование: 9 июл 2019
    Valeriy нравится это.
  16. Valeriy

    Valeriy Интересующийся

    В Вашей прошивке есть небольшой глюк, а точнее неправильно определял сопротивления цепи. Я исправил эту ошибку, а также небольшой баг был когда напряжения устанавливалось 10 вольт, то происходил сдвиг сроки, при этом, соседний справа символ исчезал, эту проблему я тоже устранил.
    Немного больше установил время показа "инфо" при нажатии кратковременно сразу двух кнопок S1+S2.
     

    Вложения:

  17. Yuraword

    Yuraword Новый пользователь

    На скетче выше исправлено недоразумение с энкодером?
     
  18. Valeriy

    Valeriy Интересующийся

    У меня на этой нормально начало работать.
     
  19. Yuraword

    Yuraword Новый пользователь

    Ооо крутяк, попробую, спасибо!!!
     
  20. Valeriy

    Valeriy Интересующийся

    Допилил немного прошивку .... v2.9
    Изменение:
    1. Нету бага когда напряжения установлено в ноль (раньше было так -0.0 и сдвигало строку вправо...) теперь норм 0.0
    2.
    В меню 1/4 Режим теперь меняется циклически то есть "Вращением ручки энкодера вправо >>>" защита > стаб.ток > стандарт > защита > и т. д..." Если влево <<< вращать то все наоборот происходит. Я считаю что так намного удобнее, чем было раньше.
    3. При нажатии кнопкой 'S1' (кратковременно (нажать и отпустить сразу!)) будет показываться та информация (как и в ранних прошивках + сопротивления цепи (R) ).
    Если кнопку 'S1' (задержать примерно около одной секунды!) то можно выбрать предустановку из трех ("3.9В 1А защита", "5В 1А защита", 12В 1А защита".) (как было раньше в этой прошивке, но теперь наоборот и время меньше).
    .
     

    Вложения:

    Последнее редактирование: 12 июл 2019
    Mulder и Yuraword нравится это.

Поделиться этой страницей