Ви не увійшли.
Сторінки 1
Добрый день !
http://blog.unlimite.net/?p=25
Давно известная тема про измерение опорного Vcc для получения точных значений входного напряжения.
Вот сделал такой код :
float VBG = 1.191, R_kft = 5.309, v_bat, ref_volt;
uint32_t data_rf, data_v;
void setup() {
Serial.begin (57600);
// ====================================================================
ADCSRA = 0x85; // ADCSRA 1 0 0 0 0 1 0 1 // adc enable , clk/32
ADCSRB = 0x00; // ADCSRB 0 0 0 0 0 0 0 0
ADMUX = 0x4F; // ADMUX 0 1 0 0 1 1 1 1 // ref = AVCC , input = GND
DIDR0 = 0xFF; // DIDR0 1 1 1 1 1 1 1 1 // ADCxD = off
}
void loop() {
Volt_zamer();
ref_volt = (VBG * 16368L)/(float)data_rf; // Vcc
v_bat = (((float)data_v * ref_volt) / 16368L) * R_kft; // Vin
Serial.print("Vcc = "); Serial.print (ref_volt); Serial.print(" V ");
Serial.print(" Vin = "); Serial.print ( Vac2 ); Serial.println(" V");
delay(500);
}
/* ============================================================================ */
/* ========= блокок функций измерения ========= */
/* ============================================================================ */
uint32_t Ref_zamer() {
ADC = 0; ADMUX = 0x4E; // ref = Vcc , input = 1.1V (VBG)
for (uint16_t n = 0; n < 256; n++ ) { ADCSRA |= (1<<ADSC);
while (bit_is_set(ADCSRA, ADSC)); data_rf += ADC; }
data_rf >>= 4; // 16368 full scale 14bit *** ОВЕРСЕМПЛИНГ
return data_rf; }
uint32_t Volt_zamer() { Ref_zamer();
ADC = 0; ADMUX = 0x43; // ref = Vcc , input = A3
for (uint16_t n = 0; n < 256; n++ ) { ADCSRA |= (1<<ADSC);
while (bit_is_set(ADCSRA, ADSC)); data_v += ADC; }
data_v >>= 4; // 16368 full scale 14bit *** ОВЕРСЕМПЛИНГ
return data_v; }
Но где-то я туплю, а где не пойму ....
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.97 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.09 V
Vcc = 4.98 V Vin = 12.10 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.83 V Vin = 12.61 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.84 V Vin = 12.62 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.84 V Vin = 12.63 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.62 V
Vcc = 4.84 V Vin = 12.62 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.83 V Vin = 12.61 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.84 V Vin = 12.64 V
Vcc = 4.84 V Vin = 12.65 V
Vcc = 4.84 V Vin = 12.65 V
Vcc измеряет корректно все соответствует измеренному мультиметром.
Но почему при этом скачет значение входного напряжения если в реале оно постоянно..... ???
Неактивний
В идеале, считывать показания опорника и измеряемого сигнала нужно одновременно. И высокочастотный шум на выводах питания нужно минимизировать, хорошими конденсаторами с правильной трассировкой. А также ограничить спектр измеряемого входного сигнала. И буде все як треба.
Неактивний
В идеале, считывать показания опорника и измеряемого сигнала нужно одновременно. И высокочастотный шум на выводах питания нужно минимизировать, хорошими конденсаторами с правильной трассировкой. А также ограничить спектр измеряемого входного сигнала. И буде все як треба.
Это понятно, но не вижу связи с данным случаем.
Может вы вставку с результатами не проскролили до конца ?
Там не в шумах дело... там стабильное изменение показаний входного напряжения (постоянного) в зависимости от изменения опорного ...
Неактивний
Вячеслав Азаров пише:В идеале, считывать показания опорника и измеряемого сигнала нужно одновременно. И высокочастотный шум на выводах питания нужно минимизировать, хорошими конденсаторами с правильной трассировкой. А также ограничить спектр измеряемого входного сигнала. И буде все як треба.
Это понятно, но не вижу связи с данным случаем.
Может вы вставку с результатами не проскролили до конца ?
Там не в шумах дело... там стабильное изменение показаний входного напряжения (постоянного) в зависимости от изменения опорного ...
Я не искал ошибки в вашей программе. Кроме того, непонятно что это за два блока результатов. Я вам дело подсказал, из-за чего может быть, если нет ошибок в логике вычислений. Если это понятно, то почему вы делаете всё наоборот? Мгновенные значения опорника и сигнала должны считываться одновременно. Я всё просмотрел но не разбирался, нет интереса. Правду говорят о том куда благими намерениями дорога вымощена.
Неактивний
renoshnik пише:Вячеслав Азаров пише:В идеале, считывать показания опорника и измеряемого сигнала нужно одновременно. И высокочастотный шум на выводах питания нужно минимизировать, хорошими конденсаторами с правильной трассировкой. А также ограничить спектр измеряемого входного сигнала. И буде все як треба.
Это понятно, но не вижу связи с данным случаем.
Может вы вставку с результатами не проскролили до конца ?
Там не в шумах дело... там стабильное изменение показаний входного напряжения (постоянного) в зависимости от изменения опорного ...Я не искал ошибки в вашей программе. Кроме того, непонятно что это за два блока результатов. Я вам дело подсказал, из-за чего может быть, если нет ошибок в логике вычислений. Если это понятно, то почему вы делаете всё наоборот? Мгновенные значения опорника и сигнала должны считываться одновременно. Я всё просмотрел но не разбирался, нет интереса. Правду говорят о том куда благими намерениями дорога вымощена.
Два блока результатов это результаты при РАЗЛИЧНЫХ значениях Vcc. Входное напряжение это стабильное напряжение от аккумулятора.
В каждом блоке результатов значения достаточно стабильные, поэтому вопроса к пульсациям и синхронности измерения нет.
Проблема в том, что по идее при ИЗМЕНЕНИИ опорного напряжения (выбрано Vcc) значения измерения входного напряжения от аккумулятора НЕ должны меняться... А вот этого как раз и не происходит...
Неактивний
... Проблема в том, что по идее при ИЗМЕНЕНИИ опорного напряжения (выбрано Vcc) значения измерения входного напряжения от аккумулятора НЕ должны меняться... А вот этого как раз и не происходит...
Опорное, это то на что опираются - известная константа. На основании её вычисляют все поправки. Изменили опорное - напряжение получли другой результат. Разобраться в этих трёх соснах не так уж и сложно. При питании АЦП не от опоного источника, требется измерение известного напряжения Vref, с получением какого-то результата ADref и пересчёте: Vsig = Vref * ADsig / ADref, где Vsig - искомое напряжение сигнала а ADsig - понятно. Это без учета делителей и поправок. Всё очень просто.
Неактивний
renoshnik пише:... Проблема в том, что по идее при ИЗМЕНЕНИИ опорного напряжения (выбрано Vcc) значения измерения входного напряжения от аккумулятора НЕ должны меняться... А вот этого как раз и не происходит...
Опорное, это то на что опираются - известная константа. На основании её вычисляют все поправки. Изменили опорное - напряжение получли другой результат. Разобраться в этих трёх соснах не так уж и сложно. При питании АЦП не от опоного источника, требется измерение известного напряжения Vref, с получением какого-то результата ADref и пересчёте: Vsig = Vref * ADsig / ADref, где Vsig - искомое напряжение сигнала а ADsig - понятно. Это без учета делителей и поправок. Всё очень просто.
Это понятно...
В первом сообщении есть ссылка на статью (уверен вы её уже когда-то читали).
Перед измерением напряжения АКБ в программе измеряется напряжение внутреннего источника (1.1 В) по результату рассчитывается
Vcc которое и используется как опорное напряжение.
По идее при изменении Vcc при расчете напряжения аккумулятора должна автоматически производиться корректировка...
а этого не происходит....
Неактивний
Нет не читал. Я уже как-то давал ссылку на хорошую статью, но не для AVR. Вот она: https://www.st.com/content/ccc/resource … 211314.pdf Здесь много полезного по этой теме.
Неактивний
Вот тут измеряем " известного напряжения " внутренний источник = 1.1 Вольта
uint32_t Ref_zamer() {
ADC = 0; ADMUX = 0x4E; // ref = Vcc , input = 1.1V (VBG)
for (uint16_t n = 0; n < 256; n++ ) { ADCSRA |= (1<<ADSC);
while (bit_is_set(ADCSRA, ADSC)); data_rf += ADC; }
data_rf >>= 4; // 16368 full scale 14bit *** ОВЕРСЕМПЛИНГ
return data_rf; }
в качестве опорного напряжения используем Vcc .
соответственно если мы знаем напряжение источника 1.1 В, то можем рассчитать реальное значение Vcc
ref_volt = (VBG * 16368L)/(float)data_rf; // Vcc
После этого измеряем напряжение от аккумулятора на входе А3, в качестве опорного напряжения используем Vcc
uint32_t Volt_zamer() { Ref_zamer();
ADC = 0; ADMUX = 0x43; // ref = Vcc , input = A3
for (uint16_t n = 0; n < 256; n++ ) { ADCSRA |= (1<<ADSC);
while (bit_is_set(ADCSRA, ADSC)); data_v += ADC; }
data_v >>= 4; // 16368 full scale 14bit *** ОВЕРСЕМПЛИНГ
return data_v; }
после этого для вычисления значения напряжения используем ранее вычисленное реальное значение Vcc в качестве опорного.
v_bat = (((float)data_v * ref_volt) / 16368L) * R_kft; // Vin
+++++++++++++++++++++++++++++++++++++
по идее при изменении Vcc корректировка в расчетах должна происходить автоматически но это не так...
Остання редакція renoshnik (2019-07-20 18:14:20)
Неактивний
Нет не читал. Я уже как-то давал ссылку на хорошую статью, но не для AVR. Вот она: https://www.st.com/content/ccc/resource … 211314.pdf Здесь много полезного по этой теме.
Мельком взглянул но это не то...
Посмотрите ту ссылку, что у меня или мой пост №9 я описал способ измерения...
Про пульсации и наводки тут речи нет (пока).
Во всех результатах опорное напряжение Vcc измеряется с достаточной точностью но почему-то не получается реализовать корректировку измеряемого напряжения аккумулятора.
Неактивний
Приведение типов это не преобразование типов, с ним нужно острожно и со знанием сути. Возможно, это и есть ошибка.
Неактивний
Мельком взглянул но это не то... Посмотрите ту ссылку, что у меня или мой пост №9 я описал способ измерения... Про пульсации и наводки тут речи нет (пока). Во всех результатах опорное напряжение Vcc измеряется с достаточной точностью но почему-то не получается реализовать корректировку измеряемого напряжения аккумулятора.
Главное, обычно, между строк. Я вам дал подсазку. Математически, в программе, всё верно.
Неактивний
Приведение типов это не преобразование типов, с ним нужно острожно и со знанием сути. Возможно, это и есть ошибка.
Экспериментировал и с преобразованием типов... без результатов ....
Неактивний
Вячеслав Азаров пише:Приведение типов это не преобразование типов, с ним нужно острожно и со знанием сути. Возможно, это и есть ошибка.
Экспериментировал и с преобразованием типов... без результатов ....
Может у вас внутренний опорник неисправен? Или вы его неправильно измеряете, что он плывёт? А приведение типов? Лучше поставьте константу первой в выражении.
Неактивний
" Может у вас внутренний опорник неисправен? Или вы его неправильно измеряете, что он плывёт? "
Врятли... контролирую мультиметром и реальные значения всегда соответствуют расчетным ref_volt (Vcc) ...
Неактивний
" Может у вас внутренний опорник неисправен? Или вы его неправильно измеряете, что он плывёт? "
Врятли... контролирую мультиметром и реальные значения всегда соответствуют расчетным ref_volt (Vcc) ...
Тогда осталось применить хрустальный шар.
Неактивний
renoshnik пише:" Может у вас внутренний опорник неисправен? Или вы его неправильно измеряете, что он плывёт? "
Врятли... контролирую мультиметром и реальные значения всегда соответствуют расчетным ref_volt (Vcc) ...Тогда осталось применить хрустальный шар.
Вот это в тему....
Заблудился в трех соснах...
Неактивний
Столкнулся с таким вот явлением ....
Ардуино ПроМини маркировка 5 Вольт 16 МГц.
Подключаю через адаптер USB to UART с питанием 5 Вольт, работает нормально.
Подключаю внешнее питание 5 Вольт прямо на Vcc тоже нормальная работа.
!!! Подключаю внешнее питание 7 - 9 Вольт на вход RAW и получаю Vcc = 3.3 Вольта !!!
Это, что китайцы перепутали стабилизатор на плате ????
Неактивний
Столкнулся с таким вот явлением ....
Ардуино ПроМини маркировка 5 Вольт 16 МГц.
Подключаю через адаптер USB to UART с питанием 5 Вольт, работает нормально.
Подключаю внешнее питание 5 Вольт прямо на Vcc тоже нормальная работа.!!! Подключаю внешнее питание 7 - 9 Вольт на вход RAW и получаю Vcc = 3.3 Вольта !!!
Это, что китайцы перепутали стабилизатор на плате ????
Скорее всего, или маркировку. А что на корпусе стабилизатора написано и какая частота кварца в реальности?
Неактивний
renoshnik пише:Столкнулся с таким вот явлением ....
Ардуино ПроМини маркировка 5 Вольт 16 МГц.
Подключаю через адаптер USB to UART с питанием 5 Вольт, работает нормально.
Подключаю внешнее питание 5 Вольт прямо на Vcc тоже нормальная работа.!!! Подключаю внешнее питание 7 - 9 Вольт на вход RAW и получаю Vcc = 3.3 Вольта !!!
Это, что китайцы перепутали стабилизатор на плате ????
Скорее всего, или маркировку. А что на корпусе стабилизатора написано и какая частота кварца в реальности?
стаб. S2RA маркировка.
кварц AN маркировка, точнее это сборка с тремя ножками (СМД). жаль измерить нечем...
Неактивний
... стаб. S2RA маркировка. кварц AN маркировка, точнее это сборка с тремя ножками (СМД). жаль измерить нечем...
Понятно. Хорошая маркировка, и счищать не нужно, что-бы интеллектуальную собственность не украли. Измерить можно программой Ардуинки и секундомером, только без использования системного таймера millis().
Неактивний
Сторінки 1