Smazat příspěvek

 Chystáte se smazat zprávu (se všemi případnými odpověďmi) z kategorie Hlavní diskuze:


16.10.2019 (21:00:21)
stepan:
čau opět se obracím pro radu PIC16F628A (zkoušeno i několik různých druhů) má za úkol měřit frekvenci od 0 - 250HZ s rozlišením 1HZ a poměrně rychle, má to být pro mechanický otáčkoměr. otáčkoměr je řízen jiným PICem do kterýho posílám data po paralelní sběrnici ale to není tolik důležité, hlavní problém je ten, abych dosáhl potřebné rychlosti měřím stylem že při náběžné hraně vyčtu běžící TIMER1 16bit a následně konstantu 800000 dělím hodnotou z téhož timeru což mi dá potřebný hodnoty 0-255 pro 8 bit. sběrnici, není to nejelegantnějsí ba dokonce mi to přijde jako dobytčárna, ale do 200 HZ to funguje obstojně, problém nastane nad tuto hodnotu kdy mi to nahodile nejspíš přetejká což vyústí že ručička s sebou švihne k nule a netuším jak s tím hnout dál zde výpis z programu https://www.dropbox.com/scl/fi/qf5q6v4ux7ksv1olsybot/Un...
17.10.2019 (01:18:08)
VroutekB:
Proto se taky otáčky neměří jako frekvence nebo perioda jakéhosi signálu. Proto zkušenější konstruktér na daný senzor úhlu použije observer (PLL smyčku, tj PI regulátor a integrátor), který nejen že bude fungovat v podstatně větším rozsahu otáček, ale zároveň bude podávat již filtrovanou rychlost, odpovídající nastavení dynamického chování systému.
Jednoduše řečeno: Pulzy z otáčkového čidla počítáš čítačem (integruješ nakroucený úhel) a v pravidelných intervalech počítáš tu PLL smyčku, tedy PI regulátorem se snažíš odhadnout takovou rychlost, aby po její integraci si dostal stejný nasčítaný úhel, jako od senzoru. (chybová veličina pro PI regulátor je tedy rozdíl odvinutého úhlu hřídele, výstupem PI regulátoru je rychlost a za integrací opět úhel).
Tohle musí upočítat i ten pic nejmíň 10x za sekundu, i kdyby to měl snad dělat ve floutu softwarovo.
17.10.2019 (10:05:48)
milan obalka :
Problém bude dělení. udělej to s násobením. využij bitového posunu. na osmibitech se vyhýbej dělení proměnnou. kdyžtakt děl bitovým posunem a to jen ve stylu dělení dvěma, čtyřma... ne dělení n.
Já to řešil u čidla, které mělo jeden impulz na otáčku a chodilo mi to dobře, poté, co jsem začal násobit
17.10.2019 (19:18:20)
stepan:
Tak princip PLL smyčky jsem tak nějak pochopil,ale jak to implementovat do mého problémů netuším a google mi taky moc neumí pomoci, to že bude problém s dělením trochu tuším problém je že nevím jak to udělat jinak, jelikož proměnná není dělitel, ale dělenec. jinak bych nejspíš použil ten bitový posun
17.10.2019 (22:01:20)
stepan:
tak jsem to nakonec vyřešil pomocí dělění do jedný proměnný float a voala funguje tak jak bych si představoval no profesionální programátor ze mě asi nebude ale ten fázový závěs mi přijde docela zajímavej a nejspíš se s ním naučím pracovat v budoucích projektech kde bude na experimentování víc času. tímto vám děkuji za pomoc

(float) time = TIMER1/125;
(int) freq = 10000/time;

**01
24.10.2019 (12:26:17)
milan obalka :
pro korektnost bys měl teda když už tak přetypovat pro výpočet hodnotu timeru na float, dělit to 125,0 aby to byl float a pak výslednou frekvenci opět přetypovat. jestli ji chceš v INTu.
jinak dá se ten tvuj dvouřádkovej počet, když stejně tam máš float, hodit do jednoho 1 250 000/timer1
A to to rovnou mužeš zapsat takto:
uint32 freq = (uint32)1250000 / (uint32)TIMER1;
Tak a ted se zamyslet a vyřešit, když ti z nějakého důvodu vyjde dělení nulou nebo větším číslem . takže if (timer1 != 0 || timer1 > 1250000)
Jo a nepotřebuješ float. bude to celočíselné dělení a celkem i rychlé. Nevim jak PIC, ale atmega při zapnutí floatu je líná.
24.10.2019 (14:47:15)
RayeR (web) :
Jj, na tohle staci bohate fixed point aritmetika, floaty na 8bitu sou hrozne pomaly a kod to zvetsi o nekolik kB kvuli tem rutinam pro praci s floaty. Zatim sem float nepouzil nikdy nikde na MCU, ani na ARMu...
27.10.2019 (11:16:48)
VroutekB:
Tak to ja na ARMu jedu float kudy to da (pokud to samozrejme neni vylozene zbytecne). Mame dokonce z prace zaznamenane situace kdy pres FPU slo cosi spocitat tak o pulku rychleji, nez ve fractional.
Predpoklad je mit ARM s FPU samozrejme.
FPU koprocesor ma totiz vyhodu ze ma podstatne vic registru, nez jadro a nektere vypocty to dovede drasticky urychlit, neb se daji lepe vyoptimalizovat. (FFT?)
IIR filtry jsou treba ochotnejsi ve floatu,nehrozi toliko numericka nestabilita. (Ale je treba davat pozor na denormal cisla, na ARMu je sice konfigurovatelne flush-to-zero ale jine krumply jako treba PC s tim maji ohromny problem.)
29.10.2019 (14:40:21)
RayeR (web) :
Tak jasny, zalezi na aplikaci, kdyz delas naky filtre a spoustu matematiky, tak samozrejme sahnes po odpovidajicne vybavenym MCU. Ja zas treba na naky prehazovani CAN paketu vidlema toho moc pocitat nepotrebuju, max. z raw hodnoty treba prepocist na procenta s 1 desetinnym mistem a na to float opravdu nepotrebuju...
6.11.2019 (13:21:28)
RayeR (web) :
Sakra, koukam ze existuje novejsi datasheet k Atmega328P, kde jsou nova errata novich revizi - tak to dobre posrali....

Errata ATmega328P
The revision letter in this section refers to the revision of the ATmega328P device.
40.8.1 Rev K
[B]• Full swing crystal oscillator not supported[/B]
• Parallel programming timing modified
• Write wait delay for NVM is increased
• Changed device ID
• Analog MUX can be turned off when setting ACME bit
• TWI Data setup time can be too short
1. Full swing crystal oscillator not supported
The full swing crystal oscillator functionality is not available in revision K.
Problem fix/workaround
Use alternative clock sources available in the device.


Přezdívka:*
Heslo:*

█ █   █ █   ███   
█ █   █ █     █   
███   ███   ███   
  █     █   █     
  █     █   ███   
Opiš:*

Zde můžete smazat vlastní vlákno nebo kteroukoliv odpověď v něm. Můžete smazat vlastní odpověď v cizím vlákně, pokud na ni ještě nikdo jiný nereagoval. Mazat cizí vlákna a odpovědi v nich mohou pouze admini. Smazání příspěvku je nevratná operace! Smazáním vzkazu se smažou i odpovědi na něj.
Seznam uživatelů
Zpět na knihu