Stránka 15 z 16

Re: ATtiny85 + Uno komunikácia

Napsal: pát úno 15, 2019 7:18 am
od DanoP
A ostatne bity ADMUX maju ake hodnoty, je vobec AD prevodnik aktivny? Ak sa pouziva uvedena kniznica je tam priamo prikaz na citanie teploty co nastavi vsetko potrebne vratane referencie (aspon tak sa mi zda) - toto funguje? Spotrebu asi urcuje seriova komunikacia. Ten for pre 1000x je zbytocny, resp tak ako vyzera byt to nedava velky zmysel a zbytocne blokuje procesor. Treba si uvedomit ze jedno meranie trva cca 2 az 4us, ked sa to opakuje 1000 po sebe (2 az 4 ms) bez moznosti spracovat medzitym napriklad udaje zo seriovej komunikacie moze to byt pruser. Lepsie je nastartovat AD prevod, vratit sa do hlavnej loop a kontrolovat ci uz je pripraveny vysledok a az vtedy ho zobrat (samozrejme bez zaspatia). V loope zatial moze prebehnut spracovanie seriovych udajov.

Re: ATtiny85 + Uno komunikácia

Napsal: pát úno 15, 2019 5:00 pm
od rottenkiwi
Ešte som vyskúšal na teplotu toto, ale v *C to dáva 0xEC čo je 236 *C, takže asi to treba nejako nakalibrovať,
len neviem k tomu násjť nejaký popis v angličtine.

Kód: Vybrat vše


#define TEMPERATURE_ADJUSTMENT 30
#define EXTREMES_RATIO 5
#define TEMPERATURE_SAMPLES 30
#define MAXINT 32767
#define MININT -32767

int offset=TEMPERATURE_ADJUSTMENT;
float coefficient=1;
int readings[TEMPERATURE_SAMPLES];
int pos=0;

void InternalTemperatureSensor() {

  //analogReference( INTERNAL1V1 );

  // ATTiny85 datasheet p140 (17.13.2), p137 (17.12)

  // Configure ADMUX

  ADMUX = B1111;                // Select temperature sensor

  ADMUX &= ~_BV( ADLAR );       // Right-adjust result

  ADMUX |= _BV( REFS1 );                      // Set Ref voltage

  ADMUX &= ~( _BV( REFS0 ) | _BV( REFS2 ) );  // to 1.1V

  //ADMUX &= ~( _BV( REFS0 ) );  // to 1.1V

  // Configure ADCSRA

  ADCSRA &= ~( _BV( ADATE ) |_BV( ADIE ) ); // Disable autotrigger, Disable Interrupt

  ADCSRA |= _BV(ADEN);                      // Enable ADC

  ADCSRA |= _BV(ADSC);          // Start first conversion

  // Seed samples

  int raw_temp;

  while( ( ( raw_temp = raw() ) < 0 ) );

  for( int i = 0; i < TEMPERATURE_SAMPLES; i++ ) {

    readings[i] = raw_temp;

  }

}

int in_lsb() {
  int readings_dup[30];
  int raw_temp;
  // remember the sample
  if( ( raw_temp = raw() ) > 0 ) {
    readings[pos] = raw_temp;
    pos++;
    pos %= 30;
  }
  // copy the samples
  for( int i = 0; i < 30; i++ ) {
    readings_dup[i] = readings[i];
  }
  // bubble extremes to the ends of the array
  int extremes_count = 6;
  int swap;
  for( int i = 0; i < extremes_count; ++i ) { // percent of iterations of bubble sort on small N works faster than Q-sort
    for( int j = 0;j<29;j++ ) {
      if( readings_dup[i] > readings_dup[i+1] ) { 
        swap = readings_dup[i];
        readings_dup[i] = readings_dup[i+1];
        readings_dup[i+1] = swap;
      }
    }
  }
  // average the middle of the array
  int sum_temp = 0;
  for( int i = extremes_count; i < 30 - extremes_count; i++ ) {
    sum_temp += readings_dup[i];
  }
  return sum_temp / ( 30 - extremes_count * 2 );
}

int in_c() {
  return in_k() - 273;
}

int in_f() {
  return in_c() * 9 / 5 + 32;
}

int in_k() {
  return in_lsb() + offset; // for simplicty I'm using k=1, use the next line if you want K!=1.0
  //return (int)( in_lsb() * coefficient ) + offset;
}

int raw() {
  if( ADCSRA & _BV( ADSC ) ) {
    return -1;
  } else {
    int ret = ADCL | ( ADCH << 8 );   // Get the previous conversion result
    ADCSRA |= _BV(ADSC);              // Start new conversion
    return ret;
  }
}

Re: ATtiny85 + Uno komunikácia

Napsal: sob úno 16, 2019 5:29 pm
od rottenkiwi
Ako by bolo vhodné pri pálení do Attiny nastaviť CLK procesora a LTO, EEPROM a BOD ?
CLK dať 8 Mhz ? Či existuje aj SoftSerial.h, kde by 1 MHz nevadil ?
Pri napaľovaní vždy premazať aj EEPROM ?
A BOD nastaviť na 1.8 V alebo na 2.7 V ?
Ak na 2.7, tak sa Attiny pri 2.7 V vypnú a ušetria baterku ?

Re: ATtiny85 + Uno komunikácia

Napsal: sob úno 16, 2019 6:11 pm
od DanoP
Pouzivam default z vyroby 1MHz, SoftwareSerial 4800 v pohode, 9600 uz nebolo spolahlive. Pouzivam AttinyCore od SpenceKonde. BOD mam 1,8V - napaluje sa to cez napalovanie bootloaderu (v skutocnosti to len nastavi configuracne fuses). 2,7V sa mi zdalo vysoko, ked horna hranica moze byt az 2,9V. EEPROM mam nastavene nechat tak bez resetu (default z vyroby), v EEPROM su z vyroby hodnoty FF... Ak napatie spadne pod BOD ( je tam tusim hysterezia okolo 50mV) a nizka uroven trva dlhsie ako 2uS tak sa zastavi. Nabieha to tiez spolahlivo bez pouzitia reset pinu, aj pri pomalom naraste napatia, mam skor problem, ze napriklad pri 1,9V mi este nebezi 100% referencia (potrebujem aspon 2,1V), ale vacsi problem je ze pri tomto napati mi vypadava seriova komunikacia ( odchylka oscilatora, budenie optoclenov ??). Vzhladom na to ze od 2,1V to bezi opat OK, tak to neriesim.

Re: ATtiny85 + Uno komunikácia

Napsal: sob úno 16, 2019 6:59 pm
od rottenkiwi
Tak teraz to testujem na 4S 18650 Li-ion, BOD 1.8, CLK 1 MHz, Comm. 4800 baudov,
pri blikaní TX to má 38 mA.
Pri spánku na 8 sec. to žerie 7080 uA.

Keď sa zmení napatie na A1, tak sa to resetne, prijíma to príkazy 60 sec. a potom
znova pošle dáta, spí .... atď.

Nechám to do zajtra a uvidím, ako to vyšťaví 18650-ky.

Re: ATtiny85 + Uno komunikácia

Napsal: ned úno 17, 2019 7:24 pm
od kodl69
myslím si, že pokud nejsou vybitý už teď tak jeden den nic neznamená...

Re: ATtiny85 + Uno komunikácia

Napsal: pon úno 18, 2019 6:40 pm
od rottenkiwi
Dal by sa ako riadiaci modul použiť buď Nano alebo dokonca ATtiny85 ?
Potrebujeme signalizovať len, že aspoň jeden článok je nad limitX a aspoň jeden
článok je pod limitY.

Re: ATtiny85 + Uno komunikácia

Napsal: pon úno 18, 2019 7:57 pm
od kodl69
To je základ, arduino nano je zbytečně moc drahý, to spíš samotenej atmega procesor (s krystalem), když už se dělá deska, je to jedno. Nano zvládne i třeba nějakej displej, ale zobrazení na web rozhraní, logování na SD, odeslání dat do nějakýho nadřazenýho systému...to už asi bude málo.
Tady by to asi chtělo nějakej základ SW stvořit formou podprogramu, knihovny nebo tak něco, aby bylo od čeho se odpíchnout a třeba ať si to každej udělá podle svýho. Někdo dával odkaz na BMS, kde poslední modul byl jinačí, a byla tam buď atmega, a nějaký výstupy pro spínání vytěžovače, odpojení nabíjení, zátěže, a nebo ESP8266 pro web rozhraní. Sice se mi zrovna tohle řešení úplně moc nelíbí (ten jeden článek bude víc vybíjenej) ale je to taky možnost.

P.S: díval jsem se na prográmek, a tohle není moc univerzální řešení. Podle mě by to mělo fungovat tak, že když vyměním kterejkoliv modul, a nastavím příkazem ref. napětí a bal. napětí, tak to musí posílat korektní data. Adresy nahraný natvrdo do programu jsou cesta do pekel.

Re: ATtiny85 + Uno komunikácia

Napsal: pon úno 18, 2019 8:41 pm
od rottenkiwi
Meral som teraz spotrebu uspaného Una, to je cca. 5.2 mA.
Skúsim tam pripojiť Eht. Shield a skúsiť logovať, či to pojde.

Ale web interfejs tam nenarvem, na to je tam málo pamate.

No ak je to s tými adresami zle, tak sa pozriem čo navrhuje DanoP
a skúsim nad tým v noci dumať.

Ono, ak nemáme adresy, nemože byť rozne bal. napatie, ani rozna kalibrácia
pre každý modul zvlásť, potom budú len 2 príkazy a keď si to uloží veci do
EEPROM, tak to bude bez riadiaceho modulu balancovať.

Ak pripojíme riad. modul, získame napatia článov vzhľadom na jednu balančnú
konštantu, takže budú vačšie rozdiely ako by boli s bal. konštantou, resp. nejakou
tabuľkou pre rozne napatia pre každý modul zvlášť.

Re: ATtiny85 + Uno komunikácia

Napsal: pon úno 18, 2019 11:41 pm
od kodl69
Tady asi někdo spal. Proč by nešel nastavit každej modul zvlášť? když bude zpráva sestavená např ze 16 ti paketů a každej modul, co ji přečte, si jeden paket nechá a zbytek pošle dál. Stejně tak bude vyčítání, prostě přijde zpráva, modul ji načte a při odesílání dál na konec přidá svoje data. Každej modul 4byte, 1 byte označuje typ zprávy, další dva jsou napětí a poslední nevím, třeba lbal. proud a teplota, nebo nějaký stavový slovo... na konce zprávy se přidá nějakej spec. byte, aby se vědělo, že je to konec (třeba @) a je to celý. No a první byte může být klidně "R" pro read, "B" pro balanční napětí a třeba "c" pro kalibraci, a "D" pro default bal. napětí v eeprom, ale co to přesně bude za znaky je asi jedno to je asi jedno, jenom je potřeba se domluvit, jak to teda bude. Potom pro zprovoznění balancování ani nepotřebuju žádnej řídící modul, ale prostě tam pošlu zprávu vypadající takhle (pro 4s):
<řídící znak> <MSB napětí> <LSB napětí> <nevímco> a dlaší 4 byte pro další modul, až na konec "@". takže prakticky
"B" 0x0D 0x7A 0x00 "B" 0x0D 0xAC 0x00 "B" 0x0D 0x7A 0x00 "B" 0x0D 0x7A 0x00 "@"
je nastavení bal. napětí pro články od prvního 3450, 3450, 3500, 3450 milivoltů.
naopak pro vyčtení dat by zpráva od řídícího modulu vypadala "R" 0x00 0x00 0x00 "@" za prvním modulem už bude třeba "R" 0x00 0x00 0x00 "R" 0x0D 0x05 0x00 "@" a tak dále. Když to funguje jinejm s PICem, proč by to nejelo s attiny...

Re: ATtiny85 + Uno komunikácia

Napsal: úte úno 19, 2019 9:09 am
od pete
Já mám protokol navrženej a vpodstatě už i implementovanej tak, aby šlo komunikovat jak s jednotlivým modulem tak i se všema naráz a posílat z modulů asynchronní události. Žádná adresa se do modulu nahrávat nemusí, je daná jeho pořadím na zřetězené sériové lince.

Na prvním bajtu zprávy je adresa modulu jako číslo 0..127 nebo speciální broadcast adresa (-128). Modul se ke zprávě chová tak, že provádí jen příkazy ze zpráv s adresou broadcast nebo s nulovou adresou. Všechny ostatní zprávy neprovádí, jen je přeposílá dál s o jedničku dekrementovanou adresou. Do mastera se broadcast adresa vrátí jako broadcast a cílená adresa jako záporný číslo, ze kterýho se původní adresa spočítá jednoduše přičtením počtu modulů. Asynchronní událost modul odešle s adresou -1 a do mastera to dorazí zase tak, že si adresu odesílatele dopočítá stejným způsobem.

Na druhým bajtu je pak kód příkazu a pak případný parametry, data z modulů a na konci dva bajty CRC. Žádná ukončovací značka není potřeba, takže nejkratší příkaz má délku jenom čtyři bajty včetně CRC.

Re: ATtiny85 + Uno komunikácia

Napsal: úte úno 19, 2019 9:55 am
od kodl69
Pěkně, vidím, že jsi to vzal z úplně jinýho konce. Tohle asi bude dost dobrý řešení. Pokud bys měl nějakou betaverzi aspoň se základní funkčností, tak bych to odzkoušel. Přešel jsi kvůli spolehlivosti komunikace na 4800bd, nebo vyměnil odpory z 2k2 na 1k u optočlenů? Máš nějak vymyšlený zapsání adresy do eeprom danýho modulu, aby se to nemuselo řešit před instalací? A nebo tam ty adresy nejsou, a vlastně ten modul ani neví, jakou tu adresu má, díky tomu odečítání? Ale v každým případě dobrej nápad. Nezabere moc paměti to CRC? Co se stane, když přijde některýmu modulu zpráva s chybným CRC? zahodí se, nebo následuje nějaká reakce?
Chystám se osadit si dalších 14 modulů a provádět ostrej test na 16s 60Ah winstonech. Ale tenhle týden to asi nedám, je to předse jenom pár hodin práce a nejlepší je to udělat na jeden zátah...

Re: ATtiny85 + Uno komunikácia

Napsal: úte úno 19, 2019 10:56 am
od pete
Pošlu ti funkční verzi, kde je implementovanej protokol a základní nastavování parametrů. Chybí tam digitální filtrace měření, optimalizace spotřeby ve spánku a nějaký další věci, ale základ chodí.
Jo musel jsem přejít na 4800bd, protože na 9600 padalo dost chyb, ale problém nebude ve zkreslení na optočlenech, ale v knihovně NeoSWSerial, je tam někde asi chyba v časování Tx, protože to stejně chybuje i když napřímo propojím tiny rx-tx za sebou. Knihovnu jsem musel přiohnout, protože neumí 4800bd, ale je to změna na jednom řádku.
Adresy se nikam nezapisujou, modul svou adresu nepotřebuje znát. CRC nezabere skoro žádnou paměť. Odhaduju že tak tři čtvrtiny kódu je hotových a zabírá to necelou půlku flash a asi třetinu RAM, takže prostoru na případný další rozšiřování funkcionality zbude dost.
Když přijde zpráva s neplatným CRC, tak se přepošle dál, před CRC se připojí chybová značka "EC" a za ni to přijaté vadné CRC, takže i další moduly to rozpoznají jako chybu a připojí každej svou chybovou značku "EC". Z počtu EC značek se pozná, kde došlo k první chybě.

Re: ATtiny85 + Uno komunikácia

Napsal: úte úno 19, 2019 1:19 pm
od kodl69
A co klasická knihovna software serial? Pokud jsem nedělal pokusy s uspáváním a watchdogem, tak mi prošlo 130 znaků 9k6 jako nic... S tím, že se to ukládalo do stringu a potom odesílalo. Přibal kdyžtak i tu knihovnu, nebo aspoň podrobnej popis, co s ní provést.

Re: ATtiny85 + Uno komunikácia

Napsal: úte úno 19, 2019 1:40 pm
od pete
SoftwareSerial neumí duplex, takže musíš přijmout celou zprávu a pak teprve můžeš odesílat. To klade nároky na paměť a limituje maximální délku zprávy. Taky pak celá komunikace trvá delší dobu.. NeoSWSerial umí duplex, takže zpráva se průchodem přes modul zdrží jen o nějaký dva tři znaky a není třeba řešit jak je dlouhá. Modul zajímá jen začátek, kde je adresa, příkaz a jeho parametry a pak až CRC na konci. Tohle si uloží a všechno ostatní jenom tupě předává ze vstupu na výstup. Tehle výhody bych se nerad vzdával. Až to bude hotový tak se v té knihovně zkusím ještě povrtat a zprovoznit těch 9600 bez chyb.

Re: ATtiny85 + Uno komunikácia

Napsal: sob úno 23, 2019 9:54 pm
od rottenkiwi
Nechal som BMS na baterkách 18650 - LG 2200 mAh, 4S a za týždeň je graf napatia takýto:

Dá sa z toho usúdiť koľko z toho je samovybíjanie a koľko spotreba BMS ?
Koĺko dní to odhadom vydrží do cut off voltage : 3.00 V , na jednom z článov ?

Re: ATtiny85 + Uno komunikácia

Napsal: sob úno 23, 2019 10:00 pm
od NOPARasito
Odhadem to bude spotreba jen BMS, samovybijeni po tydnu ani snad neni. Pokud necham baterii ladem mesic, tak napeti klesne max. o 0,02V/clanek.

Re: ATtiny85 + Uno komunikácia

Napsal: sob úno 23, 2019 10:27 pm
od vlkazajac
Mám odložené batérie, nabité pred rokom a nie sú zďaleka nové. Pokles napätia bohužiaľ neviem dokladovať, ale povedal by som, že ( všetko -5 % ) na tých Vašich vybilo BMS. Teda samovybíjanie je oproti vlastnej spotrebe BMS nepodstatné.

Re: ATtiny85 + Uno komunikácia

Napsal: ned úno 24, 2019 12:12 pm
od DanoP
Myslim si ze na clanky s kapacitou 2,2Ah by stacili jednoduche pasivne balancery, alebo specializovane malovykonove BMS, co maju kludovu spotrebu v uA. Cielom nasich BMS su clanky s kapacitou radovo 10 - 100Ah, kde toto uz nie je problem, hlavne ked kludova spotreba pripojeneho menica je cca 0,5A. Analyza odberu mojho riesenia hovori zhruba toto: samotny modul bez processora berie pri 3,3V 125 uA, z toho referencia 40uA a zvysok odporovy delic napatia 20+20kO. Modul s osadenou ATTiny bez komunikacie a uspavanim cca 130uA, cize samotny procesor 5uA. Pouzivam sleep, s meranim kazdu sekundu, ale je aktivny watchdog a BOD a teda aj vnutorna referencia. Bez uspavania by bola spotreba cca 1,4 mA (bez komunikacie).

Re: ATtiny85 + Uno komunikácia

Napsal: ned úno 24, 2019 3:34 pm
od kodl69
Jde o měření spotřeby balanceru.
Podle charakteristik li-ion obvykle na začítku bývá pokles napětí větší, pak to jde prakticky lineárně a od 3.3V zase ostřej dolů. Takže pokud budu uvažovat nejhorší variantu, že takhle to půjde do 3.3V, tak 3.3V to dosáhne za celkem 7 týdnů, což je 1176hodin na 2Ah, takže reálná průměrná spotřeba není vyšší než 1.7mA
Škoda je, že probuzení přes watchdog má nejdelší čas 8s, podle mě by to mohlo být i víc. Ale změření napětí a upání zas té elektriky snad tolik nesežere. Stejně tak interval vyčítání dat, pokud se napětí baterek nemění víc než 10mV (+- chyba měření a řekněme vliv rušení) tak by podle mě stačilo vyčítat napětí klidně i po minutě. Tím by reálná spotřeba poklesla klidně na čtvrtinu. Ale i takhle to s 20Ah článkem vidím jako použitelný (vybije ho to cca za rok), s 200Ah prakticky bez vlivu na článek...