Arduino ацп с разным reference

Тема в разделе "Флудилка", создана пользователем Proteus, 20 дек 2020.

  1. Proteus

    Proteus Guest

    Столкнулся с такой ситуацией, arduino pro mini
    Надо померить точное напряжение на одном выходе.
    На другом выходе померить вывод делителя, чтобы не зависеть от заряда батарели.
    Т.е. получать относительные и абсолютные значения в одном флаконе.

    Код (C++):

        ADCSRA |= (1 << ADEN); // АЦП
        analogReference(INTERNAL);
        unsigned  int b=analogRead(A1);
        analogReference(DEFAULT);
        unsigned  int r=analogRead(A0);
        ADCSRA &= ~(1 << ADEN); // Отключаем АЦП
     
    Как оказалось, нельзя переключать Reference на ходу. АЦП просто сходит с ума.
    Нашёл способ откалибровать АПЦ, прогнать цикл изменений перед выборкой.
    Код (C++):
        for(int n=0; n<50; n++) analogRead(A1);
    Ну ещё кнопка сброса помогает, хотя я не нашёл способа сбрасывать отдельно АПЦ, может у него только аппаратный сброс возможен.

    Может кто-нибудь знает, менее энергозатратный или более корректный способ разрядить АПЦ перед измерением?

    Перерыл весь даташит. Рассматривал вариант делать все измерения по INTERNAL и делать расчёт в коде, но по определённым причинам, не устраивает. Нужен разный reference для разных входов.
     
    Последнее редактирование модератором: 20 дек 2020
  2. Asper Daffy

    Asper Daffy Иксперд

    Плохо рыл, если вот такой фразы не нашёл: "The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result". А судя по приведённому куску кода - таки не нашёл :-(
     
  3. Proteus

    Proteus Guest

    предложения какие? знаешь как ацп сбросить, без циклов?
     
  4. parovoZZ

    parovoZZ Гуру

    Можно. Только потом надо 10 мс ждать. Первое измерение после переключения выбросить.

    использовать новые МК. AtMega 0-ой и 1-ой серии очень сильно шагнула вперёд по сравнению со старым AVR. В ардурине представлена AtMega4809 (NanoEvery).
     
  5. Asper Daffy

    Asper Daffy Иксперд

    А что, нужны предложения?
    Знаю. Действительно (а не языком по голому заду) прочитать даташит и сделать точно как там написано.
     
    parovoZZ нравится это.
  6. Proteus

    Proteus Guest

    Помогло в таком виде:
    Код (C++):
        analogRead(A1);
       delay(5);
       int v1 = analogRead(A1);
    Из расчёта что цикл, 4 мс занимал. Одно чтение и пауза, всё работает.
    Чтение после паузы не канало.
     
  7. Asper Daffy

    Asper Daffy Иксперд

    Т.е. прочитать даташит - не судьба? Ну, хозяин - барин.
     
  8. b707

    b707 Гуру

    пипец ты упорный.
    А фразу перевести, которую тебе дали - не осилил? в ней все написано.
     
  9. parovoZZ

    parovoZZ Гуру

    Не всё. Надо ещё в электрические параметры заглянуть.
    Честно говоря, по тому, как АЦП в дурине работает катастрофически медленно, мне казалось, что проблема выдержки времени там решена. Оказалось, что нет. ЛОЛ.
     
  10. Proteus

    Proteus Guest

    эта фраза в ide есть, может где-то уже с перводом, человек вряд ли даже про управление ацп читал, или сами pdf к железу.

    Мне это как-то помочь должно было? Или ты не видишь, что в фразе некоректное высказывание? а ответ, банальный офтоп. Или не видно
     
  11. b707

    b707 Гуру

    какое в этой фразе некорректное высказывание? - ты может в английском совсем ни гугу- так не стесняйся, я тебе переведу
     
  12. b707

    b707 Гуру

    дело не в задержке...
     
  13. Proteus

    Proteus Guest

    я думаю, можно было попробовать ноль на один их входов подать, и считать через АЦП, может он быстрее опорное напряжение скинет..
     
    Последнее редактирование модератором: 22 дек 2020
  14. Proteus

    Proteus Guest

    ну забей в гугл.. выкинул я допустим первые значения. Очень помогло? или по коду не видно?
     
  15. b707

    b707 Гуру

    так ты в итоге так и делаешь - выкидываешь первое значение
    Код (C++):
     analogRead(A1);
      delay(5);
      int v1 = analogRead(A1);
    только теперь раздуваешься от гордости. что "сам додумался"

    А достаточно было даташит на МК почитать - там прям так и написано.

    А-а-а... дошло, ты эту фразу небось гуглем перевел, вот она и вышла "некорректной". Языки учи.
     
  16. parovoZZ

    parovoZZ Гуру

    Аналоговая часть АЦП у старых AVR никак не программируется. В даташите написано про 10 мс на переходные процессы - будьте добры эту паузу выдержать. Тоже касается и переключения входов - у старых AVR мультиплексор входы переключает вообще не спеша.
     
  17. b707

    b707 Гуру

    Паравоз, фраза в сообщении #2 - это прямая цитата из даташита на Атмегу328, стр 311. И не надо ничего выдумывать - циклы там всякие, задержки конские.
    ТС пишет, что "перерыл весь даташит" - а нафига перерывать-то, там оглавление есть
     
  18. parovoZZ

    parovoZZ Гуру

    Сова, ты не вывезешь этот разговор, т.к. я реально работал с АЦП на предельных для него скоростях и даже писал об этом. А даташит надо читать весь - от и до, а не только заголовки.
     
  19. akl

    akl Гуру

    надо сначала подождать 5-10 мс, потом два раза считать ацп. я давно сам до этого дошел, на лыжах не читая даташыт
     
  20. AlexU

    AlexU Гуру

    А можешь ткнуть пальцем, где про это написано в даташите?
     
    SergeiL, b707 и Asper Daffy нравится это.