Korte delay loop gezocht

Arco

Special Member

Is het nog steeds zo dat PICs 4 klok cycli nodig hebben voor een instructie?

Alleen bij de 8 bitters... ;)
(maar die zijn er ook in 64MHz, dus veel last heb je daar niet van)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik wil op verschillende uitgangen 3, 5, 7 en 11 KHz laten komen.
Deze worden gebruikt om harmonischen van 1 KHZ te onderdrukken tot
een niveau van 90 tot 100 dB. Ik heb dit al gedaan voor 3e en 5e harmonischen
met een 12MHz PIC clock ( 0.3333333 us )
Toen ik 7 kHz invoegde zag ik meteen problemen.
Deze kwamen uit de onnauwkeurigheid van de 7 kHz generatie op een .33333 instructie tijd.
Omdat de nauwkeurigheid ZO HOOG moet zijn kwam ik tot de 18.48 MHz clock.
Met de 18.48 MHz kost het 231 instructies om een exact delay van 50 us temaken. 231 = 3 x 7 x 11.
Dus ik kan alleen maar werken met delays waarmee ik de poorten sequentieel kan aanzetten.

Guus@Sint-Michielsgestel
Arco

Special Member

Kun je voor onderdrukken van harmonischen niet beter een goed filter gebruiken???
Als het blokgolven moeten zijn, kun je de PWM toch gebruiken? En wat noem je (on)nauwkeurig? (hoe precies moet 't zijn?)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Wat helpt het genereren van een signaal op 7kHz bij het onderdrukken van harmonischen van 1kHz? Dat snap ik niet.

Als je gaat busy-waiten, dan is het lastig om diverse signalen tegelijk te produceren. Je kan de least-common-multiple van deze getallen nemen (en omdat het priemgetallen zijn is dat gewoon vermenigvuldigen) en dan een programma maken wat 1155 cylci lang is. 105x moet je dan het 11khZ signaal togglen, 165x het 7khz signaal enz.

Ik schreef even:

c code:

#include <stdio.h>
#include <stdlib.h>


int main (int argc, char **argv)
{
  int freqs[10];
  int nfreqs;
  int i,j, s;
  int n;
  int *instr;

  freqs[0] = 3;
  freqs[1] = 5;
  freqs[2] = 7;
  freqs[3] = 11;
  nfreqs = 4;

  for (i=0, n=1;i<nfreqs;i++)
     n *= freqs[i];

  instr = calloc (sizeof (int), n);

  for (i=0;i<nfreqs;i++) {
    s = n/freqs[i];
    for (j=i;j<n;j+=s)
       instr[j] = freqs[i];
  }
  for (i=0;i<n;i++)
    printf ("%d: %d\n", i, instr[i]);
  exit (0);
}

waarbij het "begin bij i" bedoeld is om te zorgen dat ze mekaar niet tegenkomen. Dat werkt. Als je dan in deze uitvoer een "0" ziet staan moet je dat vertalen naar een "nop". Staat er een "3" dan moet je "toggle output voor 3khz" doen. enz. Op het eind moet je de laatste zoveel nops vervangen door een jump naar het begin. (afhankelijk van hoeveel nops aan tijd je jump gebruikt).

Ik ken geen pic-assembly of basic, dus ik kan dat even niet voor je doen.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Het mooie van dit systeem is dat je de harmonischen met 100 dB kunt onderdrukken.
Voor de niet analoge mensen dit is een factor 100.000 dus niet even met PWM op telossen
Een filter kan dit ook en dat heb ik ook nog wel nodig maar dan een 3pole,
ipv een 9 tot 12 filter met veel componenten

Guus@Sint-Michielsgestel
Arco

Special Member

Een 6 pole filter geeft op 7kHz al een 'afval' van ruim 100dB
Met het combineren van diverse signalen als 'anti-sound' loop je zeer grote kans dat het alleen maar erger wordt als alles niet exact klopt.
Wat is dat 1kHz signaal trouwens? (blokgolf of wat anders, pwm, D/A,...)

Men heeft dat in het verleden ook met uitlaatgeluid geprobeerd, is nooit een doorslaand succes geworden... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com