Attiny85

Odpovědět
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Attiny85

Příspěvek od marsal »

Ahoj, dělá tady někdo s Attiny85 a mohl by poradit s AD převodníkem?
Nejsem nějak spokojen s rozlišením AD převodu.
Jako desetibitový by měl na 27V dávat rozlišení 0.02V, v reálu (po snížení děličem) mi to rozlišení ale přijde výrazně hrubší.
Používám referenci 2.56V s kondenzátorem - viz schéma.
// vstupní dělič:
// Vbat-R1-Vin-R2-//
// Vref = 2.56V
// ADC = Vin * 1024 / Vref


#include<avr/io.h>
#define F_CPU 16500000UL

void adc_setup()
{
DDRB|=(1<<PB1);
TCCR0A=0x00; //Timer0 normal mode
TCCR0B=0x00;
TCCR0B |= (1<<CS00)|(1<<CS02); //prescaling with 1024
TCNT0=0;
ADCSRA|=(1<<ADEN); //Enable ADC module
ADMUX=0x11010001; // configuring PB2 to take input
ADCSRB|=1<<ADTS2; //Timer / Counter 0 overflow triggers the ADC to perform conversion
ADCSRA|=(1<<ADSC)|(1<<ADATE); //Enabling start of conversion and Auto trigger


// set port PB5 for reading
DDRB &= ~(1 << PB3); // Set the pin PB5 as input
PORTB |= (1 << PB3); //activate pull-up resistor for PB5

}

int main()
{
adc_setup();
while(1)
{
int adc_l = ADCL; //value of Input Voltage
int adc_val = (ADCH<<8)|adc_l; //Storing entire ADC value in a variable
bool is_switch = PINB & (1 << PB3); // The switch on PB3 disables the function (output is always OFF)

if (is_switch) {

if (adc_val>=640) //ON if not switch
PORTB|=(1<<PB1);

if (adc_val<=639) //OFF
PORTB &=~(1<<PB1);
}
else
PORTB &=~(1<<PB1);

TIFR|=(1<<TOV0); //Clearing overflow flag
}

}
Přílohy
Schematic_mswind_v2_2021-10-29.png
Schematic_mswind_v2_2021-10-29.png (562.55 KiB) Zobrazeno 1166 x
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Re: Attiny85

Příspěvek od marsal »

Hmmm, tak tohle je dobré k věci: https://www.youtube.com/watch?v=LyRD-bNrnbo
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Re: Attiny85

Příspěvek od marsal »

OK tedy, vypadá to, že příčinou je brum, starý známý nepřítel.
Začal jsem tedy měřenou hodnotu průměrovat (ve stylu "co se do paměti vejde") a začíná se to chovat podle očekávání.
// vstupní dělič:
// Vbat-R1-Vin-R2-//
// Vref = 2.56V
// ADC = Vin * 1024 / Vref


#include<avr/io.h>
#define F_CPU 16500000UL

#define meas_array_size 200

unsigned int meas_array[meas_array_size];

void adc_setup()
{
DDRB|=(1<<PB1);
TCCR0A=0x00; //Timer0 normal mode
TCCR0B=0x00;
TCCR0B |= (1<<CS00)|(1<<CS02); //prescaling with 1024
TCNT0=0;
ADCSRA|=(1<<ADEN); //Enable ADC module
ADMUX=0b11010001; // configuring PB2 to take input
ADCSRB|=1<<ADTS2; //Timer / Counter 0 overflow triggers the ADC to perform conversion
ADCSRA|=(1<<ADSC)|(1<<ADATE); //Enabling start of conversion and Auto trigger


// set port PB5 for reading
DDRB &= ~(1 << PB3); // Set the pin PB5 as input
PORTB |= (1 << PB3); //activate pull-up resistor for PB5

}

int meas_avg(unsigned int meas_value)
{
unsigned long avg = 0;
// make shift
for(int i=0; i<meas_array_size-1; i++){
avg = avg + meas_array;
meas_array = meas_array[i+1];
}
// write new value
meas_array[meas_array_size-1] = meas_value;
// add last value
avg = avg + meas_value;
// calculate average
avg = avg / meas_array_size;
return(avg);
}

int main()
{
adc_setup();
while(1)
{
int adc_l = ADCL; //value of Input Voltage
unsigned int adc_val = (ADCH<<8)|adc_l; //Storing entire ADC value in a variable
bool is_switch = PINB & (1 << PB3); // The switch on PB3 disables the function (output is always OFF)

// averagize
int smoothed_val = meas_avg(adc_val);

if (is_switch) {

if (smoothed_val>=640) //ON if not switch
PORTB|=(1<<PB1);

if (smoothed_val<=625) //OFF
PORTB &=~(1<<PB1);
}
else
PORTB &=~(1<<PB1);

TIFR|=(1<<TOV0); //Clearing overflow flag
}

}
Uživatelský avatar
kybos
Příspěvky: 214
Registrován: čtv srp 05, 2021 5:49 pm
Výkon panelů v FVE [Wp]: 15000
Kapacita baterie [kWh]: 40

Re: Attiny85

Příspěvek od kybos »

Připadá mi takové řešení jako by jej někdo navrhoval ve stylu "nacpěme tam alespoň kousek SW, abychom snížili spolehlivost". Zvaž, zda by nebylo jednodušší a spolehlivější řešení s obyčejným analogovým komparátorem. Dva spolehlivé víceotáčkové drátové trimry, jeden na nastavení komparační meze, druhý na nastavení hystereze (pokud by to bylo požadováno, jinak hystereze na pevno). Přesnost a rychlost takového řešení je nesrovnatelná s digitálním řešením a spotřeba digitálního regulátoru (s potřebným napáječem) bude zřejmě taktéž řádově někde jinde. Pak také dle mých letitých zkušeností platí, že kde je nějaký SW, tam je také nějaký bug. Je jen otázka, kdy se projeví (většinou fatálně a v tu nejméně vhodnou dobu).
Nehledě k tomu, že za pár let pokročí technologie tak daleko, že už nebude čím ten SW modifikovat a na čem jej přeložit i když se zázrakem dochovají zdrojové kódy. Mám doma více takových SW pomníčků, které jsou z tohoto důvodu po letech neopravitelné. Analogové řešení mohu modifikovat i necejchovaným šroubovákem, který mi vydrží až do smrti.
15 kWp JJZ + 3x Tristar MPPT60 + Victron 150/100 + 48V LiFePO 850 Ah + UPS 8kW (MPP-Solar 8048 LC) + nabíječka 4 x 1,2 kW (DELTA) Start: 2012
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Re: Attiny85

Příspěvek od marsal »

kybos píše: pát říj 29, 2021 10:07 am Připadá mi takové řešení jako by jej někdo navrhoval ve stylu "nacpěme tam alespoň kousek SW, abychom snížili spolehlivost". Zvaž, zda by nebylo jednodušší a spolehlivější řešení s obyčejným analogovým komparátorem. Dva spolehlivé víceotáčkové drátové trimry, jeden na nastavení komparační meze, druhý na nastavení hystereze (pokud by to bylo požadováno, jinak hystereze na pevno). Přesnost a rychlost takového řešení je nesrovnatelná s digitálním řešením a spotřeba digitálního regulátoru (s potřebným napáječem) bude zřejmě taktéž řádově někde jinde. Pak také dle mých letitých zkušeností platí, že kde je nějaký SW, tam je také nějaký bug. Je jen otázka, kdy se projeví (většinou fatálně a v tu nejméně vhodnou dobu).
Nehledě k tomu, že za pár let pokročí technologie tak daleko, že už nebude čím ten SW modifikovat a na čem jej přeložit i když se zázrakem dochovají zdrojové kódy. Mám doma více takových SW pomníčků, které jsou z tohoto důvodu po letech neopravitelné. Analogové řešení mohu modifikovat i necejchovaným šroubovákem, který mi vydrží až do smrti.
Rozumím Ti, já vím, že to je Tvá preference. To SW řešení nabízí do budoucna více možností: dnes ráno se mi podařilo rychle eliminovat vliv brumu, v budoucnu mohu lehce dodat třeba automatizované řízení podle teploty, kdy používat dump load a kdy používat PWM do zkratu, s možností programově posouvat napěťové úrovně + hysterezi (tj. PWM do zkratu bude jako druhá záloha) atd. Dále lze PWM realizovat programově stále běžícím "oscilátorem". Pro ruční doladění spínacího napětí tam ale potenciometry (dva krásné víceotáčkové "co šuple dalo") nechám ;-), opravdu se mi nechce každý drift řešit změnou programu.
Attiny85 se používá velmi běžně pro baterkou napájená zařízení (s 3V knoflíkovkou vydrží věky), o spotřebu bych se nebál, a to jsem si zatím nehrál ani s usínáním atp.
Pokud bys byl tak laskav a kouknul ještě na schéma v tomto vlákně, zda "kolem" není něco blbě, byl bych Ti vděčný. Cívku plánuji tedy výrazně měnší, ale to by snad mělo být OK kvůli tomu, že se nepoužívá násobič a kondenzátory před ní (jak jsi psal). Díky. Dodám tam ještě 4k7 odpory do země před gates, jak radil kodl69.
Uživatelský avatar
kybos
Příspěvky: 214
Registrován: čtv srp 05, 2021 5:49 pm
Výkon panelů v FVE [Wp]: 15000
Kapacita baterie [kWh]: 40

Re: Attiny85

Příspěvek od kybos »

marsal píše: pát říj 29, 2021 10:58 am Pokud bys byl tak laskav a kouknul ještě na schéma v tomto vlákně, zda "kolem" není něco blbě, byl bych Ti vděčný
Zkratovací jistič bych nahradil zkratovacím vypínačem. Je zapotřebí, aby v sepnutém stavu v žádném případě nedošlo k jeho rozpojení, což u jističe nelze zaručit. Stačí nějaký menší atmosférický výboj, jistič vypadne a odstavená elektrárna se roztočí na volnoběžné otáčky.
15 kWp JJZ + 3x Tristar MPPT60 + Victron 150/100 + 48V LiFePO 850 Ah + UPS 8kW (MPP-Solar 8048 LC) + nabíječka 4 x 1,2 kW (DELTA) Start: 2012
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Re: Attiny85

Příspěvek od marsal »

kybos píše: pát říj 29, 2021 1:28 pm Zkratovací jistič bych nahradil zkratovacím vypínačem.
Bingo, díky moc, kybos, za veškerou pomoc.
Odpovědět

Zpět na „Automatizace, řízení“