Hallo allemaal,

ik ben op zoek naar een manier om met een pic16F877 goniometrische berekeningen uit te voeren (sinus berekenen van bepaald getal) en ook vermenigvuldigen en delen.

bestaat er een chip die dat rekenwerk voor zijn rekenwerk kan nemen?
hoe moet die dan geinterfaced worden? (i2c, enz)

bij voorbaat dank

Met PICBASICPRO kun je met alle bestaande picchips rekenen.Sinus vermenigvuldigen delen enz. En i2c bestaat ook tot de mogelijkheden.
Zoek maar eens (www.melabs.com)

Zelf algoritmes programmeren of een look-up tabel vullen.

Op 6 september 2004 20:47:25 schreef wipi:
look-up tabel vullen.

met goniometrische functies ? kuch ?

Welke eisen stelt de TS aan de resolutie ?
enzovoort...

Look up table is altijd prima idee, als je functie vast is, en je ingangs variable niet te groot ( bijvoorbeeld 8 bits ), op je PCtje bereken je alle uitgangswaardes voor alle ingangswaardes, en klaar is kees.

Ik heb ooit zoiets geschreven om de cosinus uit te rekenen in ASM zal ik hem ff emailen

Misschien is het een idee om te weten hoe de sinus en cosinus functie tot stand komen.
Maak van beide maar eens een grafiek.
Nu wil het dus dat de sinus functie eigenlijk een optelsom
is van een power serie om precies te zijn een Maclaurin serie, welke makkelijk valt te programmeren!

Geen idee of je Analyse hebt gehad, maar dit is de sinus in serie vorm:

sin(x) = sum(n=0 to n=infinity) (-1)^n * (x^(2n+1))/((2n+1)!) voor elke mogelijke x.

dus:

sin(x) = x - x^3/(3!) + x^5/(5!) - x^7/(7!) + ... enz.

hoe meer termen, hoe preciezer je antwoord.
voor de cosinus is het de afgeleide.

Als je de gehele details wilt hebben moet je het me gewoon even laten weten.

Een iteratief proces dus.
Dat is voor de meeste functies wel te vinden.
Ook voor exponentiële, logaritmische enz...

zoals al gezegd:
PIClist en een reeksontwikkeling

http://www.dattalo.com/technical/software/pic/picsine.html

als je wat zoekt kan je uit dit programma zeker het stuk filteren dat de sinusfunctie bevat

Op 8 september 2004 17:01:25 schreef twildeman:Nu wil het dus dat de sinus functie eigenlijk een optelsom
is van een power serie om precies te zijn een Maclaurin serie, welke makkelijk valt te programmeren!

Als je dit in een uC wilt zetten, zul je dit niet willen doen met reeksen. Nou valt het voor sin en cos nog wel mee, maar een aantal reeksen convergeert maar erg langzaam naar de uitkomst, soms ook nog eens afhankelijk van de waarde van de gegeven input.

Babbage had daar in zijn tijd overigens ook al last van :)

Ten tweede wil je ingewikkelde functies als exponent, faculteit en in mindere mate ook delingen en vermenigvuldigingen bij een uC vermijden.

In de jaren '50 hebben ze daarom speciaal voor de computer wat uitgevonden. Het heet CORDIC en is speciaal bedoeld voor simpele processors en plaatsen waar weinig geheugen beschikbaar is. Als je een floating point processor tot je beschikking hebt is het dus niet de meest optimale oplossing, maar in alle andere gevallen wel (bijv. wordt het ook (nog steeds) gebruikt in rekenmachines). In piclist.com zullen een aantal functies het ook wel gebruiken.

Voordelen zijn o.a. dat het simpel is (alleen lookup, optellen, aftrekken, bitschuiven en testen op kleiner dan nul), betrouwbaar (1 bit convergentie per iteratie) en steeds hetzelfde (de uitkomst wordt bijna alleen bepaald door hoe de beginwaarden worden aangeboden, dwz het programma is voor alle functies nagenoeg identiek).

Ik kan een voorbeeld geven van het principe als je wilt. In google kun je ook veel vinden.

Ik kan een voorbeeld geven van het principe als je wilt. In google kun je ook veel vinden.

graag

Op 8 september 2004 20:53:29 schreef ikkedus:
Als je dit in een uC wilt zetten, zul je dit niet willen doen met reeksen. Nou valt het voor sin en cos nog wel mee, maar een aantal reeksen convergeert maar erg langzaam naar de uitkomst

De meeste functies bestaan uit reeksen die zowel traag als snel convergeren.
Je moet gewoon de juiste zien te vinden.
Je kunt de nauwkeurigheid bepalen door het aantal iteraties in te voeren i.f.v. de gewenste nauwkeurigheid.

Reeksen met termen met een faculteit in de noemer zullen over het algemeen sneller convergeren.

[Bericht gewijzigd door Wim P. op ]

Op 8 september 2004 20:58:24 schreef Wim P.:
De meeste functies bestaan uit reeksen die zowel traag als snel convergeren.
Je moet gewoon de juiste zien te vinden.
Je kunt de nauwkeurigheid bepalen door het aantal iteraties in te voeren i.f.v. de gewenste nauwkeurigheid.

Reeksen met termen met een faculteit in de noemer zullen over het algemeen sneller convergeren.

Dat is dus nogal vervelend als je dat voor elke functie moet bijhouden. Verder zal de snelheid ook nog eens van de beginwaarde afhangen, kijk bijv naar de ontwikkeling van de ln functie die babbage gebruikt.

@hansmbakker

Als je even hebt komt het er zo aan.

Wil je de functie of niet, daar gaat het om ?
Niets gaat vanzelf, je zal keuzes moeten maken.

@hansmbakker

Dit is het principe. Het is VB, als je het toevallig op je PC hebt staan kun je het uitproberen.

Het lijkt veel, maar het gaat feitelijk om het kleine stukje in blauw (daar wordt de berekening uitgevoerd).

Je moet alleen wel weten hoe je bijv. 16 bits of 32 bits getallen met teken moet optellen, aftrekken en bitshiften met een uC (tenzij 8 bit resolutie voldoende is). Fixed point, indien nodig, is niet al te moeilijk, aangezien de uitkomst altijd tussen 0 en 1 ligt.

Klik hier (Word document).

Hier nog een dump van de functies (sin boven en cos beneden). In lichtgrijs de 'echte' functies en in rood de CORDIC functies. De CORDIC uitkomst wijkt af buiten de grenzen van plus of min pi/2 omdat in de tabel de som van alle hoeken niet veel groter is dan die waarde. Vandaar dat je de inputwaarde moet terugschalen als die daarbuiten ligt.

http://home.wanadoo.nl/sepeezebinkhorst/misc/simpel%20demo%20003%20limits%20-%20mini.png

De grap is dat je met twee extra tabellen bijna alles kunt berekenen, ln, log, exp, wortel, arcsin, etc. Zelf 'simpele' functies als vermenigvuldigen en delen. Alleen wordt daar werken met fixed point iets lastiger, omdat de uitkomst niet precies binnen een bekend gebied ligt en je dan dus moet gaan schalen.

mm, je moet er altijd een injectieve vergelijking van maken van je sin en cos enzo anders heb je natuurlijk infinity oplossingen

is de cos trouwens niet van 0 tot pi ?!
aangezien de cos(-x) = cos(x)

Bonus, als je het blauwe stukje vervangt door dit hieronder krijg je ArcTan :)


  Xt = a '-- Let op dat a > 0, als a = 1, dan uitkomst is ArcTan(b), anders ArcTan(b/a)
  Yt = b
  Zt = 0

  For n = 0 To BITS_PRECISION
  
    Xnt = (Xt / (2 ^ n)) '-- Xt >> n
    Ynt = (Yt / (2 ^ n)) '-- Yt >> n
    
    If Yt < 0 Then
      Xt = Xt - Ynt
      Yt = Yt + Xnt
      Zt = Zt - tc(n)
    Else
      Xt = Xt + Ynt
      Yt = Yt - Xnt
      Zt = Zt + tc(n)
    End If
  
  Next n  

  '-- ArcTan(b/a) zit nu in Zt

Let op dat a > 0, verder gelden geen voorwaarden zoals bij sin en cos (dus input mag -oneindig tot +oneindig).

Op 8 september 2004 23:01:00 schreef Evil Aedolon:
mm, je moet er altijd een injectieve vergelijking van maken van je sin en cos enzo anders heb je natuurlijk infinity oplossingen

is de cos trouwens niet van 0 tot pi ?!
aangezien de cos(-x) = cos(x)

Voor simpel sin en cos niet hoor. De sin van 1 miljoen pi heeft maar gewoon 1 oplossing. En de cos van pi plus een beetje bestaat ook.

Het is idd wel zo dat als je vraagt wanneer is sin(x) gelijk aan 0.12345, dat er dan meerdere oplossingen voor x zijn.

Op 8 september 2004 23:22:27 schreef ikkedus:
Het is idd wel zo dat als je vraagt wanneer is sin(x) gelijk aan 0.12345, dat er dan meerdere oplossingen voor x zijn.

Ja ik heb me slecht verwoord, dat bedoel ik dus en dan moet je de functie begrenzen op -pi/2 en pi/2 wat jij schijnbaar gedaan hebt

offtopic: vandaag nog bgtg x + bgcotg x = pi/2 bewezen om de mogelijk te hebben om bgcotg met de rekenmachine te berekenen, grappig bewijs :) (nee eerder mooi vanwege de infinity die erin zit)