AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
20.03.2021, 08:48
|
|
Временная регистрация
Регистрация: 05.10.2010
Сообщений: 68
Сказал спасибо: 12
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
Удалось решить проблему, спасибо ForcePoint,
Код:
|
int16_t read2Byte(uint8_t addr, uint8_t deviceAddr){ // чтение 2 байта по адресу I2C
int16_t data; //16-bit
uint8_t MSB, LSB; //8-bit
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(deviceAddr‹‹1); //Кидаем на шину адрес INA226
i2c_write(addr); //Киадем какой регистр хотим читать
i2c_stop();
delay_us(10);
i2c_start();
i2c_write((deviceAddr‹‹1)+1); //Обращаемся к INA226 в режиме чтения
MSB=i2c_read(1); //читаем старший байт
LSB=i2c_read(0); //читаем младший байт
i2c_stop(); //Посылаем команду "Cтоп"
data=MSB;
data = (data ‹‹ 8)+LSB; //Склеиваем data= data ‹‹ 8/LSB; или daat= word(MSB, LSB);
return data; //Возвращаем значение прочитанного
} |
|
|
|
|
07.05.2021, 10:07
|
|
Временная регистрация
Регистрация: 05.10.2010
Сообщений: 68
Сказал спасибо: 12
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
Всем привет! Продолжаю упражняться на инке, затея измерить сопротивление импульсное Rimp в АКБ автомобильном. Есть для этого метода предложенная на одном из форумов, Rimp = (Uimp-Uакб)/Iimp, где Uакб - напряжение до импульса, Uimp - напряжение в момент импульса, и Iimp - ток в момент импульса. Импульс длительностью 1 миллисекунды. Измеряется все это дело при помощи INA226 c шунтом на 20А /75мВ. Связь с INA226 по I2C частота 100kHz.
Вопрос в том что моем коде опрос INA226, увеличивает время импульса до 40мс по ослику. Убираем работу с INA226 четко работа 1мс. Как быть, отказаться от такой затеи с INA226, перейти на АЦП меги?
Код:
|
if(newTime - offTime › PAUSE-500) { //Если до конца ПАУЗЫ осталось 0,5 сек
adc_R1_pause=read2Byte(INA226_BUS_VOLTAGE,INA226_I 2C_ADDRESS); //замеряем напряжение перед импульсом
write2Byte(INA226_CONFIGURATION, 1403, INA226_I2C_ADDRESS); //записали в INA226 измерение в режиме триггера, 16avr 140us
PORTB.2=1; //подали импульс
}
if(newTime - offTime › PAUSE-499) {
adc_R2_pause=read2Byte(INA226_BUS_VOLTAGE,INA226_I 2C_ADDRESS); //замеряем напряжение в момент импульса
Iimp=read2Byte(INA226_SHUNT_VOLTAGE,INA226_I2C_ADD RESS); //замеряем ток в имп
PORTB.2=0; //конец импульса
write2Byte(INA226_CONFIGURATION, 4497, INA226_I2C_ADDRESS); //записали в INA226 измерение в режиме неприрывное, 128avr 140us для дальнейшей работы
} |
|
|
|
|
10.05.2021, 20:11
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
АЦП Меги - 10 битный. Вы уверены, что хватит точности?
Может лучше изменить параметры инициализации I2C или скорость обмена? Насколько вижу из даташита - чип похож на INA3221. Рабочие характеристики примерно похожи. Регистры так же 16-ти битные.
Измерить на нём импульс в 1мс проблематично, даже если использовать наиболее быстрый режим без усреднений.
Но попробуйте сделать чуть-чуть иначе.
1. Настройка чипа перед импульсом:
- Остановить измерения;
- Усреднение: 4;
- Время преобразования напряжения: 140мкс;
- Режим измерения: Напряжение линии, триггер; Только напряжение!
2. После этого включаете нагрузку.
3. Сразу после этого ЕЩЁ раз записываете режим измерения: Триггер. То же самое значение!
4. Через 1мс снимаете нагрузку и читаете данные. Можно поиграть с таймингами. В зависимости от кода задержка может не потребоваться.
|
|
|
|
10.05.2021, 23:45
|
|
Временная регистрация
Регистрация: 05.10.2010
Сообщений: 68
Сказал спасибо: 12
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
Сообщение от -Alan-
|
Но попробуйте сделать чуть-чуть иначе.
1. Настройка чипа перед импульсом:
- Остановить измерения;
- Усреднение: 4;
- Время преобразования напряжения: 140мкс;
- Режим измерения: Напряжение линии, триггер; Только напряжение!
2. После этого включаете нагрузку.
3. Сразу после этого ЕЩЁ раз записываете режим измерения: Триггер. То же самое значение!
4. Через 1мс снимаете нагрузку и читаете данные. Можно поиграть с таймингами. В зависимости от кода задержка может не потребоваться.
|
Добрый вечер!
1. только напряжение, т.е. читаю данные линии напряжения VBUS?
3. Значение чего - конфигурации(режима измерения, время преобразования и усреднение)?
4.Вот тут интересное предложение, в коде своем - вы увидели делаю наоборот, подаю импульс, и читаю данные напряжения и тока, потом выключаю импульс. А т.к. у нас режим триггера, то с начало подаю импульс и снимаю его, а потом читаю значения... попробую!Спасибо!
Последние пару дней пробовал изменять время преобразования, и усреднения, и есть какой то толк, но точность не особо на правду похожа, полюс/минус автобусная остановка.
|
|
|
|
14.05.2021, 08:22
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
По пункту №3.
В даташине (страница 11) чёрным по английски описано, что запуск по триггеру осуществляется записью в регистр конфигурации (0x00) значения (пусть даже совпадающего), где указан режим запуска "Триггер".
В частности, у Вас должно быть примерно следующее:
0x00 -› 0x4202, если я правильно расставил биты.
RST = 0 - НЕ сброс
D14-D12 = 100 - Резерв
AVG = 001 - Усреднение х4
VBUSCT = 000 - Измерение напряжения 140мкс
VSHCT = 000 - Измерение тока 140мкс
MODE = 010 - Режим - триггер, только напряжение линии.
Записываете это значение (до измерения), выжидаете 1мс, начинаете запись слова в регистр и сразу же после этого (либо в момент начала записи) - включаете нагрузку.
Далее либо по готовности, либо через 1мс - снимаете нагрузку и читаете данные.
Кстати, рекомендую отсчитывать время таймерами. Это надёжнее.
По AVR сейчас не вспомню, но 16-ти битного таймера должно хватить для отсчёта интервала в 8мс с неплохой точностью. Для получения интервала в 1мс должно хватить за глаза.
|
|
|
|
14.05.2021, 23:51
|
|
Временная регистрация
Регистрация: 05.10.2010
Сообщений: 68
Сказал спасибо: 12
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
Сообщение от -Alan-
|
В частности, у Вас должно быть примерно следующее:
0x00 -› 0x4202, если я правильно расставил биты.
RST = 0 - НЕ сброс
D14-D12 = 100 - Резерв
AVG = 001 - Усреднение х4
VBUSCT = 000 - Измерение напряжения 140мкс
VSHCT = 000 - Измерение тока 140мкс
MODE = 010 - Режим - триггер, только напряжение линии.
|
Так и есть с этим и работаю.
Сообщение от -Alan-
|
Записываете это значение (до измерения), выжидаете 1мс, начинаете запись слова в регистр и сразу же после этого (либо в момент начала записи) - включаете нагрузку.
Далее либо по готовности, либо через 1мс - снимаете нагрузку и читаете данные.
|
почему 1 мс? у меня конечно убогий лог.анализатор(заказал на али новый)
Сообщение от -Alan-
|
Кстати, рекомендую отсчитывать время таймерами. Это надёжнее.
По AVR сейчас не вспомню, но 16-ти битного таймера должно хватить для отсчёта интервала в 8мс с неплохой точностью. Для получения интервала в 1мс должно хватить за глаза.
|
16-бит и делаю, настроил на 1мс... код который ранее выкладывал это кусок, под конец паузы за 500мс перед зарядом как раз начинаю замеры и вычисления...
Спасибо вам за уделенное время!
|
|
|
|
20.05.2021, 15:44
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Библиотека INA226 или как с ней работать
Не за что =)
Про 1мс до начала измерения - скорее для того, чтобы режим триггера сработал. Предполагаю, что он будет срабатывать при каждой записи. А первый раз - чтобы гарантированно запустить ДО включения нагрузки, и чтобы АЦП успел измерить напряжение, а затем ПОСЛЕ того, как будет подключена нагрузка - начать измерение.
Если предварительно выставлен режим триггера - то записывать дважды не нужно.
А вообще для такого случая я бы описал отдельную функцию, которая ещё в момент записи последнего байта настройки включает подтяжку для аккумулятора. Где-то подобные "хаки" я реализовывал.
Плюс, в этом случае можно поиграть с задержками между передачей байта и включением подтяжки, чтобы начало преобразования АЦП попало как раз на нужный участок, где напряжение уже ниже, но ещё не требует затягивания момента отпускания.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:43.
|
|