Вопрос про analogRead

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Можно ли функцией analogRead получить значение не с аналогового пина, а источника опорного напряжения 1V1?

Также интересует подключение к встроенному в Arduino датчику температуры.

Спасибо.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Даташит читать не предлагать ?

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

Можно ли функцией analogRead получить значение не с аналогового пина, а источника опорного напряжения 1V1?

Также интересует подключение к встроенному в Arduino датчику температуры.

Спасибо.

можно для обоих случаев

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Отлично! Что написать в скобочках?

Upper
Offline
Зарегистрирован: 23.06.2020

analogRead "из коробки" для UNO этого сделать нельзя, т.к. используется маска 7 для каналов.

ADMUX = (analog_reference << 6) | (pin & 0x07);

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

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

b707 пишет:

можно

Upper пишет:

нельзя

Спасибо.

Upper пишет:

ADMUX = (analog_reference << 6) | (pin & 0x07);

 

А вот это вообще непонятно. Можете объяснить?

Upper
Offline
Зарегистрирован: 23.06.2020

Это строчка из реализации штатной analogRead для UNO подобных.

DEL

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Upper пишет:

Это строчка из реализации штатной analogRead для UNO подобных.

И из нее следует невозможность выбрать канал с номером больше 15 без изменения кода analogRead

Опорное напряжение и температура имеют номера 16 и 30 (для UNO и аналогичных)

Спасибо. Как же тогда на практике получают значение источника опорного напряжения?

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

Upper
Offline
Зарегистрирован: 23.06.2020

Я ошибся наверху. Каналы 8 и 14 а ограничение 7

Upper
Offline
Зарегистрирован: 23.06.2020

andreykrasnodar пишет:

Спасибо. Как же тогда на практике получают значение источника опорного напряжения?

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

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

b707 пишет:

можно

Upper пишет:

нельзя

Спасибо.

В ответе #2 был не прав, не заметил в вопросе "можно ли функцией analogRead()". Коллеги правы, функциями ардуино - нельзя. А вот прямым доступом к регистрам - можно.

Ищите поиском в гугле "секретный вольтметр ардуино"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Upper пишет:

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

Или убирают нах эту маску и тогда можно обычным analogRead:-)

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Upper пишет:

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

Нашёл вот это https://arduino.ru/forum/apparatnye-voprosy/kak-izmeryat-napryazhenie-avtonomnogo-pitaniya-na-arduino-nano

01 static inline void adcChooseVBG(void) { ADMUX = (ADMUX & 0xF0) | 14; }
02 static inline void adcStart(void) { ADCSRA |= bit(ADSC); }
03 static inline bool adcInProgress(void) { return ADCSRA & bit(ADSC); }
04 static inline unsigned adcGet(void) { return ADC; }
05  
06  
07 // Возвращает напряжение питания в десятых долях вольта
08 inline static int getBatteryVoltage(const int internalRefference) {
09     adcChooseVBG();
10     _delay_ms(1); // пусть "пропитается"
11     adcStart(); // плевать на первый замер
12     while (adcInProgress());
13     adcStart(); // теперь замеряем
14     while (adcInProgress());
15     const int adc = adcGet();
16     return (((internalRefference * 1024L + adc / 2) / adc) + 500) / 1000;
17 }

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

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

ЕвгенийП пишет:

Upper пишет:

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

Или убирают нах эту маску и тогда можно обычным analogRead:-)

ADMUX = (analog_reference << 6) | (pin & 0x07);

заменить на

ADMUX = (analog_reference << 6) | (pin & 0x0f);

а затем использовать в коде

analogRead(14)

?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andreykrasnodar пишет:

ADMUX = (analog_reference << 6) | (pin & 0x07);

заменить на

ADMUX = (analog_reference << 6) | (pin & 0x0f);

а затем использовать в коде

analogRead(14)

?

Зачем так "нетрадиционно"? просто убрать "& 0x07" нах. Не заменить на что-то, а совсем убрать.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А как узнали, что у ТС uno-подобная плата? Он же не писал ничего о этом. Я что-то пропустил...

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

А как узнали, что у ТС uno-подобная плата? Он же не писал ничего о этом. Я что-то пропустил...

когда человек пишет просто "ардуино" - 100% у него Уно/Нано/Про мини или накрайняк, Мега

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Или Вавгат. :-)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

DetSimen пишет:

Или Вавгат. :-)


Или lgt8f328p

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

А как узнали, что у ТС uno-подобная плата? Он же не писал ничего о этом. Я что-то пропустил...

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:
Предполагается минимальный здравый смысл...


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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Или Вавгат. :-)

Деда, в русской транскрипции языка Морзе это ВАЖГАТ )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Этот басурманский язык (англиццкий) и не такое может выдавать!!!))

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

BOOM пишет:

А как узнали, что у ТС uno-подобная плата? Он же не писал ничего о этом. Я что-то пропустил...

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

"Такой большой, а в сказки веришь..."