AVR arduino potize
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Úterý Duben 13 21:00:37 CEST 2021
Tak jsem to trosku prepsal, takhle to na osciloskopu trva 180us a s AD
prevodem necelych 300us. Velke rezervy tam nejsou.
Mimochodem, da se v arduinu nejak jednoduse pouzit ADC asynchronne? Ze
spustim prevod a az je dokoncen, zpracuju, mezitim delam neco jineho... ?
Seriak funguje tusim zasadne synchronne?
int16_t CDataProc::GetSignal()
{
uint32_t ms = millis();
if (ms - lastMillis > 0)
{
uint16_t sensorValue = (uint16_t)analogRead(A0);
digitalWrite(13, HIGH);
cycles++;
if (firstPass){
valAvgFilt = ((uint64_t)sensorValue << 24) | 0x7fffffUL;
valSignalFilt = ((uint32_t)sensorValue << 8) | 0x7f;
firstPass = false;
}
else
{
while (ms - lastMillis > 0)
{
lastMillis++;
valAvgFilt = (valAvgFilt*(coefAvg-1) +
(((uint64_t)sensorValue << 24) | 0x7fffffUL))/coefAvg;
valSignalFilt = (valSignalFilt*(coefSignal-1) +
(((uint32_t)sensorValue << 8) | 0x7f))/coefSignal;
}
}
Message();
digitalWrite(13, LOW);
}
return (int16_t(valSignalFilt >> 8)) - (int16_t(valAvgFilt >> 24));
}
Dne 13.04.2021 v 20:33 Jaroslav Buchta napsal(a):
> Diky za tip s tim casovacem, necekal jsem, ze se da spatne udelat i
> 1ms timer ;-)
> Vypocty to stiha, predtim to bylo jen 32b a chodilo to stejne, kdyz to
> rozsirim na cely program, ktery toho pocita 10x tolik tak se taky nic
> nezmeni. Az budu mit cas, pro zajimavost si udelam pulzy na nejakem IO
> a zmerim, jak to dlouho trva.
>
> Dne 13.04.2021 v 20:28 Martin Locker napsal(a):
>> Ještě teď koukám, že ty výpočty nejsou zcela triviální. Ono násobení
>> a dělení 64-bitových čísel na osmibitu při 16MHz bude chvíli trvat.
>> Nejsem si jist, že se to za 1ms stihne (bude to asi dost na hraně,
>> chtělo by to změřit).
>>
>> S přáním pevného zdraví
>> Martin Locker
>>
>> ----- Původní zpráva -----
>> Odesilatel: Jaroslav Buchta (jaroslav.buchta na hascomp.cz)
>> Datum: 13/04/2021 20:06
>> Příjemce: HW-news (hw-list na list.hw.cz)
>> Předmět: AVR arduino potize
>>
>> Snazim se pomoct se zpracovanim signalu, vzorkovani po 1ms a zda se, ze
>> neco se v knihovnach seka (tipuju obsluhu serv) a za 100ms mi to vynecha
>> tak 2-3 cykly, za sekundu asi 25 takže je to asi celkem rovnoměrné.
>>
>> Dá se nějak pověsit na ISR 1ms od timeru 0? Podle zdrojaku to na nejakou
>> možnost callback fce nevypada (timer1 je použit pro serva)
>>
>> Neřešim zatim teda, jestli to nevynechava i ta přerušeni. Jako
>> doporučuju synovi hodit ten AVR drek po psovi ale zatim rychlou nahradu
>> nemame ;-)
>>
>> Zkousel jsem Nucleo303RE, to funguje i jako arduino hezky ale je to
>> velke. Neco velikosti Arduino Nano s normalnim 32b procesorem neni?
>> (nasel uz nejakou exotiku CM4 ale maji to jen na mouseru a moc se mi to
>> nelibi, odkaz ted nemam)
>>
>> Jo, a jeste to vynechava znaky vysilane na serial, zcela nahodne, nekdy
>> to jede pul minuty bez vypadku, nekdy vypadne znak po par sekundach,
>> nejaky znamy problem? Terminalem to neni, zkousel jsem ruzne ktere mi
>> normalne fungujou na 115200
>>
>> Ono to teda nejak funguje jak jsem to zkorigoval, ale se.e me to...
>>
>> V loop se volaji v redukovane verzi jen tyto metody
>>
>> #define MSGPERIOD 1000
>> void CDataProc::Message()
>> {
>> uint32_t ms = millis();
>> if (ms - msgMillis < MSGPERIOD)
>> {
>> return;
>> }
>> msgMillis += MSGPERIOD;
>> char s[40];
>> sprintf (s, "%10lu, %4u, %5u, %5u", msgMillis, cycles,
>> (uint16_t)(valSignalFilt >> 8), (uint16_t)(valAvgFilt >> 24));
>> Serial.println(s);
>> cycles=0;
>> }
>>
>> uint16_t CDataProc::GetSignal()
>> {
>> uint16_t sensorValue = (uint16_t)analogRead(A0);
>>
>> if (firstPass){
>> valAvgFilt = ((uint64_t)sensorValue << 24) | 0x7fffffUL;
>> valSignalFilt = ((uint32_t)sensorValue << 8) | 0x7f;
>> firstPass = false;
>> }
>> else
>> {
>> uint32_t ms = millis();
>> if (ms - lastMillis > 0)
>> {
>> cycles++;
>> }
>> while (ms - lastMillis > 0)
>> {
>> lastMillis++;
>> valAvgFilt = (valAvgFilt*(coefAvg-1) +
>> (((uint64_t)sensorValue << 24) | 0x7fffffUL))/coefAvg;
>> valSignalFilt = (valSignalFilt*(coefSignal-1) +
>> (((uint32_t)sensorValue << 8) | 0x7f))/coefSignal;
>> }
>> }
>> Message();
>> return (int16_t(valSignalFilt >> 8)) - (int16_t(valAvgFilt >> 24));
>> }
>>
>> Vypis vypada takto napr.
>>
>> 53000, 976, 741, 741
>> 54000, 977, 741, 741
>> 55000, 976, 741, 74 //vypadek
>> 56000, 977, 741, 741
>> 57000, 977, 741, 741
>>
>>
>> 188000, 976, 741, 741
>> 189000, 977, 741, 741
>> 190000, 976, 741, 741
>> 191000, 977, 41, 741 //vypadek
>> 192000, 976, 741, 741
>> 193000, 977, 741, 741
>> 194000, 977, 741, 741
>> 15000, 976, 741, 741 //vypadek
>> 196000, 977, 741, 741
>> 197000, 976, 741, 741
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list