pvvx
Активный участник сообщества
Исходники копания с I2C2BLE/USB скинуты в https://github.com/pvvx/SimplePowerProfiler/tree/main/source/ch583/I2C2BLE
Во первых требуется удалить вызов компенсации по таймеру (и все другие таймерные события), так как это приводит к отдельному пробуждению SoC для выполнения отдельной тупой задачи. А лишнее пробуждение SoC - это отжирание у батареи лишних более 5 мА на 2..5 мс. Перенести вызов события компенсации RC после или перед передачей маяка, когда SoC уже активен для благих дел. Во время соединения вызов компенсации RC возможен по таймеру, но типично BLE соединения не длятся часами...Ну и теперь совсем напоследок - пару лайфхаков использования термокомпенсации:
pvvx, спасибо что выкладываете свои наработки.Исходники копания с I2C2BLE/USB скинуты в https://github.com/pvvx/SimplePowerProfiler/tree/main/source/ch583/I2C2BLE
Для Web bluetooth API пока не выкладывал, т.к. всё ещё идет борьба с BLE стеком WCH и имеющиеся решения были пока только для тестов, а не для чего-то другогоЕсть какая-то другая WEB-BLE форма для подключения этого CH582?
Тест из огрызков от UBIA для CH582F c INA228 c BLE: https://github.com/pvvx/SimplePowerProfiler/tree/main/source/ch583/I2C2BLE/ble_webЕсть какая-то другая WEB-BLE форма для подключения этого CH582?
Интересно, это стоит проверить, я как-то не обращал внимание на зависимость от напряжения. Но у меня такой проблемы нет - я не питаюсь от батарейки и не стремлюсь к экономии электроэнергии. Будет случай - посмотрю как зависят коэффициенты калибровки от напряжения (с вкл и выкл DC-DC), и отпишусь.По анализу ухода RC генераторов у аналогичных чипов - больший уход счета происходит при переходах Сон - Активность.
Причина банальна - батарейки имеют внутреннее сопротивление (CR2032 к концу - более 100 Ом).
При этом, в активном режиме напряжение питания чипа при передаче падает на 1В составляет 2В.
В режиме сна напряжение поднимается к 2.95В и выше (электрохимия элемента CR2xxx).
Соответственно меняется напряжение питания RC генератора.
В некоторых чипах в режиме сна происходит и отключение DC-DC и переход к LDO, что тоже является изменением напряжения питания RC.
У CH5xx тоже есть счетчик для калибровки LSI, именно он используется в их библиотечной функции калибровки. Только там что-то у них не получилось с аппаратной реализацией, поэтому при калибровке они 1-й результат отбрасывают, и фактически в этой их функции калибровка выполняется 2 раза!!! Я тоже пытался использовать этот счетчик, и тоже без пропуска 1-го результата ничего не получилось. До сути глюка докопаться не удалось, и я просто бросил это дело, стал использовать SysTick.Рассчитывать на стабильность питания RC гена нет никакой возможности. Супер LDO имеет обратную связь до 70 дБ, а ток чипа и напряжение колбасит на значительно большее значение...
По этому, во всех чипах при каждом пробуждении производится коррекция RC генератора.
RC генератор для BLE не может тикать менее 32кГц, а чип не может выполнить процедуры инициализации за это время. И у многих чипов есть аппаратный счетчик сколько тиков тактовой частоты между RC тиками.
у меня не получается заставить это работать по BLE, хотя по USB всё работает отличноТест из огрызков от UBIA для CH582F c INA228 c BLE: https://github.com/pvvx/SimplePowerProfiler/tree/main/source/ch583/I2C2BLE/ble_web
Не чищен от ненужных функций и т.д. Как есть, слепил когда тестировал для проверки, что работает с INA228. Но тесты были не в данном html...
test_pp228.html
if(value.getUint8(1) == 0x3A) {
for (let i=0;i<len;i+=6) {
datau.push([cur_idx/smprate, ((value.getInt8(i+4) << 16) | value.getUint16(i+2,true))*kBus+zBus]);
datai.push([cur_idx/smprate+0.5/smprate, ((value.getUint8(i+7) << 16) | value.getUint16(i+5,true))*kShunt+zShunt]);
cur_idx++;
if(cur_idx >= samples) {
datau.shift();
datai.shift();
}
}
//------------------------------------------
pp.js
} else if (blkid == 0x3A) { // i2c 24bit data
if (typeof this.new_adc_cb == 'function') {
if(this.cfg.chnls == 2) {
for (var i=0; i<blksz; i+=6) {
let du = this.blk[i+2] | (this.blk[i+3]<<8) | (this.blk[i+4]<<16);
let di = this.blk[i+5] | (this.blk[i+6]<<8) | (this.blk[i+7]<<16);
if(di >= 0x800000)
di -= 0x1000000;
this.new_adc_cb(du, di);
}
function SendInit(){
log('Send command #1: StartInit(stop)');
characteristicCache.writeValue(new Uint8Array([38, 1,
0, 0, 80, 195, 232, 3, I2CADDR, 0, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, I2CADDR, 1, I2CADDR, 2, I2CADDR, 1, I2CADDR, 2, I2CADDR, 0, 0, 0, 0, 0, 0, 0]))
}
//--------------------------------------------------
function SendStart(ina_md, ina_id) {
........
if(ina_md == 0x5449 && ina_id == 0x2281) {
log('INA228 chip registered!');
........
cmd = new Uint8Array([5, 0x38, 1, 3, smprate & 0xff, (smprate>>8)&0xff, 0]);
log('Send command #1: Set config - Start, I2C CLK 1.5MHz, Read Shunt & Bus, step '+(1000/smprate).toFixed(3)+' ms');
var smprate = 1851
у меня прокатило на всех адаптерах.По напряжению всё там ок - наводка 50 Гц.у меня не получается заставить это работать по BLE, хотя по USB всё работает отлично
по BLE получаю графики такого вида (INA228 никуда не подключена, при касании пальцами напряжение немного растёт)